#!/usr/bin/env python # -*- coding: UTF-8 # # Copyright (c) 2009 Steinle Solution-Factory GmbH. All rights reserved. # # Abstract # ~~~~~~~~ # Converts an LDIF file to a series of VCARD files (Kerio 6.6.x compatible) # see http://support.kerio.com/index.php?_m=knowledgebase&_a=viewarticle&kbarticleid=84&nav=0,1 # (rename index.fld to index.bad) # # Authors # ~~~~~~~ # Benjamin Schweizer # # Changes # ~~~~~~~ # 2009-03-19, benjamin: initial release # # Todo # ~~~~ # - the schema->vcard mapping is incomplete; fixme # import sys import ldif def usage(): print """ usage: ldif2vcard description: converts entries from source.ldif to a series of vcard files compatible with Kerio Mailserver 6.6.x """ def mkvcard(entry): assert('dn' in entry) assert('cn' in entry) if not 'mail' in entry: entry['mail'] = [''] if not 'postalAddress' in entry: entry['postalAddress'] = [''] if not 'telephoneNumber' in entry: entry['telephoneNumber'] = [''] # if not 'facsimileTelephoneNumber' in entry: entry['facsimileTelephoneNumber'] = [''] result = "" result += "Subject: %s\n" % entry['cn'][0] result += "Date: Thu, 19 Mar 2009 13:20:57 +0100\n" result += "Content-Type: text/vcard; charset=\"utf-8\"\n" result += "Content-Transfer-Encoding: 8bit\n" result += "\n" result += "BEGIN:VCARD\n" result += "VERSION:3.0\n" result += "PRODID:-//benjamin-schweizer.de/files/tinyparsers//2009-03-19//EN\n" # result += "N:Nachname;Vorname;Mittelname;Titel;Titel2\n" result += "FN:%s\n" % entry['cn'][0] result += "X-FILE-AS:%s\n" % entry['cn'][0] result += "CATEGORIES:ldif\n" result += "CLASS:PUBLIC\n" # result += "NICKNAME:Spitzname\n" # result += "URL;TYPE=WORK:Web-Geschäft\n" # result += "FBURL:Internet-Adresse\n" # result += "CALURI:URI-Kalender\n" # result += "ORG:Firma;Abteilung\n" # result += "ADR;TYPE=WORK,PREF:;Geschäftlich;Straße;Stadt;Bundesland;PLZ;Land\n" # result += "TITLE:Funktion\n" result += "NOTE:%s\n" % entry['postalAddress'][0] # result += "ICQ:Instant-Messenger\n" # result += "X-MANAGER:Vorgesetzter\n" # result += "X-ASSISTANT:Assistent\n" # result += "TEL;TYPE=X-ASSISTANT:Assistent\n" result += "TEL;TYPE=VOICE,WORK:%s\n" % entry['telephoneNumber'][0] # result += "TEL;TYPE=VOICE,HOME:Tel-Privat\n" % entry['facsimileTelephoneNumber'][0] # result += "TEL;TYPE=CELL:Mobil-Tel\n" result += "EMAIL;TYPE=PREF,HOME:%s\n" % entry['mail'][0] result += "END:VCARD\n" return result if __name__=='__main__': if len(sys.argv) != 2: usage() sys.exit() ldif_filename = sys.argv[1] ldifparser = ldif.parser(open(ldif_filename, 'r'), encoding="utf-8") record = ldifparser.next() i = 0 while record: vcard_filename = "%08x.eml" % i print "dn: %s -> %s" % (record['dn'][0], vcard_filename) try: fh = open(vcard_filename, 'wb') fh.write(mkvcard(record).encode('utf-8')) fh.close() except: print "creating vcard failed" print "entry = %s" % record print "---" raise i += 1 record = ldifparser.next() print "end of file" # eof.