Kontaktfelder

Wer mit Outlook VBA, CDO oder anderen APIs auf Outlook Kontakte zugreift, möchte sicher gerne wissen, welche Felder per Default zur Verfügung stehen, wie diese heißen, welcher Inhalt sich darin wieder findet und wie diese Felder über verschiedene Schnittstellen erreichbar sind. Ich habe hier versucht, mit Outlook 2007 und anderen Clients eine Übersicht der häufigen Kontaktfelder zu erstellen. Zusätzliche benutzerdefinierte Felder habe ich nicht aufgeführt.

Der Basiskontakt

Dazu habe ich mit Outlook 2007 erst mal einen Kontakt angelegt, welcher möglichst alle Fehler "sprechend" gefüllt hat:

Outlook Musterkontakt 1 

Auch die zweite Karteikarte enthält Informationen

Outlook Musterkontakt 2

Alle Felder kann ich hier in einem Bild wiedergeben, da z.B. bei den Telefonnummern noch viel mehr Felder gepflegt werden können.

Outlook Ansicht als Liste

Outlook selbst bietet schon eine Möglichkeit an, die Felder eines Objekts als Liste anzuzeigen:

Outlook Kontaktfelder

Aber auch hier scheitert man allein an der Menge und der Beschränkung auf die Fenstergröße. Besser geht es, wenn man per VBA sich den Kontakt holt und über eine kleine Schleife die Properties ausgibt:

Sub dumpproperties(obitem As ContactItem)
    Dim property As ItemProperty
    For Each property In obitem.ItemProperties
        If VarType(property.Value) = vbString Then
            Debug.Print property.Name & ";" & property.Value
        Else
            Debug.Print property.Name & ";EMPTY"
        End If
    Next
End Sub

Damit lässt sich leicht einer Liste der Felder und Inhalte generieren. Ich habe mich zur Einfachheit auf "Strings" beschränkt.

Musterkontakt
kontaktfelder-muster.msg Als MSG Datei zum ablegen in Outlook
kontaktfelder.vcf Export als VCF-Datei

Liste der Felder

Hier eine Tabelle alle Stringfelder, ihres Property Namens, das Feld in Outlook und, soweit bekannt, die Ansicht in OWA, Mobilegeräten und anderen Protokollen. Feedback und Ergänzungen sind gerne willkommen.

Die genauen Zuordnungen der verschiedenen Mobilgeräte werde ich später nachreichen.

Property-Name Musterinhalt Outlook WinMobile BES Nokia
Suite
iPhone  
BillingInformation Ja          
Body NotizenZeile1
NotizenZeile2
Ja          
Categories Ja          
Companies Ja          
ConversationIndex 01C98627FAE3E415AC36B3A34F49BD71991FF17AEB9F Ja          
ConversationTopic Vorname Nachname Ja          
CreationTime   Ja          
EntryID <<GUID>> Ja          
Importance EMPTY Ja          
LastModificationTime EMPTY Ja          
MessageClass IPM.Contact Ja          
Mileage Ja          
NoAging EMPTY Ja          
OutlookInternalVersion EMPTY Ja          
OutlookVersion 12.0 Ja          
Sensitivity EMPTY Ja          
Size EMPTY Ja          
Subject Vorname Vorname2 Nachname Namenszusatz Ja          
UserProperties EMPTY Ja          
Account Ja          
Anniversary EMPTY Ja          
AssistantName Assistent Ja          
AssistantTelephoneNumber TelAssistent Ja          
Birthday EMPTY Ja          
Business2TelephoneNumber TelGeschäftlich2 Ja          
BusinessAddress GeschäftStrasseLine1
GeschäftStrasseLine2

