E-Mail Client für Kommandozeile
Moin, moin.
Ich bin gerade auf der Suche nach einem (Kommandozeilen-)Programm, das automatisch ein (IMAP) E-Mail Postfach öffnet und die Dateianhänge der ungelesenen Mails in ein Verzeichnis speichert.
Am liebsten wäre mir ein Powershell Script. Etwas anderes, notfalls auch unter Linux, würde aber auch gehen.
Hat jemand eine Idee oder zumindest einen Ansatz für mich?
Hintergrund:
Ich habe mehrere Faxgeräte, die die eingehenden Faxe lediglich als eine E-Mail weiterleiten und nicht direkt auf ein Netzlaufwerk ablegen können. Die angehängten TIFF-F Dateien möchte ich deshalb mit Hilfe eines Tools aus den E-Mails extrahieren und auf einem Server ablegen.
Beste Grüße und vielen Dank für die Hilfe
PS:
https://www.limilabs.com/blog/save-all-attachments-to-disk-using-imap
Das würde es zwar machen, ist aber VIEL zu teuer und kein "einfaches" Programm.
Ich bin gerade auf der Suche nach einem (Kommandozeilen-)Programm, das automatisch ein (IMAP) E-Mail Postfach öffnet und die Dateianhänge der ungelesenen Mails in ein Verzeichnis speichert.
Am liebsten wäre mir ein Powershell Script. Etwas anderes, notfalls auch unter Linux, würde aber auch gehen.
Hat jemand eine Idee oder zumindest einen Ansatz für mich?
Hintergrund:
Ich habe mehrere Faxgeräte, die die eingehenden Faxe lediglich als eine E-Mail weiterleiten und nicht direkt auf ein Netzlaufwerk ablegen können. Die angehängten TIFF-F Dateien möchte ich deshalb mit Hilfe eines Tools aus den E-Mails extrahieren und auf einem Server ablegen.
Beste Grüße und vielen Dank für die Hilfe
PS:
https://www.limilabs.com/blog/save-all-attachments-to-disk-using-imap
Das würde es zwar machen, ist aber VIEL zu teuer und kein "einfaches" Programm.
Please also mark the comments that contributed to the solution of the article
Content-ID: 324348
Url: https://administrator.de/contentid/324348
Printed on: December 3, 2024 at 08:12 o'clock
64 Comments
Latest comment
Schau mal hier:
Linux: Automatisiert Posteingang checken und Skript ausführen
Lässt sich sicher einfach anpassen das statt dem Text die Attachments abgelegt werden.
Powershell:
http://www.agile-coding.net/imapx-mit-powershell-nutzen-um-emails-abzuf ...
Gruß
Linux: Automatisiert Posteingang checken und Skript ausführen
Lässt sich sicher einfach anpassen das statt dem Text die Attachments abgelegt werden.
Powershell:
http://www.agile-coding.net/imapx-mit-powershell-nutzen-um-emails-abzuf ...
Gruß
mailsend -to test123@web.de -from willi@androxin.de -starttls -port 587 -auth -smtp mail.web.de -sub Testmail +cc +bc -v -user androxin -pass "Geheim"
Zusätzlich mit Attachment kommt dann das dazu:
-attach "file.txt,text/plain"
-attach "/usr/file.gif,image/gif"
-attach "file.jpeg,image/jpg"
Beispiel mit der Datei "Tux.jpg" im Verzeichnis:
mailsend -to test123@web.de -from willi@androxin.de -starttls -port 587 -auth -smtp mail.web.de -sub Testmail +cc +bc -v -user androxin -pass "Geheim" -attach "Tux.jpg,image/jpg"
Das Kommando MUSS komplett in einer Zeile eingegeben werden !
@aqui
Nur das er Mails nicht senden sondern empfangen will
Nur das er Mails nicht senden sondern empfangen will
- edit vom 21.06.2019 -
ACHTUNG HINWEIS: Der Attachment-Parser der IMAPX-DLL hat Probleme bei Mails in denen ein Mix aus Inline- und echten Attachments enthalten ist. Ich rate deswegen dringend zum Umstieg z.B. auf die .NET Bibliothek Mailkit.
Ein Beispiel mit der Mailkit Bibliothek habe ich hier unten im Thread gepostet.
imap_download_attachments_mailkit_324348.zip (.NET 4.5)
- end edit -
Grüße Uwe
Zuallerst Danke für dieses Scirpt und Super auskommentiert direkt beim ersten mal verstanden danke dafür.
Ich bin noch ein bisschen grün hinter den ohren was PS angeht hier meine Frage/mein Problem
"The selected authentication mechanism is not supported"
Hast du eine Lösung für das Problem
Der Mailserver ist hier im eigenen Netz Microsoft Exchange muss ich dafür noch irgnedwas anderes machen oder bin ich gerade der "DAU" der es nicht versteht.
Gruß
Sebastian
Ich bin noch ein bisschen grün hinter den ohren was PS angeht hier meine Frage/mein Problem
"The selected authentication mechanism is not supported"
Hast du eine Lösung für das Problem
Der Mailserver ist hier im eigenen Netz Microsoft Exchange muss ich dafür noch irgnedwas anderes machen oder bin ich gerade der "DAU" der es nicht versteht.
Gruß
Sebastian
Zitat von @Androxin:
Lässt sich dein Exchange überhaupt über IMAP ansprechen? Normalerweise nutzt der übrigens MAPI.
Ja man muss es nur aktivieren, und für den User muss es in den Client Access Settings ebenfalls aktiviert sein und die Firewall muss es natürlich durchlassen.Lässt sich dein Exchange überhaupt über IMAP ansprechen? Normalerweise nutzt der übrigens MAPI.
Zitat von @BlueEyePhoenix:
kann man dieses Script auch soweit anpassen das es nur aus einer bestimmten Email einen Anhang speichert? Suche so einen ähnlichen befehl der halt nach absender oder Betreff nur von der einen Email den Anhang speichert.
Ja. Einfach eine If-Abfrage der Subject-Eigenschaft machen,kann man dieses Script auch soweit anpassen das es nur aus einer bestimmten Email einen Anhang speichert? Suche so einen ähnlichen befehl der halt nach absender oder Betreff nur von der einen Email den Anhang speichert.
if ($m.Subject -like '*Testsubject*'){
# hier gehts weiter
}
$messages = $imap.Folders.Inbox.Search("UNSEEN SUBJECT `"Testnachricht`"",[ImapX.Enums.MessageFetchMode]::Full,1000)
Hallo
ich habe auch noch leider eine kleine Fehler, wo ich nicht weiter komme. Bitte euch um Hilfe.
Da die Fehlermeldung:
Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.
In C:\albin\sw\mail.ps1:33 Zeichen:5
+ FullyQualifiedErrorId : InvokeMethodOnNull
Das ist die einzige Anpassung von mir selber in der Zeile 18
Add-Type -Path "$PSScriptRoot\ImapX.dll"
auf
Add-Type -Path "C:\albin\sw\ImapX.dll"
Lieber Gruss
Albin
ich habe auch noch leider eine kleine Fehler, wo ich nicht weiter komme. Bitte euch um Hilfe.
Da die Fehlermeldung:
Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.
In C:\albin\sw\mail.ps1:33 Zeichen:5
$messages = $imap.Folders.Inbox.Search("UNSEEN",[ImapX.Enums.MessageFetchMod ...
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: ( [], RuntimeException+ FullyQualifiedErrorId : InvokeMethodOnNull
Das ist die einzige Anpassung von mir selber in der Zeile 18
Add-Type -Path "$PSScriptRoot\ImapX.dll"
auf
Add-Type -Path "C:\albin\sw\ImapX.dll"
Lieber Gruss
Albin
Servus Albin, willkommen auf Administrator.de!
Was du nun machst ist folgendes:
Lass dir mit
alle Ordner auflisten und dann ersetzt du die Zeile in der die Nachrichten gesucht werden durch:
Gibst also den Namen deines Inbox Ordners explizit an.
Das sollte meiner Glaskugel zufolge das Problem bei dir beheben. Ansonsten helfe ich gerne auch via PN.
Grüße Uwe
Das ist die einzige Anpassung von mir selber in der Zeile 18
Add-Type -Path "$PSScriptRoot\ImapX.dll"
auf
Add-Type -Path "C:\albin\sw\ImapX.dll"
Das wäre schlecht wenn das die einzigste Änderung wäre die du vorgenommen hättest, denn dann wären IMAP Server, Benutzernamen, Password etc. natürlich nicht passend .Add-Type -Path "$PSScriptRoot\ImapX.dll"
auf
Add-Type -Path "C:\albin\sw\ImapX.dll"
Zitat von @albin63:
Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.
In C:\albin\sw\mail.ps1:33 Zeichen:5
$messages = $imap.Folders.Inbox.Search("UNSEEN",[ImapX.Enums.MessageFetchMod ...
Also das ist so, normalweise erkennt IMAPX die sogenannten Common-Folder wie Inbox, Trash, und Co. anhand von Flags die auf den Ordnern gesetzt sind automatisch. Da es aber eine vielzahl an IMAP-Servern gibt und leider noch nicht jeder diese speziellen Flags setzt kann IMAPX hier sehr wahrscheinlich deine Inbox nicht ermitteln und das Objekt hinter $imap.Folders.Inbox ist dann leer, deswegen auch die Meldung das er eine Methode eines leeren Objekts nicht aufrufen kann.Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.
In C:\albin\sw\mail.ps1:33 Zeichen:5
$messages = $imap.Folders.Inbox.Search("UNSEEN",[ImapX.Enums.MessageFetchMod ...
Was du nun machst ist folgendes:
Lass dir mit
$imap.Folders.Name
$imap.Folders['NAME DES INBOX ORDNERS'].Search( ..................
Das sollte meiner Glaskugel zufolge das Problem bei dir beheben. Ansonsten helfe ich gerne auch via PN.
Grüße Uwe
Servus @novregen ,
Wenn du da Powershell Core drauf knallst würde auch das über Umwege funktionieren, aber für Linux machst du das besser gleich mit Python oder Perl, oder den sonstigen Kommandozeilentools die es extra dafür gibt. (mutt, alpine, sup, notmuch,...)
Mit Python hatte ich hier ebenfalls schon mal etwas Code gepostet.
Genauer gesagt in folgendem Beitrag:
Linux: Automatisiert Posteingang checken und Skript ausführen
Grüße Uwe
Wenn du da Powershell Core drauf knallst würde auch das über Umwege funktionieren, aber für Linux machst du das besser gleich mit Python oder Perl, oder den sonstigen Kommandozeilentools die es extra dafür gibt. (mutt, alpine, sup, notmuch,...)
Mit Python hatte ich hier ebenfalls schon mal etwas Code gepostet.
Genauer gesagt in folgendem Beitrag:
Linux: Automatisiert Posteingang checken und Skript ausführen
Grüße Uwe
So klappts auf dem RasPi. Allerdings nur das Versenden von Emails.
Zusätzlich wenn du ein Attachment mitsenden willst kommt das dazu:
-attach "file.txt,text/plain"
-attach "/usr/file.gif,image/gif"
-attach "file.jpeg,image/jpg"
Beispiel mit der Bild Datei "Tux.jpg" im Verzeichnis:
Wichtig ist das das mailsend Kommando eine komplette Zeile ist !
man mailsend sagt dir wie es geht.
mailsend -to novregen@web.de -from user@mailadresse.de -starttls -port 587 -auth -smtp mail.web.de -sub Testmail +cc +bc -v -user willi -pass "Geheim"
Zusätzlich wenn du ein Attachment mitsenden willst kommt das dazu:
-attach "file.txt,text/plain"
-attach "/usr/file.gif,image/gif"
-attach "file.jpeg,image/jpg"
Beispiel mit der Bild Datei "Tux.jpg" im Verzeichnis:
mailsend -to novregen@web.de -from user@mailadresse.de -starttls -port 587 -auth -smtp mail.web.de -sub Testmail +cc +bc -v -user willi -pass "Geheim" -attach "Tux.jpg,image/jpg"
Wichtig ist das das mailsend Kommando eine komplette Zeile ist !
man mailsend sagt dir wie es geht.
@aqui ich glaube er möchte keine Mail senden sondern den Posteingang checken, davon handelt der Thread hier ja primär .
Stimmt ! Hab die Antwort etwas angepasst
Hier wäre ggf. ein Ansatz...
https://cdn-learn.adafruit.com/downloads/pdf/raspberry-pi-e-mail-notifie ...
Hier wäre ggf. ein Ansatz...
https://cdn-learn.adafruit.com/downloads/pdf/raspberry-pi-e-mail-notifie ...
! UPDATE !
Für alle die den oben stehenden Code mit der IMAPX Bibliothek noch verwenden und auf Probleme mit korrupten Attachments stoßen, es ist nicht euer Fehler! Es ist ein Bug der IMAPX.DLL beim Attachment Parsing wodurch korrupte Attachments entstehen wenn Inline-Attachments vorhanden sind. Hinweis wurde oben explizit ergänzt. Da das Projekt nicht mehr gepflegt wird wird wohl der Bug auch nicht mehr behoben.Deswegen, und da das Feedback auf diesen Thread doch sehr groß ist, poste ich hier noch eine Alternative auf Basis der MAILKIT .NET Bibliothek.
Die nötigen DLLs könnt Ihr euch über NuGet ziehen oder euch aus den Quellen bauen
Doku findet ihr hier:
http://www.mimekit.net/docs/html/Introduction.htm
Für alle die das Skript inklusive DLLs fertig runterladen möchten, könnt Ihr das hier tun:
imap_download_attachments_mailkit_324348.zip (.NET 4.5)
Viel Spaß
Grüße Uwe
Hallo Uwe,
nach relativ kurzem Suchen habe ich Dein Skript gefunden. Das ist genau das was ich brauche, allerdings funktioniert es bei mir nicht.
Beim Statement:
$imap.Connect($IMAP_HOST,$IMAP_PORT,[MailKit.Security.SecureSocketOptions]::SslOnConnect)
kommt folgende Fehlermeldung:
Index was outside the bounds of the array.
At C:\batchskripten\getEmailAttachments.ps1:39 char:5
+ FullyQualifiedErrorId : System.IndexOutOfRangeException
an was kann das denn liegen?
Vielen Dank im Voraus.
Grüße Michael
nach relativ kurzem Suchen habe ich Dein Skript gefunden. Das ist genau das was ich brauche, allerdings funktioniert es bei mir nicht.
Beim Statement:
$imap.Connect($IMAP_HOST,$IMAP_PORT,[MailKit.Security.SecureSocketOptions]::SslOnConnect)
kommt folgende Fehlermeldung:
Index was outside the bounds of the array.
At C:\batchskripten\getEmailAttachments.ps1:39 char:5
$imap.Connect($IMAP_HOST,$IMAP_PORT,[MailKit.Security.SecureSocketOptions]:: ...
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : OperationStopped: ( , IndexOutOfRangeException+ FullyQualifiedErrorId : System.IndexOutOfRangeException
an was kann das denn liegen?
Vielen Dank im Voraus.
Grüße Michael
Hallo Uwe,
irgendwie komme ich nicht weiter. Das Skript soll auf einem Windows Server 2012 R2 Datacenter laufen.
Hier ist das Microsoft .NET Framework 4 Multi- Targeting Pack installiert. Ich habe das .NET 4.8 dazu Installiert, aber es klappt immer noch nicht.
Auf meinem Notebook W10 Pro geht alles.
Kann man bei der Powershell irgendwie einstellen, welches .NET verwendet werden soll?
Grüße,
Michael
irgendwie komme ich nicht weiter. Das Skript soll auf einem Windows Server 2012 R2 Datacenter laufen.
Hier ist das Microsoft .NET Framework 4 Multi- Targeting Pack installiert. Ich habe das .NET 4.8 dazu Installiert, aber es klappt immer noch nicht.
Auf meinem Notebook W10 Pro geht alles.
Kann man bei der Powershell irgendwie einstellen, welches .NET verwendet werden soll?
Grüße,
Michael
Bitte Management Framework aktualisieren, lüppt hier damit hier auf Server 2012R2 einwandfrei.
Zitat von @vogtmi:
wir haben mit dem Skript noch ein kleines Problem. Wenn eine Email nur mit Anhang verschickt wird, also ohne Mailbody, werden die Anhänge nicht gespeichert.
Servus,wir haben mit dem Skript noch ein kleines Problem. Wenn eine Email nur mit Anhang verschickt wird, also ohne Mailbody, werden die Anhänge nicht gespeichert.
hier getestet, keine Probleme. Du hast wahrscheinlich oben das alte Skript mit ImapX.dll verwendet. Es steht oben deutlich das diese Bibliothek Probleme mit dem Attachment-Parser hat. Deswegen die oben verlinkte neue Variante mit Mailkit nutzen!
Grüße Uwe
Zitat von @vogtmi:
Hallo Uwe,
nein nein, ich habe schon die Maikit Variante im Einsatz. Im Webmail Postfach von IONOS sehen diese Emails auch anders aus. Die Büroklammer für das Attachment fehlt in der Übersicht. Ich habe vermutet das liegt am fehlenden Mailbody.
Nein, definitv nicht, wurde hier mehrfach verifiziert.Hallo Uwe,
nein nein, ich habe schon die Maikit Variante im Einsatz. Im Webmail Postfach von IONOS sehen diese Emails auch anders aus. Die Büroklammer für das Attachment fehlt in der Übersicht. Ich habe vermutet das liegt am fehlenden Mailbody.
Wenn die Klammer fehlt ist die Mail entweder nicht standardkonform erstellt worden oder es sind sogenannte Inline-Attachments, diese sind dann gesondert zu behandeln! Das Skript behandelt in dem Beispiel nur "echte" Attachments, Inline-Attavhments wie Bilder die direkt im Mailbody sichtbar sind sind gesondert zu behandeln.
Btw. Lass dich nicht von Webmailern und GUIs täuschen. Als Fakten zählt hier nur das was hinten raus kommt, die RAW Daten der Mail.
Schau dir Mal die Header an und prüfe mit welchem Client die Mail erstellt wurde.
Habe dir eine PN geschickt, du kannst mir gerne so eine Mail mal zukommen lassen wenn das deine/eure Policy zulässt dann kann ich mir des Problems mal annehmen.
Möchtest/kannst du das aus Gründen nicht kannst du dich gerne auch mal selbst um das Debugging kümmern.
Dazu lass dir doch mal in der Schleife eine Ausgabe erzeugen.
Hinter folgende Zeile
Lass dir für einen Vergleich mal folgendes ausgeben.
Einmal die gefilterten Attachments
und zweitens mal das ursprüngliche Array der Attachments mit
Könnte ja irgendwie sein das die Attachments nicht als solche erkannt und deswegen nicht mit dem entsprechenden Flag versehen werden.
Weitergehend kannst du auch die Variable $m und deren Eigenschaften BodyParts, Body usw ausgeben lassen um raus zu finden was an der Mail nicht ganz koscher ist.
Wenn das für dich zu hoch sein sollte, übernehme ich das wie gesagt gerne für dich sofern das Weiterleiten einer Originalnachricht für dich machbar ist.
Grüße Uwe
Möchtest/kannst du das aus Gründen nicht kannst du dich gerne auch mal selbst um das Debugging kümmern.
Dazu lass dir doch mal in der Schleife eine Ausgabe erzeugen.
Hinter folgende Zeile
$attachments = $m.Attachments | ?{$_.IsAttachment
}Lass dir für einen Vergleich mal folgendes ausgeben.
Einmal die gefilterten Attachments
$attachments
$m.Attachments
Weitergehend kannst du auch die Variable $m und deren Eigenschaften BodyParts, Body usw ausgeben lassen um raus zu finden was an der Mail nicht ganz koscher ist.
Wenn das für dich zu hoch sein sollte, übernehme ich das wie gesagt gerne für dich sofern das Weiterleiten einer Originalnachricht für dich machbar ist.
Grüße Uwe
Hallo Marco.
Grüße Uwe
Zitat von @Fly998:
ich habe das Script bei mir auch mal getestet und muss sagen, das funktioniert echt gut. Ich habe aber noch eine Frage, kann ich das Speichern der Anhänge auch auf spezielle Dateiendungen einschränken?
Ja kein Problem, folgende Zeile in der die Attachments vor ausgefiltert werden einfach eine weitere Bedingung ergänzen, hier im Beispiel wären es *.txt und *.pdf welche übernommen werdenich habe das Script bei mir auch mal getestet und muss sagen, das funktioniert echt gut. Ich habe aber noch eine Frage, kann ich das Speichern der Anhänge auch auf spezielle Dateiendungen einschränken?
$attachments = $m.Attachments | ?{$_.IsAttachment -and [IO.Path]::GetExtension($_.Filename) -in @('.txt','.pdf')}
Hallo Uwe,
prinzipiell läuft das echt gut, bei manchen Mails / Anhängen erhalte ich aber folgenden Fehler:
Hast du hier eine Idee zu`?
Viele Grüße
Marco
prinzipiell läuft das echt gut, bei manchen Mails / Anhängen erhalte ich aber folgenden Fehler:
Fehler
Error with Attachment: 'Rechnung: 3500096258.PDF' of Message with ID
'ADR440000006183217000A79C05AF9691EEA81D656C6734FED11@absenderdomian.com': Ausnahme beim Aufrufen von "Create" mit 1
Argument(en): "Das angegebene Pfadformat wird nicht unterstützt."
In Zeile:1 Zeichen:1
Error with Attachment: 'Rechnung: 3500096258.PDF' of Message with ID
'ADR440000006183217000A79C05AF9691EEA81D656C6734FED11@absenderdomian.com': Ausnahme beim Aufrufen von "Create" mit 1
Argument(en): "Das angegebene Pfadformat wird nicht unterstützt."
In Zeile:1 Zeichen:1
Hast du hier eine Idee zu`?
Viele Grüße
Marco
Inklusive Dateiname des Attachments?
Wenn du den "alten" IMAPX.DLL Code von oben benutzt dann wäre das natürlich die primäre Fehlerquelle. Zuverlässig mit Attachments geht nur die verlinkte Mailkit-Variante um.
Vermutlich ist es dann ein ungültiges Zeichen. Im Dateiname ist ein _ sowie ein -
Können die das Problem sein?
Nein.Können die das Problem sein?
Bzw. Was ist denn ein ungültiges Zeichen?
https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-fileWenn du den "alten" IMAPX.DLL Code von oben benutzt dann wäre das natürlich die primäre Fehlerquelle. Zuverlässig mit Attachments geht nur die verlinkte Mailkit-Variante um.
Servus Maik,
richtig hier setzt du das Flag auf "Deleted"
und an der Stelle an der der Ordner geschlossen wird noch den Boolean Wert auf True setzen.
Dieser löst das Expunge des Ordners aus und entfernt zum löschen markierte Nachrichten endgültig aus der Inbox.
Grüße Uwe
richtig hier setzt du das Flag auf "Deleted"
$imap.Inbox.AddFlags($id,[MailKit.MessageFlags]::Deleted,$true)
$imap.Inbox.Close($true)
Grüße Uwe
Hey zusammen,
ich hab irgendwie ein generelle Problem mit dem script. Ich bekomme immer folgende Meldung:
Es handet sich um ein Postfach bei Strato.
Habe auch schon die verschiedenen connect Varianten versucht:
http://www.mimekit.net/docs/html/T_MailKit_Security_SecureSocketOptions ...
Danke für die Hilfe
gruß
gb
ich hab irgendwie ein generelle Problem mit dem script. Ich bekomme immer folgende Meldung:
Ausnahme beim Aufrufen von "Connect" mit 3 Argument(en): "An error occurred while attempting to establish an SSL or TLS connection.
One possibility is that you are trying to connect to a port which does not support SSL/TLS.
The other possibility is that the SSL certificate presented by the server is not trusted by the system for one or more of the following reasons:
1. The server is using a self-signed certificate which cannot be verified.
2. The local system is missing a Root or Intermediate certificate needed to verify the server's certificate.
3. The certificate presented by the server is expired or invalid.
Es handet sich um ein Postfach bei Strato.
Habe auch schon die verschiedenen connect Varianten versucht:
http://www.mimekit.net/docs/html/T_MailKit_Security_SecureSocketOptions ...
Danke für die Hilfe
gruß
gb
Hallo @generalbase,
also ich habe den Connect zu Strato (genutzter Server imap.strato.de auf Port 993) hier mal vollzogen, geht einwandfrei.
Auch der Test zu imap.strato.de:993 mit OpenSSl liefert gültige Zertifikate zurück, wie man hier sieht:
Ich tippe daher bei dir darauf das du entweder den falschen Common-Name zum Verbinden verwendest oder noch die alten Telesec-Root CA Zertifikate in deinem Zertifikate-Store verwendest. Die Zertifikate der Telekom Root-CA wurde vor einigen Monaten zurückgezogen (da von Symantec ausgestellt). Da diese nun ungültig sind kommt es zu dieser Fehlermeldung. Also stelle sicher das du die aktuellen Telesec-CA Zertifikate im System installiert hast.
https://www.telesec.de/de/24-news/664-zertifikatsablauf-deutsche-telekom ...
Man kann zwar das Prüfen der Zertifikate im Skript über einen Server-ValidationCallback abschalten, würde ich aber nicht empfehlen.
Grüße Uwe
p.s. Bitte wende dich für weitere Fragen dazu direk per PN an mich, damit der Thread hier nicht zugemüllt wird! Danke.
-edit- Problem hat sich geklärt. User @generalbase verwendete einen Virenscanner der sich in die Verbindung mit einem selbstsignierten Zertifikat eingeklinkt hat um die Verbindung zu überwachen.
also ich habe den Connect zu Strato (genutzter Server imap.strato.de auf Port 993) hier mal vollzogen, geht einwandfrei.
Auch der Test zu imap.strato.de:993 mit OpenSSl liefert gültige Zertifikate zurück, wie man hier sieht:
CONNECTED(00000003)
depth=2 C = DE, O = T-Systems Enterprise Services GmbH, OU = T-Systems Trust Center, CN = T-TeleSec GlobalRoot Class 2
verify return:1
depth=1 C = DE, O = T-Systems International GmbH, OU = T-Systems Trust Center, ST = Nordrhein Westfalen, postalCode = 57250, L = Netphen, street = Untere Industriestr. 20, CN = TeleSec ServerPass Class 2 CA
verify return:1
depth=0 C = DE, O = Strato AG, OU = Rechenzentrum, ST = Berlin, L = Berlin, CN = imap.strato.de
verify return:1
---
Certificate chain
0 s:C = DE, O = Strato AG, OU = Rechenzentrum, ST = Berlin, L = Berlin, CN = imap.strato.de
i:C = DE, O = T-Systems International GmbH, OU = T-Systems Trust Center, ST = Nordrhein Westfalen, postalCode = 57250, L = Netphen, street = Untere Industriestr. 20, CN = TeleSec ServerPass Class 2 CA
1 s:C = DE, O = T-Systems International GmbH, OU = T-Systems Trust Center, ST = Nordrhein Westfalen, postalCode = 57250, L = Netphen, street = Untere Industriestr. 20, CN = TeleSec ServerPass Class 2 CA
i:C = DE, O = T-Systems Enterprise Services GmbH, OU = T-Systems Trust Center, CN = T-TeleSec GlobalRoot Class 2
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIIRDCCByygAwIBAgIQC/iTzNidAP7qyOWIZLolrTANBgkqhkiG9w0BAQsFADCB
3zELMAkGA1UEBhMCREUxJTAjBgNVBAoMHFQtU3lzdGVtcyBJbnRlcm5hdGlvbmFs
IEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxHDAaBgNVBAgM
E05vcmRyaGVpbiBXZXN0ZmFsZW4xDjAMBgNVBBEMBTU3MjUwMRAwDgYDVQQHDAdO
ZXRwaGVuMSAwHgYDVQQJDBdVbnRlcmUgSW5kdXN0cmllc3RyLiAyMDEmMCQGA1UE
AwwdVGVsZVNlYyBTZXJ2ZXJQYXNzIENsYXNzIDIgQ0EwHhcNMTkwNDAyMDkwNjE2
WhcNMjAwNDA3MjM1OTU5WjB0MQswCQYDVQQGEwJERTESMBAGA1UEChMJU3RyYXRv
IEFHMRYwFAYDVQQLEw1SZWNoZW56ZW50cnVtMQ8wDQYDVQQIEwZCZXJsaW4xDzAN
BgNVBAcTBkJlcmxpbjEXMBUGA1UEAxMOaW1hcC5zdHJhdG8uZGUwggEiMA0GCSqG
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQC0IQb4N1SNU9U9agNRE/xYjmzdlM4HMS8w
vxjoIjA5U4+FczMXVWpSTQpjfNK5Vpim5rTj0vZA6HIGVljqRd09/btwwsOVJsI2
n2LjJxuRI7i4rq3bxJ+xGoWgOuLkGqmyM0wzVom9eV9IZMIimGwHqx32zCxtctQy
dI7REDvC0iFq2emTqXlTOl0mQVvMzp5Yss1uOm7Y41FXjfZyd2SCQgyR9McWC7Hc
JoTY4JRhSIr2rmf4fEu7Zl/nHMm5Ab246gOotd6mOXIHCXuUZ6VNhkSozdVVpa9l
6wdKNf4n8npCnfPJqUsl9cCuXAJJWLqqJxOpaMu80Y1IqrK+MtoxAgMBAAGjggRk
MIIEYDAfBgNVHSMEGDAWgBSUyHRG9Tq0Rkgm+CvKNB5WJgQSADAOBgNVHQ8BAf8E
BAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMB0GA1UdDgQWBBS7
ebHRHLtPFDei6vdariUtnuXydjBaBgNVHSAEUzBRMEUGCisGAQQBvUcNFwEwNzA1
BggrBgEFBQcCARYpaHR0cDovL3d3dy50ZWxlc2VjLmRlL3NlcnZlcnBhc3MvY3Bz
Lmh0bWwwCAYGZ4EMAQICMEsGA1UdHwREMEIwQKA+oDyGOmh0dHA6Ly9jcmwuc2Vy
dmVycGFzcy50ZWxlc2VjLmRlL3JsL1NlcnZlclBhc3NfQ2xhc3NfMi5jcmwwgZkG
CCsGAQUFBwEBBIGMMIGJMDMGCCsGAQUFBzABhidodHRwOi8vb2NzcC5zZXJ2ZXJw
YXNzLnRlbGVzZWMuZGUvb2NzcHIwUgYIKwYBBQUHMAKGRmh0dHA6Ly9jcmwuc2Vy
dmVycGFzcy50ZWxlc2VjLmRlL2NydC9UZWxlU2VjX1NlcnZlclBhc3NfQ2xhc3Nf
Ml9DQS5jZXIwDAYDVR0TAQH/BAIwADAqBgNVHREEIzAhgg5pbWFwLnN0cmF0by5k
ZYIPaW1hcC5zdHJhdG8uY29tMIICbgYKKwYBBAHWeQIEAgSCAl4EggJaAlgAdgBv
U3asMfAxGdiZAKRRFf93FRwR2QLBACkGjbIImjfZEwAAAWndTJPFAAAEAwBHMEUC
IQDPZD2uza2XdCFK4Ujz7CCd2fGh8RgEntmGi6VutwFodgIgDSM1qRFBgNRKikWb
UqljIvQuYz9uZ0D2n8BSDs3O2agAdQBVgdTCFpA2AUrqC5tXPFPwwOQ4eHAlCBcv
o6odBxPTDAAAAWndTJUUAAAEAwBGMEQCIGAZcm/cEmhFJgCKUOg0+me5S3x915mm
wGvRqC7K5M6YAiB3Pfh+stASAJXM/007tHn2yDiYRBLYe30cbe7L6b6BqwB1ALvZ
37wfinG1k5Qjl6qSe0c4V5UKq1LoGpCWZDaOHtGFAAABad1MkzUAAAQDAEYwRAIg
NjKzIWGKnf6KkHDl2J46ve6317miam1odyYxmCtMydcCIEwF9toz9XeRu4G8+hKU
rDtA6C+VolowIymLM7kbtox6AHcApLkJkLQYWBSHuxOizGdwCjw1mAT5G9+443fN
DsgN3BAAAAFp3UyTNAAABAMASDBGAiEAiW87UeX/qwmZOUy6TbLMwxbuYclt2c8j
PoZLph254agCIQDoj9yMefYVp+OPNPFhu5T5T1UmQOGlwzbLvaVLBKoAbwB3AO5L
vbd1zmC64UJpH6vhnmajD35fsHLYgwDEe4l6qP3LAAABad1MkzYAAAQDAEgwRgIh
AK0bquCZK2gdBH1eUn1SwLErEQjLdWCA8sJDDrdjJBMqAiEAk5TBICsgoy0dbtIC
wMJZRkmCYqsyMdzAH+RRZt3yw1kwDQYJKoZIhvcNAQELBQADggEBAKuZTWJLjw+S
vxe0vKDrfeUd2mnUeVYzCo9aWq0Bzpfbk6PsNl6yCFGE4KKF2Uqs6/tjBOgkRBbL
CUlW9DK0cDD0IsTkTPhUQgJ7R5Q0u89Num94rZWBZMQMv2XD///gcM41uWGWX3n2
ZuhE0ZYCZdJS5AXluF2fdXR+q5iNpPs7W5ZEiAyel6xPoNOkkr9/2UNqccEZaPwZ
HIjkKkrm3QTNo3T9UKKWKgYeRFvDK4Kz2rNqPA0i4SAWGY2qR1lHEYmDt8J8SdP/
cXj9BO/WdElC7LNMmybvl8ThOisRZn+TOF7Ql7CIaO0ns3m+LuNzLmv/76J3LgG6
QHlDTv6JEzI=
-----END CERTIFICATE-----
subject=C = DE, O = Strato AG, OU = Rechenzentrum, ST = Berlin, L = Berlin, CN = imap.strato.de
issuer=C = DE, O = T-Systems International GmbH, OU = T-Systems Trust Center, ST = Nordrhein Westfalen, postalCode = 57250, L = Netphen, street = Untere Industriestr. 20, CN = TeleSec ServerPass Class 2 CA
---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 4157 bytes and written 396 bytes
Verification: OK
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---
DONE
Ich tippe daher bei dir darauf das du entweder den falschen Common-Name zum Verbinden verwendest oder noch die alten Telesec-Root CA Zertifikate in deinem Zertifikate-Store verwendest. Die Zertifikate der Telekom Root-CA wurde vor einigen Monaten zurückgezogen (da von Symantec ausgestellt). Da diese nun ungültig sind kommt es zu dieser Fehlermeldung. Also stelle sicher das du die aktuellen Telesec-CA Zertifikate im System installiert hast.
https://www.telesec.de/de/24-news/664-zertifikatsablauf-deutsche-telekom ...
Man kann zwar das Prüfen der Zertifikate im Skript über einen Server-ValidationCallback abschalten, würde ich aber nicht empfehlen.
Grüße Uwe
p.s. Bitte wende dich für weitere Fragen dazu direk per PN an mich, damit der Thread hier nicht zugemüllt wird! Danke.
-edit- Problem hat sich geklärt. User @generalbase verwendete einen Virenscanner der sich in die Verbindung mit einem selbstsignierten Zertifikat eingeklinkt hat um die Verbindung zu überwachen.
Hallo,
habe gerade das Skript installiert und konfiguriert. Alle Dateien sind in einem Verzeichnis unter C:/Benutzer/praxis/ und die Ausfahrterlaubnis ist auf "unrestricted" gesetzt. Ich habe die IMAP-Daten von Gmail in den header eingetragen.
Jetzt bekomme aber folgende Fehlermeldungen:
Add-Type : Die Datei oder Assembly "file:/C:\Users\Praxis\imap_download\MailKit.dll" oder eine Abhängigkeit davon
wurde nicht gefunden. Der Vorgang wird nicht unterstützt. (Ausnahme von HRESULT: 0x80131515)
In C:\Users\Praxis\imap_download\script.ps1:19 Zeichen:1
+ FullyQualifiedErrorId : System.IO.FileLoadException,Microsoft.PowerShell.Commands.AddTypeCommand
Add-Type : Die Datei oder Assembly "file:/C:\Users\Praxis\imap_download\MimeKit.dll" oder eine Abhängigkeit davon
wurde nicht gefunden. Der Vorgang wird nicht unterstützt. (Ausnahme von HRESULT: 0x80131515)
In C:\Users\Praxis\imap_download\script.ps1:20 Zeichen:1
+ FullyQualifiedErrorId : System.IO.FileLoadException,Microsoft.PowerShell.Commands.AddTypeCommand
Add-Type : Die Datei oder Assembly "file:///C:\Users\Praxis\imap_download\BouncyCastle.Crypto.dll" oder eine
Abhängigkeit davon wurde nicht gefunden. Der Vorgang wird nicht unterstützt. (Ausnahme von HRESULT: 0x80131515)
In C:\Users\Praxis\imap_download\script.ps1:21 Zeichen:1
+ FullyQualifiedErrorId : System.IO.FileLoadException,Microsoft.PowerShell.Commands.AddTypeCommand
md : Das Laufwerk wurde nicht gefunden. Ein Laufwerk mit dem Namen "T" ist nicht vorhanden.
In C:\Users\Praxis\imap_download\script.ps1:24 Zeichen:33
+ FullyQualifiedErrorId : DriveNotFound,Microsoft.PowerShell.Commands.NewItemCommand
New-Object : Der Typ [MailKit.Net.Imap.ImapClient] kann nicht gefunden werden. Stellen Sie sicher, dass die Assembly,
die diesen Typ enthält, geladen wird.
In C:\Users\Praxis\imap_download\script.ps1:31 Zeichen:13
+ FullyQualifiedErrorId : TypeNotFound,Microsoft.PowerShell.Commands.NewObjectCommand
Damit kann ich leider nix anfangen, gibt es einen Tip wie ich weitermachen kann?
danke,
Michael
habe gerade das Skript installiert und konfiguriert. Alle Dateien sind in einem Verzeichnis unter C:/Benutzer/praxis/ und die Ausfahrterlaubnis ist auf "unrestricted" gesetzt. Ich habe die IMAP-Daten von Gmail in den header eingetragen.
Jetzt bekomme aber folgende Fehlermeldungen:
Add-Type : Die Datei oder Assembly "file:/C:\Users\Praxis\imap_download\MailKit.dll" oder eine Abhängigkeit davon
wurde nicht gefunden. Der Vorgang wird nicht unterstützt. (Ausnahme von HRESULT: 0x80131515)
In C:\Users\Praxis\imap_download\script.ps1:19 Zeichen:1
Add-Type -Path "$PSScriptRoot\MailKit.dll" -EA Stop
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: ( [Add-Type], FileLoadException+ FullyQualifiedErrorId : System.IO.FileLoadException,Microsoft.PowerShell.Commands.AddTypeCommand
Add-Type : Die Datei oder Assembly "file:/C:\Users\Praxis\imap_download\MimeKit.dll" oder eine Abhängigkeit davon
wurde nicht gefunden. Der Vorgang wird nicht unterstützt. (Ausnahme von HRESULT: 0x80131515)
In C:\Users\Praxis\imap_download\script.ps1:20 Zeichen:1
Add-Type -Path "$PSScriptRoot\MimeKit.dll" -EA Stop
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: ( [Add-Type], FileLoadException+ FullyQualifiedErrorId : System.IO.FileLoadException,Microsoft.PowerShell.Commands.AddTypeCommand
Add-Type : Die Datei oder Assembly "file:///C:\Users\Praxis\imap_download\BouncyCastle.Crypto.dll" oder eine
Abhängigkeit davon wurde nicht gefunden. Der Vorgang wird nicht unterstützt. (Ausnahme von HRESULT: 0x80131515)
In C:\Users\Praxis\imap_download\script.ps1:21 Zeichen:1
Add-Type -Path "$PSScriptRoot\BouncyCastle.Crypto.dll" -EA Stop
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: ( [Add-Type], FileLoadException+ FullyQualifiedErrorId : System.IO.FileLoadException,Microsoft.PowerShell.Commands.AddTypeCommand
md : Das Laufwerk wurde nicht gefunden. Ein Laufwerk mit dem Namen "T" ist nicht vorhanden.
In C:\Users\Praxis\imap_download\script.ps1:24 Zeichen:33
if (!(Test-Path $DOWNLOADPATH)){md $DOWNLOADPATH -Force | out-null}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (T:String) [New-Item], DriveNotFoundException+ FullyQualifiedErrorId : DriveNotFound,Microsoft.PowerShell.Commands.NewItemCommand
New-Object : Der Typ [MailKit.Net.Imap.ImapClient] kann nicht gefunden werden. Stellen Sie sicher, dass die Assembly,
die diesen Typ enthält, geladen wird.
In C:\Users\Praxis\imap_download\script.ps1:31 Zeichen:13
$imap = New-Object MailKit.Net.Imap.ImapClient
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidType: ( [New-Object], PSArgumentException+ FullyQualifiedErrorId : TypeNotFound,Microsoft.PowerShell.Commands.NewObjectCommand
Damit kann ich leider nix anfangen, gibt es einen Tip wie ich weitermachen kann?
danke,
Michael
Servus Michael,
offensichtlich noch Powershell Neuling . Speichere es als Skript *.ps1 ab und führe erst dann aus sonst ist die Variable $psscriptroot nicht gefüllt und er findet die DLL's im selben Verzeichnis nicht.
Zusätzlich stelle sicher das deine Powershell (Management Framework) und .NET Framework aktuell ist.
Du hättest mich dafür auch direkt per PN anschreiben können.
Grüße Uwe
offensichtlich noch Powershell Neuling . Speichere es als Skript *.ps1 ab und führe erst dann aus sonst ist die Variable $psscriptroot nicht gefüllt und er findet die DLL's im selben Verzeichnis nicht.
Zusätzlich stelle sicher das deine Powershell (Management Framework) und .NET Framework aktuell ist.
Du hättest mich dafür auch direkt per PN anschreiben können.
Grüße Uwe
Nur nochmal um Missverständnisse aufzuklären die offensichtlich so mancher User hier hat.
Wenn man das ZIP-File unter Windows herunterlädt und es über die OS eigene ZIP Entpack-Routine entpackt, markiert Windows die DLLs erst mal aus Sicherheitsgründen als "Aus dem Internet heruntergeladen" und vertraut diesen erst einmal nicht, und das Skript schlägt mit den Fehlermeldungen die der User @jelden oben zeigt, fehl weil den DLLs ja erst mal nicht vertraut wird.
Das lässt sich einfach beheben indem man bei allen mitgelieferten DLLs diese einmalig über das Kontextmenü als vertrauenswürdig markiert.
Danach sollte das Skript das Verhalten nicht mehr zeigen.
Ich werde das noch im Skript nachträglich automatisieren. #edit 21.08.2020#: (Ist nun enthalten und wird automatisch freigeschaltet)
Grüße Uwe
Wenn man das ZIP-File unter Windows herunterlädt und es über die OS eigene ZIP Entpack-Routine entpackt, markiert Windows die DLLs erst mal aus Sicherheitsgründen als "Aus dem Internet heruntergeladen" und vertraut diesen erst einmal nicht, und das Skript schlägt mit den Fehlermeldungen die der User @jelden oben zeigt, fehl weil den DLLs ja erst mal nicht vertraut wird.
Das lässt sich einfach beheben indem man bei allen mitgelieferten DLLs diese einmalig über das Kontextmenü als vertrauenswürdig markiert.
Danach sollte das Skript das Verhalten nicht mehr zeigen.
Ich werde das noch im Skript nachträglich automatisieren. #edit 21.08.2020#: (Ist nun enthalten und wird automatisch freigeschaltet)
Grüße Uwe
Hallo Uwe,
ich habe das Script nun auch schon eine Weile laufen. Dabei ist mir aufgefallen das ich mit den immer gleichen Absendern Probleme haben.
Die angehängten Dateien werden vom Script nicht erkannt. Er liest die Mail korrekt, findet aber keinen Anhang.
Beim anschauen der Mail ist mir aufgefallen das der Anhang scheinbar im "mail Quelltext" nicht als Atachment definiert ist:
Hast du dazu eine Idee?
Viele Grüße
Marco
ich habe das Script nun auch schon eine Weile laufen. Dabei ist mir aufgefallen das ich mit den immer gleichen Absendern Probleme haben.
Die angehängten Dateien werden vom Script nicht erkannt. Er liest die Mail korrekt, findet aber keinen Anhang.
Beim anschauen der Mail ist mir aufgefallen das der Anhang scheinbar im "mail Quelltext" nicht als Atachment definiert ist:
Hast du dazu eine Idee?
Viele Grüße
Marco
Servus Marco,
Wenn du auch diese für deinen speziellen Empfänger erfassen willst musst du die Property BodyParts http://www.mimekit.net/docs/html/P_MimeKit_MimeMessage_BodyParts.htm mit einem where-object durchlaufen und den ContentDisposition prüfen und dann diese als Attachments zu behandeln.
Einfaches Beispiel für den Mailkit Code
Mit einem angepassten Regex könntest du auch nach Dateiendungen filtern um nicht evt. Bilder im Mailbody mit zu erfassen. Hier z.B nur für solche als PDF Attachments
Da bist du also vollkommen frei in der Definition was für dich ein Attachment ist und was nicht. Dafür kann Mailkit nichts wenn der Absender die Mails nicht nach Vorschrift verschickt . In solchen Fällen sollte man den Absender zusätzlich auch mal höflich darauf hinweisen das er nicht nach Standard arbeitet sofern möglich, das kommt dann auch anderen zu gute .
Grüße Uwe
Hast du dazu eine Idee?
ja, wie du schon richtig bemerkt hast hat da jemand das Wörtchen "attachment" vergessen im "Content-Disposition" Header und damit sind diese BodyParts keine echten Attachments und logischerweise filtert das Skript diese aus weil es die Property $_.IsAttachment im Where Object prüft. Da aber das Wörtchen "attachment" fehlt, klassifiziert Mailkit diese korrekterweise auch als keine "normalen" Attachments und die "Attachments" Auflistung ist leer.Wenn du auch diese für deinen speziellen Empfänger erfassen willst musst du die Property BodyParts http://www.mimekit.net/docs/html/P_MimeKit_MimeMessage_BodyParts.htm mit einem where-object durchlaufen und den ContentDisposition prüfen und dann diese als Attachments zu behandeln.
Einfaches Beispiel für den Mailkit Code
$attachments = $m.BodyParts | ?{$_.IsAttachment -or $_.ContentDisposition -match 'inline.*filename=.*'}
$attachments = $m.BodyParts | ?{$_.IsAttachment -or $_.ContentDisposition -match 'inline.*filename=.*\.pdf"'}
Grüße Uwe
Hallo Uwe,
wie immer ein sehr hilfreiches Kommentar von dir.
Für einige meiner Problemkandidanten hat dies geholfen, für ein paar spezielle Fälle habe ich noch folgende Zeile eingefügt:
Viele Grüße
Marco
wie immer ein sehr hilfreiches Kommentar von dir.
Für einige meiner Problemkandidanten hat dies geholfen, für ein paar spezielle Fälle habe ich noch folgende Zeile eingefügt:
$attachments = $m.BodyParts | ?{$_.IsAttachment -or $_.ContentType -match 'application.*name=.*\.pdf"'}
Viele Grüße
Marco
Da hat sich wohl einer mit der CPAN Bib beim Mail erstellen versucht und dabei raus gekommen ist so ne Wurst .
Grüße Uwe
Grüße Uwe
Hab da nochmal eine Frage zu dem Script
Sucht in diesem Beispiel ungelesene Nachrichten mit einem Betreff der "Testnachricht" enthält.
Kann ich das auch mit einer Wildcard versehen? will nur einen bestimmten Datentypen herunterladen.
habe es so versucht
aber leider macht er das nicht. muss ich da noch was anderes berücksichtigen?
> $messages = $imap.Folders.Inbox.Search("UNSEEN SUBJECT `"Testnachricht`"",[ImapX.Enums.MessageFetchMode]::Full,1000)
>
Kann ich das auch mit einer Wildcard versehen? will nur einen bestimmten Datentypen herunterladen.
habe es so versucht
$messages = $imap.Folders.Inbox.Search("UNSEEN SUBJECT `"*.xls`"",[ImapX.Enums.MessageFetchMode]::Full,1000)
Servus @BlueEyePhoenix,
Du meinst das IMAPX Script? Wenn ja, würde ich dringend zu meiner MailKit Variante raten. die IMAPX Bibliothek hat einen fehlerhaften Attachment-Parser!
Sucht in diesem Beispiel ungelesene Nachrichten mit einem Betreff der "Testnachricht" enthält.
Kann ich das auch mit einer Wildcard versehen? will nur einen bestimmten Datentypen herunterladen.
Was heißt hier Datentyp? Du meinst nur Nachricht mit Attachments mit bestimmten Dateiendungen?
Wenn ja dann prüfst du die Nachricht in den Attachments auf die Extensions der Attachments also
Auszug aus den RFCs
Mehr Details zur IMAP SEARCH SYNTAX kannst du in den RFCs nachschlagen
https://tools.ietf.org/html/rfc3501#section-6.4.4
Grüße Uwe
Du meinst das IMAPX Script? Wenn ja, würde ich dringend zu meiner MailKit Variante raten. die IMAPX Bibliothek hat einen fehlerhaften Attachment-Parser!
>> $messages = $imap.Folders.Inbox.Search("UNSEEN SUBJECT `"Testnachricht`"",[ImapX.Enums.MessageFetchMode]::Full,1000)
>>
Kann ich das auch mit einer Wildcard versehen? will nur einen bestimmten Datentypen herunterladen.
Wenn ja dann prüfst du die Nachricht in den Attachments auf die Extensions der Attachments also
# ....
if ([IO.Path]::GetExtension($a.Filename) -eq '.xls'){
# ..... nur xls attachments verarbeiten
}
#.....
habe es so versucht
aber leider macht er das nicht. muss ich da noch was anderes berücksichtigen?
IMAP Searches sind per Default Wildcard searches, das Sternchen muss also weg, außerdem matcht das dann nur wenn .xls im Subject vorkommt nicht als Attachement.$messages = $imap.Folders.Inbox.Search("UNSEEN SUBJECT `"*.xls`"",[ImapX.Enums.MessageFetchMode]::Full,1000)
Auszug aus den RFCs
In all search keys that use strings, a message matches the key if
the string is a substring of the field. The matching is
case-insensitive.
Mehr Details zur IMAP SEARCH SYNTAX kannst du in den RFCs nachschlagen
https://tools.ietf.org/html/rfc3501#section-6.4.4
Grüße Uwe
Zitat von @colinardo:
Hallo Marco.
Ja kein Problem, folgende Zeile in der die Attachments vor ausgefiltert werden einfach eine weitere Bedingung ergänzen, hier im Beispiel wären es *.txt und *.pdf welche übernommen werden
Grüße Uwe
Hallo Marco.
Ja kein Problem, folgende Zeile in der die Attachments vor ausgefiltert werden einfach eine weitere Bedingung ergänzen, hier im Beispiel wären es *.txt und *.pdf welche übernommen werden
$attachments = $m.Attachments | ?{$_.IsAttachment -and [IO.Path]::GetExtension($_.Filename) -in @('.txt','.pdf')}
Hallo Uwe,
habe mir das Skript von dir besorgt, funktioniert soweit schonmal klasse :D
Nun noch eine Frage:
ich habe es mit deinem Vorschlag so umgesetzt, dass nur noch PDF Dateien abgespeichert werden.
Gibt es irgendwie eine Möglichkeit, dass dann auch nur die Dateien als gelesen markiert werden, welche auch durch das Skript abgespeichert worden sind?
Also wenn z.B. jemand an die Mail Adresse eine .doc bzw .xlxs Datei schickt, wird diese nicht abgespeichert. Nun sollte diese Datei im E-Mail Programm weiterhin als ungelesen stehen bleiben. Dann sieht man im manuellen Durchgang, dass da was nicht passt.
Gibt es die Möglichkeit?
Viele Grüße
Vooodoopupp
Servus @Voodoopupp.
an das Ende der If-Prüfung die auf Attachments prüft
Grüße Uwe
Gibt es irgendwie eine Möglichkeit, dass dann auch nur die Dateien als gelesen markiert werden, welche auch durch das Skript abgespeichert worden sind?
Ja dazu verschiebst du diese Zeile$folder.AddFlags($id,$msgflag,$true)
if ($attachments.Count -gt 0){
# ....
$folder.AddFlags($id,$msgflag,$true)
}
Eine Kleinigkeit ist mir jetzt noch aufgefallen. Hat mich etwas Zeit gekostet, weil ich dachte das Skript funktioniert nicht mehr, nachdem ich es in einen anderen Ordner verschoben hatte.
Folgender Fehler passiert nun:
Die Meldung "No unseen message in inbox." macht natürlich jetzt nur bedingt Sinn.
Wenn nur Mails mit PDF Anhang im Posteingang liegen, dann wird durch das Skript alles auf gelesen gesetzt. Beim nächsten Aufruf erscheint dann korrekterweise "No unseen message in inbox".
Wenn aber nun eine der Dateien einen anderen Dateianhang hat statt der PDF wird diese ja nicht als gelesen markiert.
Nun erscheint dann beim nächsten Durchlauf des Skriptes weder die Information für die Speicherung von Anhängen und ebensowenig erscheint nun die Meldung "No unseen messages in inbox", denn es liegt ja weiterhin eine ungelesene Nachricht vor.
Kann man das noch so abfangen, dass es ebenso noch eine Meldung gibt, die darauf hinweist, dass ungelesene Nachrichten vorliegen, diese aber falsche Anhänge haben?
Habe es mit einer elseif Abfrage versucht, hat aber leider nicht so ganz funktioniert.
Grüße
Voodoopupp
Wenn nämlich nun also fälschlicherweise noch eine nic
Folgender Fehler passiert nun:
Die Meldung "No unseen message in inbox." macht natürlich jetzt nur bedingt Sinn.
Wenn nur Mails mit PDF Anhang im Posteingang liegen, dann wird durch das Skript alles auf gelesen gesetzt. Beim nächsten Aufruf erscheint dann korrekterweise "No unseen message in inbox".
Wenn aber nun eine der Dateien einen anderen Dateianhang hat statt der PDF wird diese ja nicht als gelesen markiert.
Nun erscheint dann beim nächsten Durchlauf des Skriptes weder die Information für die Speicherung von Anhängen und ebensowenig erscheint nun die Meldung "No unseen messages in inbox", denn es liegt ja weiterhin eine ungelesene Nachricht vor.
Kann man das noch so abfangen, dass es ebenso noch eine Meldung gibt, die darauf hinweist, dass ungelesene Nachrichten vorliegen, diese aber falsche Anhänge haben?
Habe es mit einer elseif Abfrage versucht, hat aber leider nicht so ganz funktioniert.
Grüße
Voodoopupp
Wenn nämlich nun also fälschlicherweise noch eine nic
@Voodoopupp (pers. Anpassung siehe dein pers. Posteingang).
if ($attachments.Count -gt 0) {
...
# markiere die Nachricht wie gewünscht (als "gelesen" oder "gelöscht")
$folder.AddFlags($id,$msgflag,$true)
} else {
write-host "Unpermitted Attachment found." -ForegroundColor Red
}
Also so klappt es zumindest, dass es immer eine Meldung gibt, sobald ein unerlaubter Anhang beigefügt ist.
Allerdings wir das dann eben nicht als einzelner Hinweis ausgegeben, sondern für jede einzelne E-Mail, die einen unerlaubten Anhang hat.
Eventuell gibt es ja eine schönere Variante die das allgemein auf der gleichen "Stufe" wie auch die Prüfung ob neue Mails vorliegen oder nicht.
Grüße
Voodoopupp
Also eine Sache wäre mir noch aufgefallen, was vielleicht noch eine Verbesserung darstellen würde - sofern das nicht nur mich betrifft.
Habe das Skript in die Windows Aufgabenplanung eingestellt. Hat nun auch mehrere Tage problemlos funktioniert. Warum auch immer gibt es aber nun ein Problem, so dass das Ziel nicht erreichbar:
Wenn ich es richtig sehe, wird der Code zum Abholen der Daten dennoch ausgeführt und dann werden die Dateien natürlich als heruntergeladen markiert. Sinnvollerweise sollte das aber abgefangen werden, so dass dies auch wirklich nur geschieht, wenn das Downloadverzeichnis auch wirklich beschreibbar ist.
Denke, das würde generell Sinn ergeben.
Grüße
Voodoopupp
Habe das Skript in die Windows Aufgabenplanung eingestellt. Hat nun auch mehrere Tage problemlos funktioniert. Warum auch immer gibt es aber nun ein Problem, so dass das Ziel nicht erreichbar:
if (!(Test-Path $DOWNLOADPATH)){md $DOWNLOADPATH -Force | out-null}
Der Benutzername oder das Kennwort ist falsch. : '\\NAS-Laufwerk\Zielordner'
Wenn ich es richtig sehe, wird der Code zum Abholen der Daten dennoch ausgeführt und dann werden die Dateien natürlich als heruntergeladen markiert. Sinnvollerweise sollte das aber abgefangen werden, so dass dies auch wirklich nur geschieht, wenn das Downloadverzeichnis auch wirklich beschreibbar ist.
Denke, das würde generell Sinn ergeben.
Grüße
Voodoopupp
Es hindert dich niemand daran selbst ein
an den Anfang des Skriptes zu platzieren oder ein TryCatch zu benutzen 😉. Das war und ist nur ein Grundgerüst und wurde nicht für jeden erdenklichen Anwendungsfall entworfen, jeder hat seinen eigenen Workflow und andere Voraussetzungen und Erfordernisse.
-closed-
$ErrorActionPreference = 'Stop'
-closed-