Fix Outlook Contacts Phone Number "+32" with C#
I own a Sony Ericsson T630 and manage my contacts with Outlook trough Bluetooth.
This has the side side-effect that I finally started adding everyone I might need to contact to my Contacts, before that I just picked an email and used the Reply-To ;)
But there is one thing that bothers me, I store my numbers in international format (eg: +32 50 .....), but Outlook always removes the + in front of it, and I can't find how to change that. And my phone needs the +!
So, let's write a tool to fix this.
First we need a reference to Outlook. So add a reference to 'Microsoft Outlook 11.0 Object Library' (or 10.0, if you use 10.0 leave a comment if this source worked for you!)
When you did this you'll have two new reference, just remove the Office Core... so that you have something like this:
Our application has a very simple logic, where the Main controls it all.
1using System;First we get the folder where our Contacts are stored.
2using System.Text.RegularExpressions;
3using System.Collections;
4using System.IO;
5using System.Diagnostics;
6using Outlook = Microsoft.Office.Interop.Outlook;
7
8namespace FixContacts {
9 class FixContacts {
10 static void Main(string[] args) {
11 // TODO
12 }
13 } /* FixContacts */
14} /* FixContacts */
1 //string contactFolder = @"Cumps David\Contacts";Then we open Outlook and get the folder.
2 Console.Write("Contact Folder: ");
3 string contactFolder = Console.ReadLine();
1 Outlook._Application appOutlook = new Outlook.Application();When we have the contact items, we loop over everyone of them, checking if there is a number to be fixed.
2
3 Outlook.NameSpace olNS = appOutlook.GetNamespace("MAPI");
4 olNS.Logon("", null, null, null);
5
6 Console.WriteLine("Searching Folder...");
7 Outlook.MAPIFolder olContactFolder = GetFolder(contactFolder);
8 Outlook.Items olContactItems = olContactFolder.Items;
1 Console.WriteLine("Fixing Phone Numbers...");Finally, we clean everything up.
2 foreach(Outlook.ContactItem olContact in olContactItems) {
3 CheckNumbersToReplace(olContact);
4 }
1 olNS.Logoff();First the GetFolder method. This will get us our folder we specified with a path.
2
3 olContactItems = null;
4 olContactFolder = null;
5 olNS = null;
6 appOutlook = null;
7 Console.WriteLine("Done");
8 Console.ReadLine();
Again we open Outlook. Then we split the path into the corresponding folders and we look for the root folder.
1Outlook._Application appOutlook = new Outlook.Application();When we have found our root folder, we will look for our first folder and when we find it, we replace our parent object by that folder and go looking for the next folder.
2Outlook.NameSpace olNS = appOutlook.GetNamespace("MAPI");
3olNS.Logon("", null, null, null);
4
5Outlook.MAPIFolder olFolder = null;
6folderPath.Replace("/", @"\");
7string[] arrFolders = folderPath.Split('\\');
8
9foreach (Outlook.MAPIFolder olTmpFolder in olNS.Folders) {
10 if (olTmpFolder.Name == arrFolders[0]) {
11 olFolder = olTmpFolder;
12 break;
13 }
14}
1if (olFolder != null) {And in the end we return our found folder after cleaning up.
2 for (int i = 1; i < arrFolders.Length; i++) {
3 Outlook.Folders olFolders = olFolder.Folders;
4 olFolder = null;
5
6 foreach (Outlook.MAPIFolder olTmpFolder in olFolders) {
7 if (olTmpFolder.Name == arrFolders[i]) {
8 olFolder = olTmpFolder;
9 break;
10 }
11 }
12 olFolders = null;
13 }
14}
1arrFolders = null;Now the CheckNumbersToReplace method, this is a simple one.
2olNS = null;
3appOutlook = null;
4return olFolder;
We create an ArrayList where we will add every phone number in the contact that starts with our contry prefix.
1 private static void CheckNumbersToReplace(Outlook.ContactItem vContact) {Next we check every phone entry if it contains the prefix. (I only show one of them now)
2 ArrayList phoneNumbers = new ArrayList();
3 string countryPrefix = "32";
1 if (vContact.HomeTelephoneNumber != null) {When we looked over all phonenumbers, we will build a new vCard with the correct information in it, that is, our numbers prefixed with a +.
2 string phoneNumber = vContact.HomeTelephoneNumber;
3 if (phoneNumber.Substring(0, 2) == countryPrefix) { phoneNumbers.Add(phoneNumber); }
4 }
1 if (phoneNumbers.Count > 0) {As you can see, we create a temporary vcard for this, and then launch it, you only have to press Save on it, and it's saved. As this is just a personal tool I didn't have the time or requirement to look into automatically saving it. In the end we delete the temporary file.
2 string vCardLocation = "";
3 Outlook.MailItem vCardMail = vContact.ForwardAsVcard();
4 Outlook.Attachments vCardArray = vCardMail.Attachments;
5 foreach (Outlook.Attachment vCard in vCardArray) {
6 vCardLocation = Environment.CurrentDirectory + @"\" + vCard.FileName;
7 vCard.SaveAsFile(vCardLocation);
8 foreach (string phoneNumber in phoneNumbers) {
9 FixNumber(vCardLocation, phoneNumber);
10 }
11 }
12 vContact.Delete();
13 Process launchvCard = new Process();
14 launchvCard.StartInfo = new ProcessStartInfo(vCardLocation);
15 launchvCard.Start();
16 launchvCard.WaitForExit();
17 File.Delete(vCardLocation);
18 }
The FixNumber method is a simple search and replace in the vCard file.
1 private static void FixNumber(string vCardPath, string phoneNumber) {And that is our FixContacts utility. It opens the contact dir, scans the contacts, check for phone numbers and fixes them if necessary and pops them up with the correct information, after which you only have to press Save.
2 if (File.Exists(vCardPath)) {
3 StreamReader readvCard = File.OpenText(vCardPath);
4
5 string vCard = readvCard.ReadToEnd();
6 readvCard.Close();
7 vCard = vCard.Replace(phoneNumber, "+" + phoneNumber);
8
9 StreamWriter writevCard = File.CreateText(vCardPath);
10 writevCard.WriteLine(vCard);
11 writevCard.Close();
12 }
13 } /* FixNumber */
Good enough for me, me phone and Outlook playing nicely together with this.
Full sources and executable are uploaded again. Enjoy.