as-n00
Goto Top

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?

Content-Key: 376858

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

Printed on: April 19, 2024 at 20:04 o'clock

Member: colinardo
colinardo Jun 14, 2018, updated at Jun 21, 2018 at 17:05:08 (UTC)
Goto Top
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):

back-to-topVariante 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
}

back-to-topVariante 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
}
Grüße Uwe
Member: AS-N00
AS-N00 Jun 17, 2018 at 10:21:29 (UTC)
Goto Top
Hallo Uwe,

vielen Dank, das klappt wunderbar.
Nur habe ich über 700.000 Dateien und das schafft selbst unser Server nicht.
Was empfiehlst du?
Dateimenge aufsplitten oder kann das Skript das handeln?
Member: colinardo
colinardo Jun 17, 2018 updated at 11:23:49 (UTC)
Goto Top
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.
Member: AS-N00
AS-N00 Jun 18, 2018 at 05:27:18 (UTC)
Goto Top
OK, danke. Wie kann ich denn auf die ersten 30 Zeilen einschränken?
Member: colinardo
colinardo Jun 18, 2018 at 05:40:18 (UTC)
Goto Top
Member: AS-N00
AS-N00 Jun 18, 2018 at 05:52:06 (UTC)
Goto Top
Danke, ich schaue mir das gerne mal an, aber ich habe von PS noch überhaupt keine Ahnung. Wo muss ich den Wert denn setzen in obiger Variante 2?
Wäre nett wenn du mir das verraten würdest.
Member: colinardo
colinardo Jun 18, 2018 updated at 05:59:48 (UTC)
Goto Top
aber ich habe von PS noch überhaupt keine Ahnung.
Dann wird's Zeit das zu ändern ... Zeile 4
gc $_.Fullname -Totalcount 30
Member: AS-N00
AS-N00 Jun 18, 2018 at 06:03:17 (UTC)
Goto Top
Ja, versprochen.
Ich war schon fast richtig, hatte nur eine überflüssige Pipe drin.
Danke.
Member: AS-N00
AS-N00 Jun 18, 2018 at 06:33:04 (UTC)
Goto Top
Es scheint aber nichts zu bringen, das Skrip läuft wieder ewig.
Ich habe mir extra PS 6 heruntergeladen, aber hat nix gebracht.
Member: colinardo
colinardo Jun 18, 2018 updated at 06:52:19 (UTC)
Goto Top
Tja, Glaskugel polieren was du für eine lahme Kiste du damit beschäftigst ist mir dann doch zu blöde.
Optimierte Version ohne PS 2.0 Kompatibilität wie oben schon erwähnt darfst du gerne gegen Cash abgreifen.
Member: AS-N00
AS-N00 Jun 18, 2018 at 07:25:06 (UTC)
Goto Top
Win 2008 R2
E5520 XEON mit 2,27 GHz 2 Prozessoren
192 GB RAM

PS 2.0 läuft ja bei mir.
Member: Heidjerjung
Heidjerjung Jun 21, 2018 at 14:21:13 (UTC)
Goto Top
Das läuft super, auch mit der Einschränkung der Abfragelänge.
ich habe das Script erweitert um die Felder für cc und bbc aus auszuwerten. Klappt alles.
Ich habe bei Test festgestellt, dass bei mehreren Email-Adressen immer nur die erste genommen wird.
Wer kann da helfen?

Gruß der Heidjerjung
Member: colinardo
colinardo Jun 21, 2018 updated at 17:45:49 (UTC)
Goto Top
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.
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