FixContact
Früher unter dem Namen "Mr2Herr" korrigiert dieses Skript eine falsche Anrede in den Kontakten und den "Speichern unter"-Namen.. Gerade bei der Migration von anderen Mailsystem oder beim Wechsel der Sprache passiert es immer wieder, dass zwar Vorname und Nachname korrekt übernommen werden aber die Anrede in der falschen Sprache erscheint. Ein Kandidat ist dazu die Notes Transporter Suite, welche in Notes enthaltene deutsche Anreden bei der Migration in Outlook in die Englische Form überführt. Hier ein Beispiel von konvertierten Musterkontakten.

Im gleichen Zuge passiert es auch, dass das Feld "Speichern unter" (Feld "FileAs") in der Schreibweise "Vorname Nachname" gefüllt wird. was natürlich ebenso wenig passend ist. In Deutschland sortieren wir die Anwender in der Regel nach dem Schema "Nachname, Vorname". Die "falsche" Schreibweise bringt auch die Sortierung im Adressbuch durcheinander.
Aufgabenstellung
Da das Problem nicht nur ein Postfach betrifft, sondern in der Regel viele Benutzer, arbeitet FixContact als VBScript, welches per CDO beliebige Postfächer öffnen und die Inhalte im Kontaktordner entsprechend anpassen kann. Es holt sich den Inhalt der Felder Anrede, Vorname, Nachname und Firma, fixt die Anrede und generiert den angezeigten Namen.
| Feld | CDO-Konstante | hex |
|---|---|---|
Firma |
CdoPR_COMPANY_NAME |
&H3A16001F |
Vorname |
CdoPR_GIVEN_NAME |
&H3A06001F |
Nachname |
CdoPR_SURNAME |
&H3A11001E |
Titel |
CdoPR_TITLE |
&H3A17001F |
Anzeigename |
CdoPR_DISPLAY_NAME |
&H3001001F |
Anrede |
PR_DISPLAY_NAME_PREFIX |
|
Initialen |
CdoPR_INITIALS |
&H3A0A001E |
Speichern unter |
CdoPR_FileAs |
&H81C2001E |
Ein Teil ist die Umsetzung der Anrede (PR_DISPLAY_NAME_PREFIX).
| Anrede ALT | Anrede Neu |
|---|---|
Ms. |
Frau |
Mrs. |
Frau (das Fräulein ist heute wohl nicht mehr angesagt) |
Mr. |
Herr |
Miss |
Frau |
* |
unverändert |
Das Skript sucht einfach nach diesem Feld und schreibt es entsprechend um.
Der zweite Teil ist natürlich die Korrektur des "Speicher unter" bzw. des Anzeigedatums. Outlook bietet hier mehrere Optionen an, den Anzeigenamen eines Kontakts zu erstellen.

Das Skript holt sich einfach den Nachnamen, Vornamen und die Firma, baut daraus das Feld für "FileAs" zusammen und schreibt es zurück. Nach meiner Erfahrung bei Kunden ist das meist gewünschte Format ein "%Nachname%, %Vorname% (%Firma%)", welches das Skript auch aufbaut. Voraussetzung ist dabei aber mindestens, dass die Felder Vorname, Nachname, Firma auch gefüllt sind, ansonsten werden diese weg gelassen. Ergebnisse wie "Nachname, Vorname ()" sollten ebenso wenig auftreten wie ", Vorname ()" etc.
Aufruf und Anwendung
Als VBScript wird das Skript natürlich wieder per CSCRIPT gestartet, damit die Bildschirmausgaben auf der Console ausgegeben werden. Weiterhin müssen Sie wieder mit entsprechend privilegierten Rechten arbeiten (Siehe auch Mailboxrechte) und auf dem System muss die CDO (Siehe MAPI/CDO) installiert sein. Als Übergabe erwartet das Skript die Liste der Benutzer (Alias oder Mailadresse) per STDIN oder als Parameter.
echo User1 | cscript fixcontact.vbs /server:srv01 /mode:MOD /reportcsv c:\fixcontact.csv
Natürlich können Sie dem Skript auch eine Liste von Postfächern (Alias oder SMTP-Adresse) über STDIN zusenden oder über einen FOR-Schleife das Skript mit jedem Postfach einzeln aufrufen und so pro Postfach eine eigene Reportdatei anlegen lassen.

