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:
Auch die zweite Karteikarte enthält Informationen
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:
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 für 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 |
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 |
Ja |
|
|
|
|
|
BusinessAddressCity |
GeschäftOrt |
Ja |
|
|
|
|
|
BusinessAddressCountry |
GeschäftLand |
Ja |
|
|
|
|
|
BusinessAddressPostalCode |
GeschäftPLZ |
Ja |
|
|
|
|
|
BusinessAddressPostOfficeBox |
Ja |
|
|
|
|
|
|
BusinessAddressState |
GeschäftBundesland |
Ja |
|
|
|
|
|
BusinessAddressStreet |
GeschäftStrasseLine1 |
Ja |
|
|
|
|
|
BusinessFaxNumber |
FaxGeschäftlich |
Ja |
|
|
|
|
|
BusinessHomePage |
http://webseite |
Ja |
|
|
|
|
|
BusinessTelephoneNumber |
TelGeschäftlich |
Ja |
|
|
|
|
|
CallbackTelephoneNumber |
TelRückmeldung |
Ja |
|
|
|
|
|
CarTelephoneNumber |
TelAuto |
Ja |
|
|
|
|
|
CompanyAndFullName |
Firma |
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 |
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 |
Ja |
|
|
|
|
|
MailingAddressCity |
GeschäftOrt |
Ja |
|
|
|
|
|
MailingAddressCountry |
GeschäftLand |
Ja |
|
|
|
|
|
MailingAddressPostalCode |
GeschäftPLZ |
Ja |
|
|
|
|
|
MailingAddressPostOfficeBox |
Ja |
|
|
|
|
|
|
MailingAddressState |
GeschäftBundesland |
Ja |
|
|
|
|
|
MailingAddressStreet |
GeschäftStrasseLine1 |
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 |
Ja |
|
|
|
|
|
WeitereLand |
Ja |
|
|
|
|
|
|
OtherAddressCity |
WeitereOrt |
Ja |
|
|
|
|
|
OtherAddressCountry |
WeitereLand |
Ja |
|
|
|
|
|
OtherAddressPostalCode |
WeiterePLZ |
Ja |
|
|
|
|
|
OtherAddressPostOfficeBox |
Ja |
|
|
|
|
|
|
OtherAddressState |
WeitereBundesland |
Ja |
|
|
|
|
|
OtherAddressStreet |
WeitereStraße1 |
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 für 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
- Alles zu Kontakten und Adressen
- Outlook VBA
- Outlook PCS
- Kontaktrename
- FixContactAB
- Dubletten
- You receive the confirmation dialog box when a solution tries to
programmatically access the following properties of the ContactItem
object
http://msdn.microsoft.com/en-us/library/aa210907(office.11).aspx - Programming Applications für Microsoft Office Outlook 2007 :
Chapter 7: Address Books and Recipients
http://msdn.microsoft.com/en-us/library/cc513843.aspx