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 = [ "winter@global-cube.net", "bedner@global-cube.net", "brandt@global-cube.net", # 'd.ankenbrand@global-cube.de', # 'gawliczek@global-cube.de', "m.geiss@global-cube.net", "matarrelli@global-cube.net", "winkler@global-cube.net", ] 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()