Skip to content

Instantly share code, notes, and snippets.

@pbruna
Last active September 15, 2015 10:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pbruna/094fe964ab41d6e12e83 to your computer and use it in GitHub Desktop.
Save pbruna/094fe964ab41d6e12e83 to your computer and use it in GitHub Desktop.
Script to migrate contacts from Afterlogic Webmail-client to Zimbra
#!/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