simonfcz1996
Goto Top

Powershell Skript zum auslesen von PDF Dateien aus E-Mail

Hallo Zusammen

Ich schreibe ein Powershell Skript, dass in einem E-Mail Postfach alle ungelesenen E-Mails durchgehen soll und wenn ein Anhang (PDF Dateien) dabei ist, soll der Anhang im Filesystem gespeichert werden. Der Name der Datei soll dabei die Empfangszeit der Mail sein.

Das hier habe ich bis jetzt aber es passiert leider nichts wenn ich es ausführe:


Add-type -assembly "Microsoft.Office.Interop.Outlook" | out-null  

$olFolders = "Microsoft.Office.Interop.Outlook.olDefaultFolders" -as [type]  

$o = New-Object -comobject outlook.application
$n = $o.GetNamespace("MAPI")  
$f = $n.getDefaultFolder($olFolders::olFolderInBox)
$m = $f.Items

$filepath = "C:\Temp"  


if ($m.UnRead -eq $true)
{
    $f.Items | foreach 
    {
        $Time = $_.ReceivedTime
        $TIme.Tostring("MMddyyyyHHmmss")   
        $_.attachments | foreach 
        {
            Write-Host $_.filename
            $a = $_.filename
            If ($a.Contains("pdf"))  
            {
                $_.saveasfile((Join-Path $filepath "$Time.pdf"))  
                $m.UnRead = $false
            }
        }
    }
}


$o.Quit()

Kann mir jemand weiterhelfen? Ich bin leider nicht sehr gut in Powershell und brauche Hilfe.
Vielen Dank schon im voraus!

Content-ID: 582335

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

Ausgedruckt am: 26.11.2024 um 12:11 Uhr

colinardo
Lösung colinardo 26.06.2020, aktualisiert am 30.06.2020 um 12:19:48 Uhr
Goto Top
Servus @simonfcz1996 ,

Kommentare siehe Code.
# outlook object
[void][reflection.assembly]::LoadWithPartialName("microsoft.visualbasic")  
$objOL = [microsoft.visualbasic.interaction]::GetObject($null,"Outlook.Application")  
if (!$objOL){$objOL = New-Object -Com Outlook.Application}

# outputpath
$filepath = 'C:\Temp'  

# get unread items with pdf attachments
$unreaditems = $objOL.GetNamespace("MAPI").GetDefaultFolder(6).Items | ?{$_.Unread -and ($_.Attachments | ?{$_.Filename -match '\.pdf$'})}  

# foreach mail in collection
foreach($mail in $unreaditems){
    # get pdf attachments
    $mail.Attachments | ?{$_.Filename -match '\.pdf$'}  | %{  
        # build target path
        $target = join-path  $filepath "$($mail.ReceivedTime.toString('MMddyyyyHHmmss')).pdf"  
        # if there are more (> 1) attachments append counter to basename until a free filename is found
        $cnt = 1
        while((Test-Path $target)){
            $target = join-path  $filepath "$($mail.ReceivedTime.toString('MMddyyyyHHmmss'))_$cnt.pdf"  
            $cnt++
        }
        write-host "Saving attachment '$target'." -F Green  
        # save attachment
        $mail.SaveAsFile($target)
    }
    # mark message as read and save
    $mail.UnRead = $false
    $mail.Save()
}
Grüße Uwe
TK1987
Lösung TK1987 26.06.2020, aktualisiert am 30.06.2020 um 13:44:18 Uhr
Goto Top
Moin,


Zitat von @simonfcz1996:
Der Name der Datei soll dabei die Empfangszeit der Mail sein.
Wenn eine E-Mail mehrere PDF's enthält, würdest du so allerdings nur die letzte Datei erhalten, weil nur ein Dateiname.
Bei mehreren Dateien muss also zusätzlich noch eine Nummerierung statt finden.