GeschäftPLZ GeschäftOrt GeschäftBundesland
Ja          
BusinessAddressCity GeschäftOrt Ja          
BusinessAddressCountry GeschäftLand Ja          
BusinessAddressPostalCode GeschäftPLZ Ja          
BusinessAddressPostOfficeBox Ja          
BusinessAddressState GeschäftBundesland Ja          
BusinessAddressStreet GeschäftStrasseLine1
GeschäftStrasseLine2
Ja          
BusinessFaxNumber FaxGeschäftlich Ja          
BusinessHomePage http://webseite Ja          
BusinessTelephoneNumber TelGeschäftlich Ja          
CallbackTelephoneNumber TelRückmeldung Ja          
CarTelephoneNumber TelAuto Ja          
CompanyAndFullName Firma
Nachname, Vorname Vorname2
Ja          
CompanyLastFirstNoSpace Ja          
CompanyLastFirstSpaceOnly Ja          
CompanyMainTelephoneNumber TelFirma Ja          
CompanyName Firma Ja          
ComputerNetworkName Ja          
CustomerID Ja          
Department Abteilung Ja          
Email1Address mail1@example.com Ja          
Email1AddressType SMTP Ja          
Email1DisplayName Vorname Vorname2 Nachname Namenszusatz (mail1@example.com) Ja          
Email1EntryID  ???????? ?Vorname Vorname2 Nachname Namenszusatz (mail1@example.com) SMTP mail1@example.com Ja          
Email2Address mail2@example.com Ja          
Email2AddressType SMTP Ja          
Email2DisplayName Vorname Vorname2 Nachname Namenszusatz (mail2@example.com) Ja          
Email2EntryID  ???????? ?Vorname Vorname2 Nachname Namenszusatz (mail2@example.com) SMTP mail2@example.com Ja          
Email3Address mail3@example.com Ja          
Email3AddressType SMTP Ja          
Email3DisplayName Vorname Vorname2 Nachname Namenszusatz (mail3@example.com) Ja          
Email3EntryID  ???????? ?Vorname Vorname2 Nachname Namenszusatz (mail3@example.com) SMTP mail3@example.com Ja          
FileAs Nachname, Vorname Vorname2 Ja          
FirstName Vorname Ja          
FullName Anrede Vorname Vorname2 Nachname Namenszusatz Ja          
FullNameAndCompany Nachname, Vorname Vorname2 Ja          
Firma Ja          
Gender EMPTY Ja          
GovernmentIDNumber Ja          
Hobby Ja          
Home2TelephoneNumber TelPrivat2 Ja          
HomeAddress PrivatStrasseLine1
PrivatStrasseLine2

PrivatPLZ PrivatOrt PrivatBundesland
Ja          
HomeAddressCity PrivatOrt Ja          
HomeAddressCountry PrivatLand Ja          
HomeAddressPostalCode PrivatPLZ Ja          
HomeAddressPostOfficeBox Ja          
HomeAddressState PrivatBundesland Ja          
HomeAddressStreet PrivatStrasseLine1 Ja          
PrivatStrasseLine2 Ja          
HomeFaxNumber FaxPrivat Ja          
HomeTelephoneNumber TelPrivat Ja          
Initials V.V.N. Ja          
InternetFreeBusyAddress http://InternetFreeBusy Ja          
ISDNNumber TelISDN Ja          
JobTitle Position Ja          
Journal EMPTY Ja          
Language Ja          
LastFirstAndSuffix Ja          
LastFirstNoSpace Ja          
LastFirstNoSpaceCompany Ja          
LastFirstSpaceOnly Ja          
LastFirstSpaceOnlyCompany Ja          
LastName Nachname Ja          
LastNameAndFirstName Nachname, Vorname Vorname2 Ja          
MailingAddress GeschäftStrasseLine1
GeschäftStrasseLine2

GeschäftPLZ GeschäftOrt GeschäftBundesland
Ja          
MailingAddressCity GeschäftOrt Ja          
MailingAddressCountry GeschäftLand Ja          
MailingAddressPostalCode GeschäftPLZ Ja          
MailingAddressPostOfficeBox Ja          
MailingAddressState GeschäftBundesland Ja          
MailingAddressStreet GeschäftStrasseLine1
GeschäftStrasseLine2
Ja          
ManagerName Vorgesetzter Ja          
MiddleName Vorname2 Ja          
MobileTelephoneNumber TelMobil Ja          
NetMeetingAlias Ja          
NetMeetingServer Ja          
NickName Spitzname Ja          
OfficeLocation Büro Ja          
OrganizationalIDNumber Ja          
OtherAddress WeitereStraße1
WeitereStraße2

WeiterePLZ WeitereOrt WeitereBundesland
Ja          
WeitereLand Ja          
OtherAddressCity WeitereOrt Ja          
OtherAddressCountry WeitereLand Ja          
OtherAddressPostalCode WeiterePLZ Ja          
OtherAddressPostOfficeBox Ja          
OtherAddressState WeitereBundesland Ja          
OtherAddressStreet WeitereStraße1
WeitereStraße2
Ja          
OtherFaxNumber FaxWeitere Ja          
OtherTelephoneNumber TelWeitere Ja          
PagerNumber TelPager Ja          
PersonalHomePage Ja          
PrimaryTelephoneNumber TelHaupttelefon Ja          
Profession Beruf Ja          
RadioTelephoneNumber TelFunkruf Ja          
SelectedMailingAddress EMPTY Ja          
Spouse Partnerin Ja          
Suffix Namenszusatz Ja          
TelexNumber TelTelex Ja          
Title Anrede Ja          
TTYTDDTelephoneNumber TelTexttelefon Ja          
User1 Ja          
User2 Ja          
User3 Ja          
User4 Ja          
WebPage http://webseite Ja          
YomiCompanyName Ja          
YomiFirstName Ja          
YomiLastName Ja          
Links EMPTY Ja          
LastFirstNoSpaceAndSuffix Ja          
DownloadState EMPTY Ja          
IMAddress imadresse@netatwork.de Ja          
MarkForDownload EMPTY Ja          
IsConflict EMPTY Ja          
AutoResolvedWinner EMPTY Ja          
Conflicts EMPTY Ja          
HasPicture EMPTY Ja          
PropertyAccessor EMPTY Ja          
TaskSubject Vorname Vorname2 Nachname Namenszusatz Ja          
TaskDueDate EMPTY Ja          
TaskStartDate EMPTY Ja          
TaskCompletedDate EMPTY Ja          
ToDoTaskOrdinal EMPTY Ja          
ReminderOverrideDefault EMPTY Ja          
ReminderPlaySound EMPTY Ja          
ReminderSet EMPTY Ja          
ReminderSoundFile Ja
ReminderTime EMPTY Ja          
IsMarkedAsTask EMPTY Ja          
BusinessCardLayoutXml <card xmlns="http://schemas....."/> ...</card> Ja          

