androxin
Goto Top

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. face-sad

Content-Key: 324348

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

Printed on: April 16, 2024 at 15:04 o'clock

Mitglied: 131381
131381 Dec 20, 2016 updated at 16:24:59 (UTC)
Goto Top
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ß
Member: Androxin
Androxin Dec 20, 2016 at 16:29:15 (UTC)
Goto Top
Vielen Dank für den schnellen Denkanstoß.

Ich schau mir das mal an. face-smile
Member: aqui
aqui Dec 20, 2016 updated at 16:40:09 (UTC)
Goto Top
Für einen Linuxer ne Lachnummer...

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 !
Mitglied: 131381
131381 Dec 20, 2016 at 16:38:53 (UTC)
Goto Top
@aqui
Nur das er Mails nicht senden sondern empfangen will face-smile
Member: aqui
aqui Dec 20, 2016 at 16:39:51 (UTC)
Goto Top
Ooops sorry... Da hatte ich wohl deine Sonnenbrille auf !!! face-big-smile
Member: colinardo
Solution colinardo Dec 20, 2016, updated at Oct 26, 2020 at 15:54:47 (UTC)
Goto Top
- edit vom 21.06.2019 -

ACHTUNG HINWEIS: Der Attachment-Parser der 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.
back-to-topEin Beispiel mit der Mailkit Bibliothek habe ich hier unten im Thread gepostet.

back-to-topimap_download_attachments_mailkit_324348.zip (.NET 4.5)


- end edit -

Servus Androxin,

habe dir mal ein Powershell-Skript mit der ImapX.dll Bibliothek geschrieben (zur Info: die kompilierte DLL ist gegen .NET 4.0 kompiliert):
Das Paket kannst du inkl. DLL hier herunterladen: imap_download_attachments_324348.zip

Die DLL habe ich deswegen ins Paket gepackt, da die Stable-Version die dort im Moment zum Download steht einen Bug hat der verhindert das Attachments heruntergeladen werden können. Dieser ist aber in dem letzten Patch behoben. Du kannst dir die DLL auch mit den Sourcen und Visual Studio selbst kompilieren wenn du willst.

Das Skript durchläuft alle ungelesenen Nachrichten im Posteingang und speichert alle Attachments in einem Ordner. Sollte im Downloadordner schon eine Datei mit dem gleichen Namen existieren, wird an den Dateinamen so lange eine Zahl angehängt bis ein Dateiname frei ist. Danach wird die Nachricht als "gelesen" markiert.

Der QuellCode des Scripts (Variablen / IMAP Parameter im Kopf anpassen)
(c) @colinardo on administrator.de
# ---------------------------------
# Download-Pfad
$DOWNLOADPATH = 'D:\Daten\Download'  
# IMAP-Host
$IMAP_HOST = 'imap.domain.de'  
# IMAP-Port
$IMAP_PORT = 993
# IMAP USERNAME
$IMAP_USERNAME = 'USERNAME'  
# IMAP PASSWORD
$IMAP_PASSWORD = 'GEHEIM'  
# SSL verwenden
$IMAP_USESSL = $true
# ---------------------------------
if ($PSVersionTable.PSVersion.Major -lt 3){write-host "ERROR: Minimum Powershell Version 3.0 is required!" -F Yellow; return}    
# IMAPX DLL laden
Add-Type -Path "$PSScriptRoot\ImapX.dll"  
# Ordner erstellen wenn er nicht existiert
if (!(Test-Path $DOWNLOADPATH)){md $DOWNLOADPATH -Force | out-null}
# IMAPX Eigenschaften festlegen
$imap = New-Object ImapX.ImapClient
$imap.Behavior.MessageFetchMode = [ImapX.Enums.MessageFetchMode]::Full
$imap.Host = $IMAP_HOST
$imap.Port = $IMAP_PORT
$imap.UseSsl = $IMAP_USESSL
try{
    # Verbinden
    $imap.Connect() | out-null
    # Login
    $imap.Login($IMAP_USERNAME,$IMAP_PASSWORD) | out-null
    # ungelesene Nachrichten im Posteingang laden
    $messages = $imap.Folders.Inbox.Search("UNSEEN",[ImapX.Enums.MessageFetchMode]::Full,1000)  
    # wenn es Nachrichten gibt
    if($messages.Count -gt 0){
        # Für jede Nachricht
        foreach ($m in $messages){
            # Durchlaufe jedes Attachment
            foreach($a in $m.Attachments){
                try{
                    # Ist das Attachment aus einem Grund noch nicht heruntergeladen, lade es
                    if (!$a.Downloaded){$a.Download()}
                    # Zieldateiname  = Dateiname des Original-Attachments
                    $targetfile = $a.FileName; $cnt = 1
                    # Sollte bereits eine Datei mit diesem Zielnamen im Download-Ordner existieren hänge an den Namen so lange eine
                    # Zahl an _NN bis der Name frei ist.
                    while(Test-Path "$DOWNLOADPATH\$targetfile"){  
                        $targetfile = "$([IO.Path]::GetFileNameWithoutExtension($a.Filename))_$("{0:00}" -f $cnt)$([IO.Path]::GetExtension($a.Filename))"  
                        $cnt++
                    }
                    write-host "Saving Attachment '$targetfile' ($("{0:F3} MB" -F ($a.FileSize / 1MB))) ... " -NoNewline -ForegroundColor Green  
                    $a.Save($DOWNLOADPATH,$targetfile)
                    Write-Host "Done." -ForegroundColor Green  
                }catch{
                    write-Error "Error with Attachment: '$($a.FileName)' of Message with ID '$($m.MessageId)': $($_.Exception.Message)" -EA Continue  
                }
            }
            # markiere die Nachricht als gelesen
            $m.Seen = $true
        }
    }else{
        # Keine ungelesenen Nachrichten vorhanden
        write-host "No unseen message in inbox."  
    }
    # Beende Session
    $imap.Disconnect()
}catch{
    throw $_
}finally{
    $imap.Dispose()
}