Die gemachten Veränderungen werden auch hier in eine CSV-Datei protokolliert.
VBA-Version
Wer nur die Kontakte in einem Ordner bearbeiten will, kann die hier veröffentlichte VBA-Version verwenden.
Sub FixContact()
Dim objfolder As MAPIFolder
Set objfolder = Outlook.GetNamespace("MAPI").PickFolder
Const strmode = "READ" '
' const strmode = "MOD" ' aktivieren zum ändern
Dim Item As Object
Dim colContacts As items
Dim objcontact As contactitem
Dim count As Integer
Dim subject As String
Set colContacts = objfolder.items
Set Item = colContacts.GetFirst
Dim strNamePrefix, strNamePrefixNeu As String
Do While Not Item Is Nothing
If Item.MessageClass <> "IPM.Contact" Then
Debug.Print "Skip NonContact:" & Item.subject
Else
Set objcontact = Item
Debug.Print " ProcessContact Subject:" & objcontact.subject
strNamePrefix = objcontact.Title 'anrede
Select Case LCase(strNamePrefix)
Case "mr.": strNamePrefixNeu = "Herr"
Case "ms.": strNamePrefixNeu = "Frau"
Case "mrs.": strNamePrefixNeu = "Frau"
Case "miss.": strNamePrefixNeu = "Frau"
Case Else: strNamePrefixNeu = strNamePrefix
End Select
If strNamePrefixNeu <> strNamePrefix Then
Debug.Print " Found " & strNamePrefix & " Replace with " & strNamePrefixNeu
If strmode = "MOD" Then
objcontact.Title = strNamePrefixNeu
objcontact.Save
Debug.Print " Anrede:WRITE Modifications:" & strNamePrefixNeu
Else
Debug.Print " Anrede:write Modifications:" & strNamePrefixNeu
End If
Else
Debug.Print " Anrede:Skip Entry:" & strNamePrefixNeu
End If
Dim newFileAs As String: newFileAs = ""
If objcontact.LastName <> "" Then
newFileAs = newFileAs & objcontact.LastName
Debug.Print " FileAs=" & newFileAs
End If
If objcontact.FirstName <> "" Then
If newFileAs <> "" Then
newFileAs = newFileAs & ", " & objcontact.FirstName
End If
Debug.Print " FileAs=" & newFileAs
End If
If objcontact.CompanyName <> "" Then
If newFileAs <> "" Then
newFileAs = newFileAs & " (" & objcontact.CompanyName & ")"
End If
Debug.Print " FileAs=" & newFileAs
End If
If objcontact.FileAs = newFileAs Then
Debug.Print " FileAs not modified"
Else
If strmode = "MOD" Then
objcontact.FileAs = newFileAs
objcontact.Save
Debug.Print " FileAs MOD"
Else
Debug.Print " FileAs READ"
End If
End If
End If
Set Item = colContacts.GetNext
Loop
End Sub
Hinweise zum umgang mit VBA-Dateien finden Sie auf Outlook VBA.
Weitere Links
- Mailboxrechte
- MAPI/CDO
- Notes
- Outlook VBA
- TransporterSuite Notes
- Property Tags and Types
http://www.cdolive.com/cdo10.htm - MAPI Property Tags
http://msdn.microsoft.com/en-us/library/ms526356(EXCHG.10).aspx - 286507 XGEN: CDO Returns Substring Search Instead of Prefix
- 252821 XGEN: Read Contact Properties from ASP Page with VBScript














