eml nach Empfängeradresse sortiert verschieben
Hallo,
ich habe hier hundert tausende *.eml Dateien, also E-Mails aus unserer ERP-Software.
Die möchte ich gerne in ein DMS einlesen.
Leider sind die völlig ungeordnet, sollten. aber nach der Empfänger- und Absenderadresse sortiert in verschiedene Ordner verschoben werden.
Also nach dem "To:" und dem "From:" sortiert.
Das ganze läuft auf einem Win 2008 R2, aber ich hätte php drauf.
Hat da wer einen Ansatz?
ich habe hier hundert tausende *.eml Dateien, also E-Mails aus unserer ERP-Software.
Die möchte ich gerne in ein DMS einlesen.
Leider sind die völlig ungeordnet, sollten. aber nach der Empfänger- und Absenderadresse sortiert in verschiedene Ordner verschoben werden.
Also nach dem "To:" und dem "From:" sortiert.
Das ganze läuft auf einem Win 2008 R2, aber ich hätte php drauf.
Hat da wer einen Ansatz?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 376858
Url: https://administrator.de/contentid/376858
Ausgedruckt am: 18.11.2024 um 05:11 Uhr
13 Kommentare
Neuester Kommentar
Servus @AS-N00,
kein Problem, hier bspw. mit Powershell schnell erledigt, da wir nicht wissen wie du es genau einsortiert haben willst hier zwei mögliche Varianten (Ordner in Zeile 2 anpassen):
Grüße Uwe
kein Problem, hier bspw. mit Powershell schnell erledigt, da wir nicht wissen wie du es genau einsortiert haben willst hier zwei mögliche Varianten (Ordner in Zeile 2 anpassen):
Variante 1 sortiert die Mails in Unterordner folgendermaßen: \<Absender-E-Mail>\<dateiname>.eml
# Ordner in dem die EML-Dateien liegen
$folder = 'D:\Mails'
gci $folder -Filter *.eml | ?{!$_.PSIsContainer} | group {[regex]::Match((gc $_.Fullname -ReadCount 1000 | out-string),'(?ism)^From:[^\r\n]*?(\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b)').Groups[1].Value} | %{
$target = "$folder\$($_.Name)"
if (!(Test-Path $target)){md $target -Force | out-null}
$_.Group | copy-item -Destination $target -Force -Verbose
}
Variante 2 sortiert die Mails in Unterordner folgendermaßen: \<Absender-E-Mail>\<Empfänger-E-Mail>\<dateiname>.eml
# Ordner in dem die EML-Dateien liegen
$folder = 'D:\Mails'
gci $folder -Filter *.eml | ?{!$_.PSIsContainer} | group {([regex]::Matches((gc $_.Fullname -ReadCount 1000 | out-string),'(?im)^(From|To):[^\r\n]*?(\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b)').Captures | select -First 2 | %{$_.Groups[2].Value}) -join "\"} | %{
$target = "$folder\$($_.Name)"
if (!(Test-Path $target)){md $target -Force | out-null}
$_.Group | copy-item -Destination $target -Force -Verbose
}
Kein Problem, du kannst ja auch beim CMDLet get-content auf die ersten 30 Zeilen der Dateien einschränken (wenn to und from dort meist liegen) das spart nochmal Ressourcen.
Hab das schnell mal mit 300000 generierten Mails probiert, das war in 1 Minute durch, also kein Problem sofern ihr eine PS Version > 2.0 verwendet, das Ding war jetzt im obigen Beispiel nur auf "kompatibel" mit 2.0 getrimmt.
Hab das schnell mal mit 300000 generierten Mails probiert, das war in 1 Minute durch, also kein Problem sofern ihr eine PS Version > 2.0 verwendet, das Ding war jetzt im obigen Beispiel nur auf "kompatibel" mit 2.0 getrimmt.
-TotalCount Parameter nutzen.
Zitat von @Heidjerjung:
Ich habe bei Test festgestellt, dass bei mehreren Email-Adressen immer nur die erste genommen wird.
Klar, weil der Regex nur die erste nimmt sonst würde ja der Rest der Skriptlogik von oben nicht mehr passen.Ich habe bei Test festgestellt, dass bei mehreren Email-Adressen immer nur die erste genommen wird.
Die Anpassung ist kein Problem, was aber wichtiger wäre zu wissen wie die Ordnerstruktur dann bei dir aussehen soll, da gibt es ja viele Möglichkeiten, wie z.B. weitere Unterordner für jede Adresse und dort jeweils eine Kopie der Datei rein, oder die Adressen alle in einen Ordnernamen gepresst mit Trennzeichen, etc. pp. Das kann sich hier ja keiner aus den Fingern saugen.
Wer kann da helfen?
Kann ich gerne, aber dann bitte via PN, das Übernehmen von fremden Threads ist hier nicht so gern gesehen.Grüße Uwe