sarekhl
Goto Top

Import einer VCF-Datei mit mehreren Kontakten nach Outlook 365

Hallo zusammen,

unsere Gemeindereferentin hat einen neuen Rechner bekommen. Vom alten Rechner mit Thunderbird hat sie ihre Kontakte in eine VCF-Datei exportiert. Auf dem neuen Rechner wollten wir diese jetzt in Outlook 365 (ist vom Bistum vorgegeben) importieren, aber es wird immer nur der erste Kontakt importiert. Wie können wir alle Kontakte einlesen?

Im Internet wird das Problem oft beschrieben, eine halbwegs unkomplizierte Lösung habe ich aber nicht gefunden.


Danke im Voraus,
Sarek \\//_

Content-ID: 7167250640

Url: https://administrator.de/contentid/7167250640

Ausgedruckt am: 21.11.2024 um 13:11 Uhr

7010350221
7010350221 15.05.2023 um 22:04:13 Uhr
Goto Top
SarekHL
SarekHL 15.05.2023 um 22:19:38 Uhr
Goto Top

Das klingt gut, aber ich habe keine Ahnung (und vermutlich auch nicht die Werkzeuge), wie man aus den Dateien, die in GitHub liegen, ein lauffähiges Programm erzeugt. Eine EXE habe ich da nicht gefunden.
7010350221
7010350221 15.05.2023 aktualisiert um 22:28:08 Uhr
Goto Top
Eine EXE habe ich da nicht gefunden.
Warst wohl noch nie auf GitHub 😉. Klick auf Releases Icon und tada ....
Bittesehr
https://github.com/Rillke/Contact-Conversion-Wizard/releases/download/3. ...

https://github.com/Rillke/Contact-Conversion-Wizard/releases
SarekHL
SarekHL 15.05.2023 um 22:31:24 Uhr
Goto Top
Zitat von @7010350221:

Warst wohl noch nie auf GitHub 😉.

Selten. So wie die Seite aufgebaut ist, wendet sie sich halt eher an Entwickler.

Klick auf Releases Icon und tada ....
Bittesehr

Danke 😉
colinardo
Lösung colinardo 16.05.2023, aktualisiert am 08.06.2023 um 17:09:09 Uhr
Goto Top
Servus @SarekHL.
Hatte ich vor langer Zeit mal ein Powershell Outlook-Client-Skript dafür geschrieben das auch zusammengefasste (merged) vCard-Files verarbeitet. Es zerlegt das zusammengefasste vCard in mehrere separate und importiert diese einzeln.

p.s. Warum wurde aus Thunderbird nicht gleich in eine CSV exportiert? Die Zuordnung der CSV-Spalten lässt sich beim Import festlegen.
<#
    Import merged vCard(*.vcf) files into custom outlook contact folder
     © @colinardo (administrator.de)
#>

