Kantorku lagi migrasi dari MS Exchange Server ke Zimbra, sebuah collaboration and messaging software dari Zimbra, Inc. Nah kebetulan email clientku menggunakan Mozilla Portable Thunderbird. Pas mau export address book thunderbird yang sudah aku export dalam bentuk CSV (Comma Separated Value), ternyata tidak compatible. Akhirnya aku coba buat sebuah address di ThunderBird dan Zimbra, masing-masing aku isi dengan keterangan nama fieldnya, barulah ketahuan mappingnya.
Dasar aku orangnya pemalas, aku nggak mau masukin satu-satu email dari ThunderBird ke Zimbra (cappppeeeeeeeee deeeech). Mau nggak mau ya click icon Borland Delphi 2006 dan membuat tool sederhana untuk convert.
Berikut ini source codenya. Barangkali ada yang mau menambahkan konversi dari Outlook CSV ke Zimbra atau dari mail client lainnya, silakan.
unit MainForm; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ComCtrls; type TformName = class(TForm) lblThunderbird: TLabel; edThunderbird: TEdit; sbOpenCSV: TSpeedButton; progressBar: TProgressBar; bbConvert: TBitBtn; SaveDialog: TSaveDialog; OpenDialog: TOpenDialog; procedure bbConvertClick(Sender: TObject); procedure sbOpenCSVClick(Sender: TObject); private { Private declarations } public { Public declarations } procedure Convert(thunderBirdFileName, zimbraFileName: String); end; const {Thunderbird's Constants} TB_FIRST_NAME = 0; TB_LAST_NAME = 1; TB_DISPLAY_NAME = 2; TB_NICK_NAME = 3; TB_EMAIL = 4; TB_ADDITIONAL_EMAIL = 5; TB_WORK_PHONE = 6; TB_HOME_PHONE = 7; TB_FAX_NUMBER = 8; TB_PAGER = 9; TB_MOBILE_PHONE = 10; TB_HOME_ADDRESS_LINE_1 = 11; TB_HOME_ADDRESS_LINE_2 = 12; TB_HOME_CITY = 13; TB_HOME_STATE = 14; TB_HOME_ZIP = 15; TB_HOME_COUNTRY = 16; TB_WORK_ADDRESS_LINE_1 = 17; TB_WORK_ADDRESS_LINE_2 = 18; TB_WORK_CITY = 19; TB_WORK_STATE = 20; TB_WORK_ZIP = 21; TB_WORK_COUNTRY = 22; TB_WORK_TITLE = 23; TB_WORK_DEPARTMENT = 24; TB_WORK_ORGANIZATION = 25; TB_WORK_WEBSITE = 26; TB_HOME_WEBSITE = 27; TB_UNKNOWN_1 = 28; TB_UNKNOWN_2 = 29; TB_UNKNOWN_3 = 30; TB_CUSTOM_1 = 31; TB_CUSTOM_2 = 32; TB_CUSTOM_3 = 33; TB_CUSTOM_4 = 34; TB_NOTES = 35; {Zimbra's Constants} ZB_ASSISTANT_PHONE = 0; ZB_BIRTHDAY = 1; ZB_CALLBACK_PHONE = 2; ZB_CAR_PHONE = 3; ZB_WORK_ORGANIZATION = 4; ZB_COMPANY_PHONE = 5; ZB_DESCRIPTION = 6; ZB_WORK_DEPARTMENT = 7; ZB_DLIST = 8; ZB_EMAIL = 9; ZB_EMAIL2 = 10; ZB_EMAIL3 = 11; ZB_FILE_AS = 12; ZB_FIRST_NAME = 13; ZB_FULL_NAME = 14; ZB_HOME_CITY = 15; ZB_HOME_COUNTRY = 16; ZB_HOME_FAX = 17; ZB_HOME_PHONE = 18; ZB_HOME_PHONE2 = 19; ZB_HOME_ZIP = 20; ZB_HOME_STATE = 21; ZB_HOME_STREET = 22; ZB_HOME_WEBSITE = 23; ZB_INITIALS = 24; ZB_WORK_TITLE = 25; ZB_LAST_NAME = 26; ZB_MIDDLE_NAME = 27; ZB_MOBILE_PHONE = 28; ZB_NAME_PREFIX = 29; ZB_NAME_SUFFIX = 30; ZB_NICK_NAME = 31; ZB_NOTES = 32; ZB_OFFICE = 33; ZB_OTHER_CITY = 34; ZB_OTHER_COUNTRY = 35; ZB_OTHER_FAX = 36; ZB_OTHER_PHONE = 37; ZB_OTHER_ZIP_CODE = 38; ZB_OTHER_STATE = 39; ZB_OTHER_STREET = 40; ZB_OTHER_WEBSITE = 41; ZB_PAGER = 42; ZB_WORK_CITY = 43; ZB_WORK_COUNTRY = 44; ZB_WORK_FAX = 45; ZB_WORK_PHONE = 46; ZB_WORK_PHONE2 = 47; ZB_WORK_ZIP = 48; ZB_WORK_STATE = 49; ZB_WORK_STREET = 50; ZB_WORK_WEBSITE = 51; ZB_TYPE = 52; var formName: TformName; implementation uses classStringSplitter, StrUtils; {$R *.dfm} procedure TformName.bbConvertClick(Sender: TObject); begin if FileExists(edThunderbird.Text) then begin if SaveDialog.Execute then begin Convert(edThunderbird.Text, SaveDialog.FileName); end; end else MessageDlg('The file you requested is not found or cannot be read. ' + 'Please try another file.', mtError, [mbOK], 0); end; procedure TformName.Convert(thunderBirdFileName, zimbraFileName: String); var list, fields, outputList: TStringList; i, j: integer; destination: array[ZB_ASSISTANT_PHONE..ZB_TYPE] ofString; row: String; begin list := TStringList.Create; list.LoadFromFile(thunderBirdFileName); progressBar.Position := 0; progressBar.Max := list.Count; fields := TStringList.Create; outputList := TStringList.Create; outputList.Add('"assistantPhone","birthday","callbackPhone","carPhone",' + '"company","companyPhone","description","department" ,"dlist","email",'+ '"email2","email3","fileAs","firstName","fullName","homeCity",'+ '"homeCountry","homeFax","homePhone","homePhone2","homePostalCode",'+ '"homeState","homeStreet","homeURL","initials","jobTitle","lastName",'+ '"middleName","mobilePhone","namePrefix","nameSuffix","nickname","notes",'+ '"office","otherCity","otherCountry","otherFax","otherPhone",'+ '"otherPostalCode","otherState","otherStreet","otherURL","pager",'+ '"workCity","workCountry","workFax","workPhone","workPhone2",'+ '"workPostalCode","workState","workStreet","workURL","type"'); i := 0; while i < list.Count do begin row := ''; TStringSplitter.split(list[i], ',', fields); destination[ZB_ASSISTANT_PHONE] := ''; destination[ZB_BIRTHDAY] := ''; destination[ZB_CALLBACK_PHONE] := ''; destination[ZB_CAR_PHONE] := ''; destination[ZB_WORK_ORGANIZATION] := fields[TB_WORK_ORGANIZATION]; destination[ZB_COMPANY_PHONE] := ''; destination[ZB_DESCRIPTION] := ''; destination[ZB_WORK_DEPARTMENT] := fields[TB_WORK_DEPARTMENT]; destination[ZB_DLIST] := ''; destination[ZB_EMAIL] := fields[TB_EMAIL]; destination[ZB_EMAIL2] := fields[TB_ADDITIONAL_EMAIL]; destination[ZB_EMAIL3] := ''; destination[ZB_FILE_AS] :=''; destination[ZB_FIRST_NAME] := fields[TB_FIRST_NAME]; destination[ZB_FULL_NAME] := fields[TB_FIRST_NAME] + ' ' + fields[TB_LAST_NAME]; destination[ZB_HOME_CITY] := fields[TB_HOME_CITY]; destination[ZB_HOME_COUNTRY] := fields[TB_HOME_COUNTRY]; destination[ZB_HOME_FAX] := ''; destination[ZB_HOME_PHONE] := fields[TB_HOME_PHONE]; destination[ZB_HOME_PHONE2] := ''; destination[ZB_HOME_ZIP] := fields[TB_HOME_ZIP]; destination[ZB_HOME_STATE] := fields[TB_HOME_STATE]; destination[ZB_HOME_STREET] := fields[TB_HOME_ADDRESS_LINE_1] + ' ' + fields[TB_HOME_ADDRESS_LINE_2]; destination[ZB_HOME_WEBSITE] := fields[TB_HOME_WEBSITE]; destination[ZB_INITIALS] := ''; destination[ZB_WORK_TITLE] := fields[TB_WORK_TITLE]; destination[ZB_LAST_NAME] := fields[TB_LAST_NAME]; destination[ZB_MIDDLE_NAME] := ''; destination[ZB_MOBILE_PHONE] := fields[TB_MOBILE_PHONE]; destination[ZB_NAME_PREFIX] := ''; destination[ZB_NAME_SUFFIX] := ''; destination[ZB_NICK_NAME] := fields[TB_NICK_NAME]; des tination[ZB_NOTES] := fields[TB_NOTES]; destination[ZB_OFFICE] := fields[TB_WORK_ORGANIZATION]; destination[ZB_OTHER_CITY] := ''; destination[ZB_OTHER_COUNTRY] := ''; destination[ZB_OTHER_FAX] := ''; destination[ZB_OTHER_PHONE] := ''; destination[ZB_OTHER_ZIP_CODE] := ''; destination[ZB_OTHER_STATE] := ''; destination[ZB_OTHER_STREET] := ''; destination[ZB_OTHER_WEBSITE] := ''; destination[ZB_PAGER] := fields[TB_PAGER]; destination[ZB_WORK_CITY] := fields[TB_WORK_CITY]; destination[ZB_WORK_COUNTRY] := fields[TB_WORK_COUNTRY]; destination[ZB_WORK_FAX] := fields[TB_FAX_NUMBER]; destination[ZB_WORK_PHONE] := fields[TB_WORK_PHONE]; destination[ZB_WORK_PHONE2] := ''; destination[ZB_WORK_ZIP] := fields[TB_WORK_ZIP]; destination[ZB_WORK_STATE] := fields[TB_WORK_STATE]; destination[ZB_WORK_STREET] := fields[TB_WORK_ADDRESS_LINE_1] + ' ' + fields[TB_WORK_ADDRESS_LINE_1]; destination[ZB_WORK_WEBSITE] := fields[TB_WORK_WEBSITE]; destination[ZB_TYPE] := ''; for j := ZB_ASSISTANT_PHONE to ZB_TYPE do begin row := row + '"' + destination[j] + '"'; if j <> ZB_TYPE then row := row + ','; end; outputList.Add(row); progressBar.StepBy(1); Inc(i); end; outputList.SaveToFile(zimbraFileName); outputList.Free; fields.Free; list.Free; end; procedure TformName.sbOpenCSVClick(Sender: TObject); begin if OpenDialog.Execute then begin edThunderbird.Text := OpenDialog.FileName; end; end; end. Kalau mau download aplikasi dan source codenya silakan klik di attachment. Kalau mau mengoreksi, mau menambahkan, please comment yaa..