Interessant ist hierbei, dass einige Telefonfelder, die Outlook als "Telefon 5 Ausgewählt" etc. bezeichnet, als englische Bezeichnungen ganz andere Namen haben (RadioTelephoneNumber).

Einfaches VBA-Makro zum Kopieren.

Sehr oft ergibt sich nun die Anforderung, Kontakte aus einem Ordner in einen anderen Ordner zu kopieren. Das kann man mit Outlook per "Drag and Drop" natürlich machen, was aber zu mehrfachen Kontakten führt. Habe ich die Kontakte im Ziel mit eigenen Daten erweitert, dann möchte ich aber nicht die Kontakte im Ziel löschen und neu kopieren. Ein "Merge" wäre sehr schön. Ein kleines VBA-Makro erlaubt diese Funktion relativ einfach, allerdings manuell, durchzuführen. Basierend auf dem Code wäre es aber sicher auch möglich, diese Funktion per VBScript und CDO auf einem Server ablaufen zu lassen.

Sub ContactCopy()

    ' get source Folder
    Dim SourceFolder As MAPIFolder
    Dim TargetFolder As MAPIFolder
    
    MsgBox "Bitte Quelle auswaehlen"
    Set SourceFolder = Outlook.GetNamespace("MAPI").PickFolder
    If SourceFolder.DefaultItemType <> olContactItem Then
        MsgBox "Abbruch: Ausgewählter Ordner ist kein Kontakt", vbCritical
        Exit Sub
    End If
    
    MsgBox "Bitte Ziel auswaehlen"
    Set TargetFolder = Outlook.GetNamespace("MAPI").PickFolder
    If TargetFolder.DefaultItemType <> olContactItem Then
        MsgBox "Abbruch: Ausgewählter Ordner ist kein Kontakt", vbCritical
        Exit Sub
    End If
    
    Debug.Print "Source Folder: " & SourceFolder.FolderPath
    Debug.Print "Target Folder: " & TargetFolder.FolderPath
    Dim sourceitem As ContactItem  'in einem Kontakt können auch DLs liegen !
    Dim targetitem As ContactItem
    Dim updatecount As Integer
    For Each sourceitem In SourceFolder.Items.Restrict("[MessageClass]='IPM.Contact'")
        Debug.Print "  Contact: " & sourceitem.subject
        Set targetitem = TargetFolder.Items.Find("[FileAs] = '" & sourceitem.FileAs & "'")
        If targetitem Is Nothing Then
            Debug.Print "  Copy NEW Contact"
            Set targetitem = sourceitem.Copy
            targetitem.Move TargetFolder
        Else
            Debug.Print "  Update Existing Contact"
            updatecount = 0
            If sourceitem.Email1Address <> targetitem.Email1Address Then
                targetitem.Email1Address = sourceitem.Email1Address
                updatecount = updatecount + 1
            End If
            
            If sourceitem.BusinessTelephoneNumber <> targetitem.BusinessTelephoneNumber Then
                targetitem.BusinessTelephoneNumber = sourceitem.BusinessTelephoneNumber
                updatecount = updatecount + 1
            End If
            If updatecount > 0 Then targetitem.Save
        End If
    Next
End Sub

Das Skript kopiert neue Kontakte komplett, während es bei bestehenden Kontakten einfach nur die Mailadresse und geschäftliche Telefonnummer von der Quelle im Ziel überschreibt.

Outlook Security Sicherung

Da es immer noch Viren gibt, die mit Vorliebe ihre Kontakte ausspähen möchten, verhindert Outlook zuverlässig jeden direkten Zugriff auf diese Daten und fordert von ihnen eine Bestätigung ein. Das gilt für jeden LESE-Zugriff auf die folgenden Felder

Email1Address , Email1AddressType , Email1DisplayName , Email1EntryID , Email2Address , Email2AddressType , Email2DisplayName , Email2EntryID , Email3Address , Email3AddressType , Email3DisplayName , Email3EntryID , NetMeetingAlias , ReferredBy , IMAddress , Body

Das Gilt natürlich nur beim Zugriff über Outlook. Wenn sie die CDO-Schnittstelle nutzen, unterbleibt diese Meldung.

Weitere Links

Keywords:Kontakte VBA Outlook CDO