# load assemblies
Add-Type -A System.Windows.Forms
Add-Type -A Microsoft.Visualbasic
$objOL = [microsoft.visualbasic.interaction]::GetObject($null,"Outlook.Application")  
if (!$objOL){$objOL = New-Object -Com Outlook.Application}
# ask for vCard File with multiple contacts inside
$dlg = New-Object System.Windows.Forms.OpenFileDialog
$dlg.Multiselect = $true
$dlg.Title = "Select vCard files to import."  
$dlg.Filter = "vCard Dateien|*.vcf"  
if($dlg.ShowDialog() -ne 'OK'){  
    return
}
# ask for target contact folder
$contactfolder = $objOL.Session.PickFolder()
# create temporary folder vor extracted vCards
new-item -type dir "$env:TEMP\contacts" -Force | out-null  
# extract vCards
$cnt=0
foreach($file in Get-Item -LiteralPath $dlg.FileNames){
    # create single vCards from merged vCard files
    [regex]::matches((Get-Content $file.Fullname -raw),'(?ism)^BEGIN:VCARD.*?END:VCARD').Captures | %{  
        $_.Groups[0].Value  | out-file "$env:TEMP\contacts\contact_$((++$cnt)).vcf" -Encoding Default -Force  
    }
}
# process each vCard and import into outlook folder
foreach($file in ls "$env:TEMP\contacts" -File -Filter *.vcf){  
    write-host "Importing contact '$([regex]::match((Get-Content $file.Fullname -raw),'(?im)(?<=^FN:)[^\r\n]+').Value)'." -F Green  
    start outlook "/v `"$($file.Fullname)`""  
    while($objOL.Inspectors.Count -eq 0){sleep -Milliseconds 500}
    try{
        [void]$objOL.ActiveInspector().CurrentItem.Move($contactfolder)
    }catch{}
}
# remove temp folder
remove-item "$env:TEMP\contacts" -Recurse -Force  
# release resources
[void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($objOL)

Grüße Uwe
SarekHL
SarekHL 08.06.2023 um 14:17:45 Uhr
Goto Top

Ich konnte das jetzt endlich testen, leider importiert er aus der VCF-Datei nichts, der mittlere Teil des Programmfensters bleibt nach Auswahl der VCF-Datei leer.
SarekHL
SarekHL 08.06.2023 um 14:21:41 Uhr
Goto Top
Zitat von @colinardo:

Servus @SarekHL.
Hatte ich vor langer Zeit mal ein Powershell Outlook-Client-Skript dafür geschrieben das auch zusammengefasste (merged) vCard-Files verarbeitet. Es zerlegt das zusammengefasste vCard in mehrere separate und importiert diese einzeln.

Mit Powershell bin ich immer noch nicht warm geworden. Offenbar fehlt ihm etwas:

snap_donnerstag, 8. juni 2023_14h19m30s_002_windows powershell

Was muss ich da noch tun?
colinardo
colinardo 08.06.2023 aktualisiert um 17:10:29 Uhr
Goto Top
Den "System.Windows.Forms" Namespace hatte ich vergessen zu importieren, ist korrigiert, sorry.
SarekHL
SarekHL 09.06.2023 um 08:06:32 Uhr
Goto Top
Es läuft noch nicht rund, ich beschreibe mal, was passiert:

  1. Das Schript fragt nach der zu importierenden VCF-Datei und dem Ordner in Outlook
  2. Die ersten beiden Adressen erscheinen als "importing contact" im Powershell-Ausgabefenster
  3. Gleichzeitig gehen zwei Outlook-Kontaktfenster auf und schließen sich kurz darauf wieder
  4. Dann erscheinen die nächsten beiden Adressen als "importing contact" im Powershell-Ausgabefenster
  5. Es öffnen sich auch hier zwei Outlook-Kontaktfenster - diese bleiben aber offen
  6. Das Script läuft nicht weiter
  7. Nur die ersten beiden Kontakte (bei denen sich die Outlook-Kontaktfenster wieder geschlossen haben) sind importiert worden.

Ich habe das jetzt mit mehrere VCF-Dateien probiert und habe immer das gleiche Ergebnis.

Hier eine anonymisierte Version einer der VCF-Dateien:

BEGIN:VCARD
VERSION:4.0
FN:sanktelisabeth.buero@pfarrei-musterhausen.de
EMAIL;PREF=1:sanktelisabeth.buero@pfarrei-musterhausen.de
UID:########-####-####-####-############
END:VCARD
BEGIN:VCARD
VERSION:4.0
FN:sanktfranziskus.buero@pfarrei-musterhausen.de
EMAIL;PREF=1:sanktfranziskus.buero@pfarrei-musterhausen.de
UID:########-####-####-####-############
END:VCARD
BEGIN:VCARD
VERSION:4.0
FN:heiliggeist.buero@pfarrei-musterhausen.de
EMAIL;PREF=1:heiliggeist.buero@pfarrei-musterhausen.de
UID:########-####-####-####-############
END:VCARD
BEGIN:VCARD
VERSION:4.0
FN:sankthildegard.buero@pfarrei-musterhausen.de
EMAIL;PREF=1:sankthildegard.buero@pfarrei-musterhausen.de
UID:########-####-####-####-############
END:VCARD
BEGIN:VCARD
VERSION:4.0
FN:sanktjosef.buero@pfarrei-musterhausen.de
EMAIL;PREF=1:sanktjosef.buero@pfarrei-musterhausen.de
UID:########-####-####-####-############
END:VCARD
BEGIN:VCARD
VERSION:4.0
FN:sankjohannesxxiii.buero@pfarrei-musterhausen.de
EMAIL;PREF=1:sankjohannesxxiii.buero@pfarrei-musterhausen.de
UID:########-####-####-####-############
END:VCARD
colinardo
colinardo 09.06.2023 aktualisiert um 08:38:24 Uhr
Goto Top
Klappt hier in meinem Test mit beliebigen VCFs sowohl unter Office 2021 LTS als auch Office 2019 unter W10/11 auf unterschiedlichen Maschinen ohne Probleme. Scheint als wäre deine Office-Version problematisch oder du wechselst manuell den Fokus während des Skripts, oder die Kiste ist einfach zu langsam.
Ohne mehr Angaben zur Umgebung rätselraten. Du kannst aber mal testweise das try{} catch{} auskommentieren.

Du könntest aber auch einfach die im Temp-Ordner (%temp%\contacts) einzeln abgelegten Kontakte einfach auf das Outlook Fenster droppen und dann jedes einzeln speichern, das ist das selbe was das Skript macht nur eben durch dich selbst 😉.
Dazu nur alles ab Zeile 31 im Skript auskommentieren/entfernen, ausführen, in den Ordner %temp%\contacts wechseln und dort die einzelnen VCFs rausziehen und auf Outlook droppen. Done.
Das war's von meiner Seite.
SarekHL
SarekHL 09.06.2023 um 08:59:58 Uhr
Goto Top
Zitat von @colinardo:

Ohne mehr Angaben zur Umgebung

Office 365, Windows 10, kein manueller Fokuswechsel

Du kannst aber mal testweise das try{} catch{} auskommentieren.

Das hat nichts gebracht. Nun werden zwar ganz viele Kontaktfenster geöffnet, aber keines geschlossen und kein Kontakt importiert.

Siehst Du noch eine Chance? Ansonsten würde ich mir in VB (das ist die einzige Programmiersprache, die ich ausreichend beherrsche) einen Parser schreiben, der die VCF-Datei ausliest (ähnlich wie Dein Script) und dann eine CSV-Datei daraus macht.
colinardo
colinardo 09.06.2023 aktualisiert um 09:13:02 Uhr
Goto Top
Zitat von @SarekHL:.

Das hat nichts gebracht. Nun werden zwar ganz viele Kontaktfenster geöffnet, aber keines geschlossen und kein Kontakt importiert.
Dann hast du zu viel auskommentiert.
Siehst Du noch eine Chance? Ansonsten würde ich mir in VB (das ist die einzige Programmiersprache, die ich ausreichend beherrsche) einen Parser schreiben, der die VCF-Datei ausliest (ähnlich wie Dein Script) und dann eine CSV-Datei daraus macht.
Brauchst du doch gar nicht, exportiere wie oben bereits geschrieben direkt in Thunderbird als CSV, der beherrscht das auch. 😉 Nur in Outlook beim Import die Feldzuweisung vornehmen und schon passt das.
Zum Thema Parsen: Da gibt es seeehr viel zu berücksichtigen wenn es wirklich universell auf alle mögiichen VCF Varianten passen soll, stell dir das nicht zu einfach vor, ließ dir mal die RFC dazu durch.
Für einfache homogene VCFs und nur fest bestimmte Felder, OK, das ist ja dann pillepalle, aber den einmaligen Aufwand hier wirklich nicht wert, aber musst du selbst entscheiden.
SarekHL
SarekHL 09.06.2023 um 09:21:53 Uhr
Goto Top
Zitat von @colinardo:

Dann hast du zu viel auskommentiert.

Kannst Du es oben temporär anpassen, wie Du es meinst?

Brauchst du doch gar nicht, exportiere wie oben bereits geschrieben direkt in Thunderbird als CSV, der beherrscht das auch. 😉

Nur existiert leider der Rechner mit dem Thunderbird nicht mehr. Ich könnte höchtens mal versuchen, bei einem anderen Thunderbird die VCF zu reimportieren und dann als CSV zu exportiere,

Zum Thema Parsen: Da gibt es seeehr viel zu berücksichtigen wenn es wirklich universell auf alle mögiichen VCF Varianten passen soll,

Muss es ja nicht, nur auf meine. Vielleicht ist ja auch das Format meiner VCF-Datei nicht normgerecht - der Contact-Conversion-Wizard hat ja gar keine Inhalte übernommen.
colinardo
Lösung colinardo 09.06.2023 aktualisiert um 09:41:49 Uhr
Goto Top
Ach es gibt so viele Möglichkeiten, kannst z.B. auch das VCF File in ein Google Konto importieren und von dort aus dann nach CSV exportieren ... 1001 Way to g. Wundert mich eigentlich warum du damit so viel Zeit verschwendest, du bist nun ja auch schon einige Zeit dabei face-smile.
https://www.slipstick.com/outlook/people/import-vcards-in-bulk-into-outl ...
Kannst Du es oben temporär anpassen, wie Du es meinst?
#  try{
        [void]$objOL.ActiveInspector().CurrentItem.Move($contactfolder)
#  }catch{}
Viel Erfolg.
SarekHL
SarekHL 09.06.2023 um 11:53:09 Uhr
Goto Top
Zitat von @colinardo:

#  try{
        [void]$objOL.ActiveInspector().CurrentItem.Move($contactfolder)
#  }catch{}

So geht es - bzw. weil Du was von "zu langsam" sagtest, habe ich den Wert bei "sleep" noch auf 1000 erhöht.
Was sollte dieser jetzt auskommentierte Teil machen?
colinardo
colinardo 09.06.2023 aktualisiert um 12:24:15 Uhr
Goto Top
Zitat von @SarekHL:
So geht es - bzw. weil Du was von "zu langsam" sagtest, habe ich den Wert bei "sleep" noch auf 1000 erhöht.
Ja das ist Rechner spezifisch, manche brauchen da etwas mehr Zeit für das "exposing" der ActiveInspector-Property.
Was sollte dieser jetzt auskommentierte Teil machen?
Der sollte nur evt. Fehlermeldungen unterdrücken die auftauchen obwohl der Kontakt trotzdem richtig importiert wird. Das ist dem COM-Objekt geschuldet, das kommt da manchmal nicht mit und wirft dann eine überflüssige Fehlermeldung.