from exchangelib import OAUTH2, Configuration, Account, DELEGATE, OAuth2Credentials, Identity import vcard def normalize_name(full_name): return full_name.replace('/', '-').replace('\\', '-')[:40] def normalize_phone_number(phone_number: str): if phone_number.startswith('0'): phone_number = '+49 ' + phone_number[1:] for c in '()/?': phone_number = phone_number.replace(c, '') return phone_number.replace(' -', '-').replace('- ', '-').replace(' ', ' ') def login(email=None) -> Account: credentials = OAuth2Credentials( client_id='925f74dc-f96a-4718-9ca7-d6cc3fa43e1e', client_secret='SS~8Q~QpBZV9toZuwkzW1XGGen2Hn833spNMtdq5', tenant_id='2ad0dff5-07ce-4cc2-a852-99ce8b91c218', identity=Identity(primary_smtp_address='bedner@global-cube.de'), ) # credentials = Credentials(username='bedner@global-cube.de', password='platinum512#') config = Configuration( server='outlook.office365.com', credentials=credentials, auth_type=OAUTH2 ) if not email: email = 'adressbuch@global-cube.net' account = Account( primary_smtp_address=email, config=config, autodiscover=False, access_type=DELEGATE ) return account def export_contact_list(account: Account): # folder = account.root / 'AllContacts' phone_types = { 'BusinessPhone': 'gesch.', 'MobilePhone': 'Mobil', 'OtherFax': 'Andere', 'HomePhone': 'privat', 'CarPhone': 'Andere2', 'OtherTelephone': 'Andere3', 'Pager': 'Pager' } contact_list = [] # organizations = vcard.get_orgs() organizations = {} for p in account.contacts.all(): # print(p.display_name) p_name = p.display_name if p.company_name: p_name = p.display_name + ' - ' + p.company_name elif p_name in organizations: p.company_name = organizations[p_name][0] p_name = p.display_name + ' - ' + p.company_name p.save(update_fields=['company_name']) p_name = normalize_name(p_name) for entry in p.phone_numbers[:2]: if entry.phone_number: phone = normalize_phone_number(entry.phone_number) contact_list.append(p_name + ' (' + phone_types.get(entry.label, '') + ');' + phone) # print(phone_types) block_size = 997 blocks = (len(contact_list) // block_size) + 1 for b in range(blocks): with open(f'contacts/export/kontakte_{b}.csv', 'w', encoding='utf-8') as fwh: fwh.write('generiert mit Templateversion:;v16.1.00\n') fwh.write('Voll-Lieferung\n') fwh.write('Nr.;Name;Rufnummer\n') for i, c in enumerate(contact_list[block_size * b:block_size * (b + 1)], 1): fwh.write(str(block_size * b + i) + ';' + c + '\n') print('--') def main(): account = login() # export_contact_list(account) for p in account.contacts.all()[0:1]: print(p) account2 = login('m.geiss@global-cube.de') for p in account2.contacts.all()[0:1]: print(p) # for f in account.root.children.folders: # print(f.name) # gal = account.contacts / 'GAL Contacts' # for p in account.protocol.resolve_names()[:10]: # print(p.display_name) # print(account.root.tree()) if __name__ == '__main__': main()