from O365 import Account from O365.address_book import Contact client_id = '925f74dc-f96a-4718-9ca7-d6cc3fa43e1e' client_secret = 'SS~8Q~QpBZV9toZuwkzW1XGGen2Hn833spNMtdq5' account = Account( (client_id, client_secret), auth_flow_type='credentials', tenant_id='2ad0dff5-07ce-4cc2-a852-99ce8b91c218' ) mailboxes = [ 'bedner@global-cube.de', 'brandt@global-cube.de', # 'd.ankenbrand@global-cube.de', 'gawliczek@global-cube.de', 'm.geiss@global-cube.de', 'matarrelli@global-cube.de', 'winkler@global-cube.de', 'winter@global-cube.de' ] def copy_contact(p_from: Contact, p_to: Contact): p_to.display_name = p_from.display_name p_to.name = p_from.name p_to.surname = p_from.surname p_to.title = p_from.title p_to.job_title = p_from.job_title p_to.company_name = p_from.company_name p_to.department = p_from.department p_to.office_location = p_from.office_location p_to.business_phones = p_from.business_phones p_to.mobile_phone = p_from.mobile_phone p_to.home_phones = p_from.home_phones p_to.emails.clear() for rcp in p_from.emails: p_to.emails.add(rcp) p_to.business_address = p_from.business_address # p_to.home_address = p_from.home_address p_to.other_address = p_from.other_address p_to.categories = p_from.categories p_to.personal_notes = p_from.personal_notes p_to.save() def sync_contacts(): account.authenticate() shared = account.address_book(resource='adressbuch@global-cube.net', address_book='personal') shared_contacts = {p.display_name: p for p in shared.get_contacts(limit=None)} delete_candidates = set() for mailbox in mailboxes: print(mailbox) personal = account.address_book(resource=mailbox, address_book='personal') personal_contacts = {p.display_name: p for p in personal.get_contacts(limit=None)} extra_contacts = set(personal_contacts.keys()).difference(shared_contacts.keys()) print(extra_contacts) if len(delete_candidates) == 0: delete_candidates = extra_contacts else: delete_candidates = delete_candidates.intersection(extra_contacts) # p.delete() for p_shared in shared_contacts.values(): if p_shared.display_name not in personal_contacts: p_new = personal.new_contact() copy_contact(p_shared, p_new) else: p_existing = personal_contacts[p_shared.display_name] if p_existing.to_api_data() != p_shared.to_api_data(): copy_contact(p_shared, p_existing) return delete_candidates def delete_contacts(delete_candidates): account.authenticate() for mailbox in mailboxes: print(mailbox) personal = account.address_book(resource=mailbox, address_book='personal') personal_contacts = {p.display_name: p for p in personal.get_contacts(limit=None)} selected_contacts = set(delete_candidates).intersection(personal_contacts.keys()) print(selected_contacts) for c in selected_contacts: personal_contacts[c].delete() def normalize_phone_number(phone_number: str): if phone_number is None: return None 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 cleanup_contacts(): account.authenticate() shared = account.address_book(resource='adressbuch@global-cube.net', address_book='personal') for p in shared.get_contacts(limit=None): business = [normalize_phone_number(no) for no in p.business_phones] if p.business_phones != business: p.business_phones = business home = [normalize_phone_number(no) for no in p.home_phones] if p.home_phones != home: p.home_phones = home mobile = normalize_phone_number(p.mobile_phone) if p.mobile_phone != mobile: p.mobile_phone = mobile p.save() if __name__ == '__main__': contacts = sync_contacts() if len(contacts) > 0: delete_contacts(contacts) # cleanup_contacts()