Grüße Uwe
Member: Xaivia
Xaivia Jul 16, 2018 at 12:19:32 (UTC)
Goto Top
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
Member: Androxin
Androxin Jul 16, 2018 at 12:42:34 (UTC)
Goto Top
Zitat von @Xaivia:


"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.

Lässt sich dein Exchange überhaupt über IMAP ansprechen? Normalerweise nutzt der übrigens MAPI.
Member: colinardo
colinardo Jul 16, 2018 updated at 12:54:55 (UTC)
Goto Top
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.
Member: BlueEyePhoenix
BlueEyePhoenix Sep 21, 2018 at 09:08:12 (UTC)
Goto Top
Hallo,

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.
Member: colinardo
colinardo Sep 21, 2018 updated at 09:44:43 (UTC)
Goto Top
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,
if ($m.Subject -like '*Testsubject*'){  
    # hier gehts weiter
}
oder effektiver gleich in der IMAP Search Phrase die passenden Nachrichten ausfiltern.
$messages = $imap.Folders.Inbox.Search("UNSEEN SUBJECT `"Testnachricht`"",[ImapX.Enums.MessageFetchMode]::Full,1000)
Sucht in diesem Beispiel ungelesene Nachrichten mit einem Betreff der "Testnachricht" enthält.
Member: albin63
albin63 Nov 25, 2018 at 23:49:15 (UTC)
Goto Top
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

back-to-top$messages = $imap.Folders.Inbox.Search("UNSEEN",[ImapX.Enums.MessageFetchMod ...

back-to-top~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : InvalidOperation: (face-smile [], 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
Member: colinardo
colinardo Nov 26, 2018 updated at 10:58:19 (UTC)
Goto Top
Servus Albin, willkommen auf Administrator.de!
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 face-wink.
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.
Was du nun machst ist folgendes:
Lass dir mit
$imap.Folders.Name
alle Ordner auflisten und dann ersetzt du die Zeile in der die Nachrichten gesucht werden durch:
$imap.Folders['NAME DES INBOX ORDNERS'].Search( ..................  
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
Member: novregen
novregen Dec 07, 2018 at 11:16:45 (UTC)
Goto Top
Hallo Uwe,

kann man sowas auch auf einem Raspberry einsetzen oder einer Synology ?
Member: colinardo
colinardo Dec 07, 2018 updated at 12:00:45 (UTC)
Goto Top
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
Member: aqui
aqui Dec 07, 2018 updated at 12:02:16 (UTC)
Goto Top
So klappts auf dem RasPi. Allerdings nur das Versenden von Emails.
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. face-wink
Member: colinardo
colinardo Dec 07, 2018 updated at 12:03:04 (UTC)
Goto Top
@aqui ich glaube er möchte keine Mail senden sondern den Posteingang checken, davon handelt der Thread hier ja primär face-wink.
Member: aqui
aqui Dec 07, 2018 updated at 12:05:56 (UTC)
Goto Top
Stimmt ! Hab die Antwort etwas angepasst face-wink
Hier wäre ggf. ein Ansatz...
https://cdn-learn.adafruit.com/downloads/pdf/raspberry-pi-e-mail-notifie ...
Member: novregen
novregen Dec 14, 2018 at 12:05:00 (UTC)
Goto Top
Ja ich möchte nur email abrufen ggfs. prüfen ob die email von adresse xx ist und dann den anhang auf der synology ablegen.
Gibt es da vielleicht auch was fertiges ? oder kann man das auch mit der Syno Email hinkriegen ?
Member: colinardo
Solution colinardo Jun 21, 2019, updated at Aug 15, 2019 at 09:47:32 (UTC)
Goto Top

back-to-top! 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:

back-to-topimap_download_attachments_mailkit_324348.zip (.NET 4.5)


Viel Spaß
Grüße Uwe
Member: vogtmi
vogtmi Jul 01, 2019 at 12:49:45 (UTC)
Goto Top
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

back-to-top$imap.Connect($IMAP_HOST,$IMAP_PORT,[MailKit.Security.SecureSocketOptions]:: ...

back-to-top~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : OperationStopped: (face-smile , IndexOutOfRangeException
+ FullyQualifiedErrorId : System.IndexOutOfRangeException


an was kann das denn liegen?

Vielen Dank im Voraus.

Grüße Michael
Member: colinardo
colinardo Jul 01, 2019 updated at 12:57:09 (UTC)
Goto Top
Servus Michael.
Die falschen DLLs nicht fürs passende .NET genommen, bzw. nicht alle eingebunden.

Grüße Uwe
Member: vogtmi
vogtmi Jul 01, 2019 at 14:26:01 (UTC)
Goto Top
Super, vielen Dank. Dann checke ich das mal.

Viele Grüße, Michael
Member: vogtmi
vogtmi Jul 03, 2019 at 10:34:08 (UTC)
Goto Top
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
Member: colinardo
colinardo Jul 03, 2019 updated at 13:32:29 (UTC)
Goto Top
Bitte Management Framework aktualisieren, lüppt hier damit hier auf Server 2012R2 einwandfrei.
Member: vogtmi
vogtmi Jul 03, 2019 at 13:46:24 (UTC)
Goto Top
Suuuuper, jetzt läuft es.

Vielen tausend Dank!!!
Member: colinardo
colinardo Jul 03, 2019 at 13:47:44 (UTC)
Goto Top
Keine Ursache face-smile.
Member: vogtmi
vogtmi Oct 11, 2019 at 09:29:44 (UTC)
Goto Top
Hallo Uwe,

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.

Hast Du vielleicht hierfür auch eine Lösung parat?

Danke un Gruß,

Michael
Member: colinardo
colinardo Oct 11, 2019 updated at 13:02:09 (UTC)
Goto Top
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,
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
Member: vogtmi
vogtmi Oct 14, 2019 at 06:33:14 (UTC)
Goto Top
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.

VG Michael
Member: colinardo
colinardo Oct 14, 2019 updated at 07:43:43 (UTC)
Goto Top
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.
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.
Member: vogtmi
vogtmi Oct 14, 2019 at 09:46:47 (UTC)
Goto Top
Die "fehlerhaften" Mails werden von SAP erstellt und unsere Lieferanten können oder wollen hier nichts anpassen.
Member: colinardo
colinardo Oct 14, 2019 updated at 10:15:47 (UTC)
Goto Top
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
$attachments = $m.Attachments | ?{$_.IsAttachment}
Lass dir für einen Vergleich mal folgendes ausgeben.
Einmal die gefilterten Attachments
$attachments
und zweitens mal das ursprüngliche Array der Attachments mit
$m.Attachments
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
Member: Fly998
Fly998 Oct 25, 2019 at 11:29:51 (UTC)
Goto Top
Hallo Uwe,

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?

Viele Grüße
Marco
Member: colinardo
colinardo Oct 25, 2019 updated at 11:39:48 (UTC)
Goto Top
Hallo Marco.
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 werden
$attachments = $m.Attachments | ?{$_.IsAttachment -and [IO.Path]::GetExtension($_.Filename) -in @('.txt','.pdf')}  
Grüße Uwe
Member: Fly998
Fly998 Oct 28, 2019 at 06:36:14 (UTC)
Goto Top
Vielen Dank, funktioniert super !
Member: Fly998
Fly998 Nov 15, 2019 at 09:01:11 (UTC)
Goto Top
Hallo Uwe,

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

Hast du hier eine Idee zu`?

Viele Grüße
Marco
Member: colinardo
colinardo Nov 15, 2019 updated at 09:17:31 (UTC)
Goto Top
Servus Marco.
Das angegebene Pfadformat wird nicht unterstützt."
Jepp, Pfad wird bei dir zu lang. (>255 Zeichen), oder Dateiname enthält ungültige Zeichen. In dem Fall musst du Abkürzungs-/Replacement-maßnahmen für den Namen der Attachments treffen.

Grüße Uwe
Member: Fly998
Fly998 Nov 15, 2019 at 09:58:26 (UTC)
Goto Top
Hallo Uwe,

zu lang ist der Pfad nicht, der hat nur 50 Zeichen. Vermutlich ist es dann ein ungültiges Zeichen. Im Dateiname ist ein _ sowie ein -
Können die das Problem sein? Bzw. Was ist denn ein ungültiges Zeichen?

Viele Grüße
Marco
Member: colinardo
colinardo Nov 15, 2019 updated at 10:03:34 (UTC)
Goto Top
Zitat von @Fly998:
zu lang ist der Pfad nicht, der hat nur 50 Zeichen.
Inklusive Dateiname des Attachments?
Vermutlich ist es dann ein ungültiges Zeichen. Im Dateiname ist ein _ sowie ein -
Können die das Problem sein?
Nein.
Bzw. Was ist denn ein ungültiges Zeichen?
https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file

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.
Member: Fly998
Fly998 Nov 15, 2019 at 10:35:07 (UTC)
Goto Top
ich denke ich habe es gefunden... da ist ein : im Dateinamen.
Beim Speichern aus dem Webmail wird daraus direkt ein _ gemacht, daher ist mir das nicht gleich aufgefallen. Mal schauen ob ich hierzu eine Lösung finde.

Danke Uwe
Member: mabo75
mabo75 Dec 18, 2019 at 20:59:06 (UTC)
Goto Top
Hallo Uwe,
das ist genau was ich gesucht habe. Hatte leider erst die vorige Variante.

Gibt es auch die Möglichkeit das die eMail dann gelöscht wird ... ?

Also an dieser Stelle ?
# markiere die Nachricht als gelesen
$imap.Inbox.AddFlags($id,[MailKit.MessageFlags]::Seen,$true)

Gruss Maik
Member: colinardo
colinardo Dec 18, 2019 updated at 21:58:48 (UTC)
Goto Top
Servus Maik,
richtig hier setzt du das Flag auf "Deleted"
$imap.Inbox.AddFlags($id,[MailKit.MessageFlags]::Deleted,$true)
und an der Stelle an der der Ordner geschlossen wird noch den Boolean Wert auf True setzen.
$imap.Inbox.Close($true)
Dieser löst das Expunge des Ordners aus und entfernt zum löschen markierte Nachrichten endgültig aus der Inbox.

Grüße Uwe
Member: generalbase
generalbase Feb 18, 2020 at 09:29:57 (UTC)
Goto Top
Hey zusammen,

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
Member: colinardo
colinardo Feb 18, 2020 updated at 11:43:09 (UTC)
Goto Top
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:
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.
Member: jelden
jelden Aug 21, 2020 updated at 09:55:24 (UTC)
Goto Top
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

back-to-topAdd-Type -Path "$PSScriptRoot\MailKit.dll" -EA Stop

back-to-top~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : NotSpecified: (face-smile [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

back-to-topAdd-Type -Path "$PSScriptRoot\MimeKit.dll" -EA Stop

back-to-top~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : NotSpecified: (face-smile [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

back-to-topAdd-Type -Path "$PSScriptRoot\BouncyCastle.Crypto.dll" -EA Stop

back-to-top~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : NotSpecified: (face-smile [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

back-to-topif (!(Test-Path $DOWNLOADPATH)){md $DOWNLOADPATH -Force | out-null}

back-to-top~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ 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

back-to-top$imap = New-Object MailKit.Net.Imap.ImapClient

back-to-top~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : InvalidType: (face-smile [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
Member: colinardo
colinardo Aug 21, 2020 updated at 09:59:15 (UTC)
Goto Top
Servus Michael,
offensichtlich noch Powershell Neuling face-wink. 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
Member: colinardo
colinardo Aug 21, 2020 updated at 11:49:16 (UTC)
Goto Top
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.

screenshot

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
Member: Fly998
Fly998 Oct 26, 2020 at 14:01:18 (UTC)
Goto Top
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:
mail

Hast du dazu eine Idee?

Viele Grüße
Marco
Member: colinardo
colinardo Oct 26, 2020 updated at 15:52:08 (UTC)
Goto Top
Servus Marco,
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=.*'}
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
$attachments = $m.BodyParts | ?{$_.IsAttachment -or $_.ContentDisposition -match 'inline.*filename=.*\.pdf"'}
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 face-smile. 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 face-wink.

Grüße Uwe
Member: Fly998
Fly998 Oct 26, 2020 at 16:30:40 (UTC)
Goto Top
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:

$attachments = $m.BodyParts | ?{$_.IsAttachment -or $_.ContentType -match 'application.*name=.*\.pdf"'}  

Viele Grüße
Marco
Member: colinardo
colinardo Oct 26, 2020 updated at 17:03:28 (UTC)
Goto Top
Da hat sich wohl einer mit der CPAN Bib beim Mail erstellen versucht und dabei raus gekommen ist so ne Wurst face-wink.

Grüße Uwe
Member: BlueEyePhoenix
BlueEyePhoenix May 07, 2021 updated at 08:29:07 (UTC)
Goto Top
Hab da nochmal eine Frage zu dem Script

> $messages = $imap.Folders.Inbox.Search("UNSEEN SUBJECT `"Testnachricht`"",[ImapX.Enums.MessageFetchMode]::Full,1000)  
> 
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

$messages = $imap.Folders.Inbox.Search("UNSEEN SUBJECT `"*.xls`"",[ImapX.Enums.MessageFetchMode]::Full,1000)  
aber leider macht er das nicht. muss ich da noch was anderes berücksichtigen?
Member: colinardo
colinardo May 07, 2021 updated at 08:53:44 (UTC)
Goto Top
Servus @BlueEyePhoenix,
Zitat von @BlueEyePhoenix:

Hab da nochmal eine Frage zu dem Script
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)  
>> 
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
# ....
if ([IO.Path]::GetExtension($a.Filename) -eq '.xls'){  
    # ..... nur xls attachments verarbeiten
}
#.....

habe es so versucht

$messages = $imap.Folders.Inbox.Search("UNSEEN SUBJECT `"*.xls`"",[ImapX.Enums.MessageFetchMode]::Full,1000)  
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.

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
Member: BlueEyePhoenix
BlueEyePhoenix May 07, 2021 at 10:03:25 (UTC)
Goto Top
Danke Uwe,

das mit dem If war genau die Lösung die ich benötigt habe.
Member: Voodoopupp
Voodoopupp Jan 31, 2024 at 16:16:25 (UTC)
Goto Top
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
$attachments = $m.Attachments | ?{$_.IsAttachment -and [IO.Path]::GetExtension($_.Filename) -in @('.txt','.pdf')}  
Grüße Uwe

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
Member: colinardo
colinardo Jan 31, 2024 updated at 16:39:12 (UTC)
Goto Top
Servus @Voodoopupp.
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)
an das Ende der If-Prüfung die auf Attachments prüft
if ($attachments.Count -gt 0){
    # ....
    $folder.AddFlags($id,$msgflag,$true)
}
Grüße Uwe
Member: Voodoopupp
Voodoopupp Feb 01, 2024 at 08:31:26 (UTC)
Goto Top
Hallo Uwe,

super genial, funktioniert wie gewollt face-smile

Ich danke dir vielmals!

Grüße
Voodoopupp
Member: colinardo
colinardo Feb 01, 2024 at 08:34:14 (UTC)
Goto Top
Immer gerne 👍.
Member: Voodoopupp
Voodoopupp Feb 01, 2024 at 11:17:46 (UTC)
Goto Top
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
Member: colinardo
colinardo Feb 01, 2024 updated at 11:36:10 (UTC)
Goto Top
@Voodoopupp (pers. Anpassung siehe dein pers. Posteingang).
Member: Voodoopupp
Voodoopupp Feb 01, 2024 at 11:35:28 (UTC)
Goto Top
            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
Member: Voodoopupp
Voodoopupp Feb 14, 2024 at 13:37:47 (UTC)
Goto Top
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:
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
Member: colinardo
colinardo Feb 14, 2024 updated at 14:32:49 (UTC)
Goto Top
Es hindert dich niemand daran selbst ein
$ErrorActionPreference = 'Stop'  
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-