Last active
September 15, 2015 10:10
-
-
Save pbruna/094fe964ab41d6e12e83 to your computer and use it in GitHub Desktop.
Script to migrate contacts from Afterlogic Webmail-client to Zimbra
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env ruby | |
require 'active_record' | |
require 'csv' | |
require 'mysql2' | |
# Script to migrate contacts from http://www.afterlogic.com/webmail-client to Zimbra CS | |
# using only de database information | |
# the result for every account will be a CSV file under "OUT_DIRECTORY" like: | |
# result/user@domain.com.csv | |
#### Config | |
OUT_DIRECTORY = "result" | |
SELECT_FIELDS = [:fullname, :h_email, :h_phone, :h_mobile] | |
### FUCK Zimbra IMPORT NAMES | |
ZIMBRA_COLUMNS_NAMES = ["Title","First Name","Middle Name","Last Name","Suffix","Name","Company","Department","Job Title","Business Address","Business Street","Business City","Business State","Business Postal Code","Business Country","Home Address","Home Street","Home City","Home State","Home Postal Code","Home Country","Other Street","Other City","Other State","Other Postal Code","Other Country","Assistant's Phone","Business Fax","Business Phone","Business Phone 2","Callback","Car Phone","Company Main Phone","Home Fax","Home Phone","Home Phone 2","ISDN","Mobile Phone","Other Fax","Other Phone","Pager","Primary Phone","Radio Phone","TTY/TDD Phone","Telex","Account","Anniversary","Assistant's Name","Billing Information","Birthday","Business Address PO Box","Categories","Children","Directory Server","E-mail Address","E-mail Type","E-mail Display Name","E-mail 2 Address","E-mail 2 Type","E-mail 2 Display Name","E-mail 3 Address","E-mail 3 Type","E-mail 3 Display Name","Gender","Government ID Number","Hobby","Home Address PO Box","Initials","Internet Free Busy","Keywords","Language","Location","Manager's Name","Mileage","Notes","Office Location","Organizational ID Number","Other Address PO Box","Priority","Private","Profession","Referred By","Sensitivity","Spouse","User 1","User 2","User 3","User 4","Web Page"] | |
ActiveRecord::Base.establish_connection( | |
adapter: 'mysql2', # or 'postgresql' or 'sqlite3' | |
host: '127.0.0.1', | |
database: 'db_wmail', | |
username: 'root', | |
password: 'abcdef' | |
) | |
#### END Config | |
require 'active_record' | |
require 'mysql2' | |
require 'csv' | |
class User < ActiveRecord::Base | |
self.table_name = "awm_accounts" | |
self.primary_key = "id_user" | |
has_many :contacts, :foreign_key => 'id_user' | |
# We only need real users | |
scope :valid, ->() { where.not(email: "")} | |
def has_contacts? | |
contacts.valid.size > 0 | |
end | |
def build_contacts_array_for_zimbra | |
arry = [] | |
valid_contacts = contacts.valid.select SELECT_FIELDS | |
valid_contacts.each do |contact| | |
(name, lastname) = name_and_lastname(contact.fullname, contact.h_email) | |
tmp_arr = Array.new(88, '') | |
tmp_arr[1] = name | |
tmp_arr[3] = lastname | |
tmp_arr[28] = contact.h_phone | |
tmp_arr[37] = contact.h_mobile | |
tmp_arr[54] = contact.h_email | |
arry << tmp_arr | |
end | |
arry | |
end | |
def name_and_lastname(fullname, email) | |
ary = fullname.split(/\s+/) | |
return email.split(/@/) if ary.empty? | |
lastname = ary.size > 1 ? ary.pop : '' | |
name = ary.join(' ') | |
[name, lastname] | |
end | |
end | |
class Contact < ActiveRecord::Base | |
self.table_name = "awm_addr_book" | |
belongs_to :user | |
# Skip deleted or system contacs | |
scope :valid, ->() { where(deleted: 0, auto_create: 0)} | |
end | |
qty = User.valid.size | |
index = 0; | |
def write_csv(user, contacts) | |
CSV.open("#{OUT_DIRECTORY}/#{user.email}.csv", "wb") do |csv| | |
csv << ZIMBRA_COLUMNS_NAMES | |
contacts.each do |contact| | |
csv << contact | |
end | |
end | |
end | |
User.valid.each do |user| | |
index = index + 1 | |
puts "Procesando #{index} de #{qty}" | |
next unless user.has_contacts? | |
contacts = user.build_contacts_array_for_zimbra | |
write_csv(user, contacts) | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment