Kontakte aus Apple Adressbuch als “externe Kontakte” in Office 365 übernehmen

Ziel der im Folgenden beschriebenen Aktion ist es, ein für alle User readonly zugängliches globales Firmenadressbuch in Microsoft Office 365 zu erzeugen, wenn beim Client ein Mac mit den mitgelieferten Programmen Mail, Adressbuch und iCal (und nicht Entourage 2008 WSE oder Outlook 2011) verwendet werden soll. Die für dieses globale Firmenadressbuch zu verwendenden Kontakte liegen lokal auf einem Mac im Programm Adressbuch vor.

Das Firmenadressbuch soll in Office 365 mit den “externen Kontakten” realisiert werden. Die Option einfach einen zusätzlichen User in Office 365 anzulegen und dessen Kontakte als Firmenadressbuch zu verwenden wurde verworfen. Dieser zusätzliche User würde eine kostenpflichtige Office 365 Lizenz verbrauchen und hätte auf jedem Client als zusätzlicher User eingerichtet werden müssen. Dieser aufwändige und fehlerträchtige Konfiguration sollte vermieden werden. Zusätzlich hätte bei dieser Realisierung jeder User volle Schreibrechte auf dem Firmenadressbuch, was nicht gewünscht war.

Zuerst müssen die Kontakte exportiert werden. Dazu stellt man im Programm Adressbuch vorab über “Adressbuch – Einstellungen – vCard” das vCard-Format auf “2.1” und die vCard 2.1-Codierung auf “Westeuropäisch (Windows Latin 1)” ein und exportiert dann mit “Ablage – Exportieren – vCard exportieren” die gewünschten Kontakte in eine *.vcf Datei.

Diese *.vcf Datei kann dann online auf der Website http://labs.brotherli.ch/vcfconvert/ in eine *.csv Datei konvertiert werden. Dazu auf der Website zuerst die zu konvertierende *.vcf Datei und dann die Optionen “Format: CSV Comma”, “Add header line” und “Encoding: Windows Latin-1 (ISO-8859-1)” wählen.

Damit in Office 365 die Umlaute und Sonderzeichen stimmen, muß vor dem Import die Kodierung der so erzeugten *.csv Datei in “UTF-8” geändert werden. Ich habe dazu den hervorragenden kostenfreien Texteditor TextWrangler (auch im App Store verfügbar) verwendet: In TextWrangler zuerst die Datei über “File – Open” öffnen (dabei im Öffnen-Dialog “Read as: Western (Windows Latin 1)” auswählen) und dann über “File – Save As” wieder abspeichern (dabei im Sichern-Dialog “Encoding: Unicode (UTF-8)” auswählen). Bei dieser Gelegenheit sollte man die Spaltenbeschriftungen in der ersten Zeile der Datei so bearbeiten dass kein Leerzeichen in den einzelnen Spaltenbeschriftungen mehr vorkommt.

Die Datei wäre jetzt zum Importieren bereit, nur leider gibt es in Office 365 keine Möglichkeit “externe Kontakte” zu importieren. Ein solcher Import ist nur in Windows mit PowerShell möglich.

Hierzu muß zuerst wie auf der Seite Install and Configure Windows PowerShell beschrieben sichergestellt werden, das Windows PowerShell im erforderlichen Umfang installiert und richtig  konfiguriert ist. Unter Windows 7 sollte das der Fall sein, unter XP und Vista müssen die auf der Website beschriebenen Schritte durchgeführt werden.

Anschließend muß man wie auf der Seite Connect Windows PowerShell to the Service beschrieben mit PowerShell eine Verbindung zu Office 365 aufbauen:

$LiveCred = Get-Credential
$Session = New-PSSession -ConfigurationName Microsoft.Exchange
  -ConnectionUri https://ps.outlook.com/powershell/ -Credential $LiveCred
  -Authentication Basic -AllowRedirection
Import-PSSession $Session

Der eigentliche Import (wie in dem Forumsbeitrag Bulk-create external contacts in Exchange Online beschrieben) geht in zwei Schritten vor sich: zuerst werden in einem ersten Import die neuen externen Kontakte erzeugt. Dabei werden nur die Felder DisplayName, ExternalEmailAddress, FirstName und LastName importiert. Dieses Felder dürfen nirgends leer sein, sonst bricht der Import ab.

Import-Csv .\ImportDatei.csv|%{New-MailContact -Name $_.Name
  -DisplayName $_.Name -ExternalEmailAddress $_.ExternalEmailAddress
  -FirstName $_.FirstName -LastName $_.LastName}

Dabei sind die Bezeichnungen mit “-” am Beginn (wie “-Name”) die Feldbezeichnungen in Office 365 und die mit “$_.” am Beginn (wie “$_.Name”) die entsprechenden Spaltenbeschriftungen in der zu importierenden Datei. Bei der Eingabe sollte man das “|” Zeichen nach dem Namen der zu importierenden Datei nicht übersehen! Wenn dieser Import erfolgreich durchgelaufen ist, existieren die externen Kontakte in Office 365, was dort in OWA überprüfen kann.

In einem zweiten Import müssen jetzt diesen existierenden externen Kontakten die fehlenden Informationen hinzugefügt werden. Angeblich kann man alle fehlenden Felder auf ein Mal importieren, aber das hat bei mir nicht geklappt. Es werden viele gelbe Warnzeilen im PowerShell-Fenster angezeigt und die vorhandenen externen Kontakte nicht verändert. Ich habe das so verstanden, dass die gelbe Warnung dann angezeigt (und der aktuelle externe Kontakt nicht verändert) wird, wenn eines der zu importierenden Felder im aktuellen Import-Datensatz leer ist. Ich habe die Felder deshalb einzeln importiert. Dann werden auch gelbe Warnzeilen für jeden Import-Datensatz angezeigt in dem das zu importierende Feld leer ist, aber das in dem Fall dann OK.

$Contacts = Import-CSV .\ImportDatei.csv
$Contacts | ForEach {Set-Contact $_.Name -StreetAddress $_.StreetAddress}
$Contacts | ForEach {Set-Contact $_.Name -City $_.City}
$Contacts | ForEach {Set-Contact $_.Name -PostalCode $_.PostalCode}
$Contacts | ForEach {Set-Contact $_.Name -Phone $_.Phone}
$Contacts | ForEach {Set-Contact $_.Name -MobilePhone $_.MobilePhone}
$Contacts | ForEach {Set-Contact $_.Name -Company $_.Company}
$Contacts | ForEach {Set-Contact $_.Name -Title $_.Title}
$Contacts | ForEach {Set-Contact $_.Name -Department $_.Department}
$Contacts | ForEach {Set-Contact $_.Name -Fax $_.Fax}
$Contacts | ForEach {Set-Contact $_.Name -Notes $_.Notes}
$Contacts | ForEach {Set-Contact $_.Name -Country $_.Country}

Falls man im Rahmen des Imports auf einen Fehler in den zu importierenden Daten stößt und diesen in der Importdaten-Datei korrigiert, muß man diese mit “$Contacts = Import-CSV .\ImportDatei.csv” neu laden, bevor man dem Import erneut versucht.

Wenn der Import erfolgreich abgeschloßen wurde, muß man sich noch mit

Remove-PSSession $Session

vom Office 365 abmelden.

Wenn man jetzt in Apple Mail (oder auch z.B. an einem iPhone) anfängt einen Adressaten einzutippen, werden automatisch (mit kurzer Verzögerung) passende externe Kontakte aus Office 365 vorgeschlagen. Im Apple Adressbuch kann man sich zwar nicht alle externen Kontakte aus Office 365 als Liste anzeigen lassen, aber bereits nach der Eingabe eines einzelnen Buchstabens in das Suchfeld werden alle passenden externen Kontakte angezeigt.

[Update] Eine externe Empfängerin (und nur diese) hat nach der Umstellung auf Office 365 an Ihrem Mac (10.5 Leopard) sowohl mit Apple Mail als auch mit Entourage 2008 alle Mailanhänge als “winmail.dat” empfangen. Da bei dem Kunden keine Microsoft-Mailclients im Einsatz sind und daher keine TNEF formatierten E-Mails (der technische Hintergrund der winmail.dat Anhänge) erzeugt werden, habe ich mich entschieden wie in diesem Hilfedokument beschrieben einfach am Server für alle externen Maildomänen das TNEF-Mailformat zu deaktivieren. Dafür sendet man mit PowerShell (nach entsprechender Anmeldung wie oben beschrieben) folgenden Befehl an Office 365:

Set-RemoteDomain Default -TNEFEnabled $false

Wie üblich hinterher die PowerShell Session sauber schließen!