We have a lot of customer data in our system and I wanted to have a shared contact list with all the customer data for my co-workers.
I looking into some Office365 docs and found this walkthrough to create the folder: https://www.cogmotive.com/blog/office-365-tips/create-a-company-shared-contacts-folder-in-office-365
So afterwards you have an empty but shared contact folder. I thought that I needed the Microsoft Graph to access these contacts. Which would require my app to be in azure and it cannot have a command line only because of the authentication. More about that approach can be found here http://dev.office.com/getting-started/office365apis
But it seems that this is not needed for my simple one time import https://msdn.microsoft.com/en-us/office/office365/api/contacts-rest-operations
I thought that it might be a job for a PowerShell script and found this http://www.infinitconsulting.com/2015/01/bulk-import-contacts-to-office-365/
But there is an other option. Use Interop, because I as an Office365 user have Outlook 2016 on my Windows 10 machine and Visual Studio 2015. So create a new (console) application and add a reference to Outlook Interop:
I used this code to get to the “customers” address book:
using System; using Outlook = Microsoft.Office.Interop.Outlook; namespace UploadContactsToOffice365 { class Program { static void Main(string[] args) { var ap = new Outlook.Application(); foreach(Outlook.Folder f in ap.Session.Folders) { if (f.Name.ToLower().Contains("openbare")) // jp openbare mappen (public folders) { Console.WriteLine(f.FullFolderPath); foreach (Outlook.Folder f2 in f.Folders) { if (f2.Name.ToLower().Contains("alle")) // alle openbare mappen (all public folders) { Console.WriteLine(f2.FullFolderPath); foreach (Outlook.Folder f3 in f2.Folders) { if (f3.Name.ToLower().Contains("klanten")) // customers (folder name) { Console.WriteLine(f3.FullFolderPath); foreach (Outlook.Folder f4 in f3.Folders) { if (f4.AddressBookName.ToLower().Contains("customers")) { Console.WriteLine(f4.FullFolderPath); Console.WriteLine("----------"); /// display current items: //Outlook.Items oItems = f4.Items; //for (int i = 1; i <= oItems.Count; i++) //{ // Outlook._ContactItem oContact = (Outlook._ContactItem)oItems[i]; // Console.WriteLine(oContact.FullName); // oContact = null; //} // add test item: Outlook.ContactItem newContact = (Outlook.ContactItem)ap.CreateItem(Outlook.OlItemType.olContactItem); try { newContact.FirstName = "Jo"; newContact.LastName = "Berry"; newContact.Email1Address = "somebody@example.com"; newContact.CustomerID = "123456"; newContact.PrimaryTelephoneNumber = "(425)555-0111"; newContact.MailingAddressStreet = "123 Main St."; newContact.MailingAddressCity = "Redmond"; newContact.MailingAddressState = "WA"; newContact.Move(f4); newContact.Save(); } catch (Exception ex) { Console.WriteLine("The new contact was not saved. " + ex.Message); } } } } } } } } } Console.ReadKey(); } } }
This is not the prettiest code I have written. So there must be a better way. But this is just a one time application to loop through some database records and add contacts. So I will just leave it like this. Please let me know in the comments if you have suggestions to improve readability. The code snippet will give this contact in your (and the rest of the companies) outlook:
If you are looking how to import a folder full with vcf cards you should take a look at this MSDN article.
This should give you enough pointers to bulk add contacts to a shared folder in Office365 (Outlook 2016)
Good luck!