if ($m.UnRead -eq $true) 
Da liegt dein Fehler.
I.d.R erhälst du in Variable $m ein Array-Object mit mehreren Mails. Was du hier also tun musst ist für jede einzelne Mail die unread-Eigenschaft zu prüfen.
Das "-eq $true" kann man sich übrigens sparen, eine wahre Bedingung ist schließlich immer =wahr face-wink
# Ungelesene E-Mails, die PDF-Dateien enthalten
$m=$F.Items | ? {$_.UnRead -and ($($_.Attachments).filename -match 'pdf$')}  

# Für jede Mail
$m | % {
   $Time=$_.ReceivedTime.ToString("MMddyyyyHHmmss")  
   [array]$PDFs = $_.Attachments | ?{$_.Filename -match 'pdf$'}  
	
   # Wenn mehrere PDFs
   if ($PDFs.count -gt 1) {$PDFs | % {$c=1} {$_.SaveAsFile("$Filepath\${Time}_$C.pdf");$c++}}  
   else {$PDFs.SaveAsFile("$Filepath\$Time.pdf")}  
}
Zur Info: Das ? ist ein Alias für where-object*, das % ist ein alias für foreach-object**

Gruß Thomas
simonfcz1996
simonfcz1996 30.06.2020 um 10:11:01 Uhr
Goto Top
@uwe

Danke für deine Hilfe. Komischerweise passiert gar nichts wenn ich das Skript 1:1 übernehme ausser, dass das Mai mit dem PDF im Anhang als gelesen markiert wird. Aber der Anhang wird nicht gespeichert.
Woran könnte das liegen? Es gibt keine Fehlermeldung, es passiert aber nichts.
simonfcz1996
simonfcz1996 30.06.2020 um 10:15:29 Uhr
Goto Top
@thomas

Auch dir vielen Dank, leider klappt das nicht ganz wenn mehrere PDFs vorhanden sind im Mail.
Mit deinem Skript speichert er nur das letzte PDF mit dem namen 1.pdf
Alle anderen werden ignoriert.

irgendwie müsste man hier den Counter von Uwe einbauen.
TK1987
TK1987 30.06.2020 um 11:18:24 Uhr
Goto Top
Moin,

Zitat von @simonfcz1996:
@thomas
Mit deinem Skript speichert er nur das letzte PDF mit dem namen 1.pdf
Stimmt, hab den $c++ vergessen. Ist oben geändert.

Gruß Thomas
simonfcz1996
simonfcz1996 30.06.2020 um 11:43:59 Uhr
Goto Top
Super, ich war bereits an komplizierteren Lösungen dran.. manchmal ist es viel einfacher als man denkt ^^

Ich verstehe nur nicht warum es mir die $Time nicht im Dateinamen übernimmt bei mehreren PDFs in einem Mail.. es nimmt nur $c

Hast du eine Erklärung dafür?
colinardo
colinardo 30.06.2020 aktualisiert um 12:20:37 Uhr
Goto Top
Zitat von @simonfcz1996:

@uwe

Danke für deine Hilfe. Komischerweise passiert gar nichts wenn ich das Skript 1:1 übernehme ausser, dass das Mai mit dem PDF im Anhang als gelesen markiert wird. Aber der Anhang wird nicht gespeichert.
Woran könnte das liegen? Es gibt keine Fehlermeldung, es passiert aber nichts.
Sorry, Tippfehler einer Variablen meinerseits, ist oben korrigiert.
TK1987
TK1987 30.06.2020 aktualisiert um 13:46:54 Uhr
Goto Top
Zitat von @simonfcz1996:
Ich verstehe nur nicht warum es mir die $Time nicht im Dateinamen übernimmt bei mehreren PDFs in einem Mail.. es nimmt nur $c

Hast du eine Erklärung dafür?
Ja, wegen dem Unterstrich dahinter. Dieser ist nämlich auch ein gültiges Zeichen für einen Variablennamen. Bitte $Time durch ${Time} ersetzen, dann sollte es funktionieren. Ist oben geändert.

Gruß Thomas