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:
Kann mir jemand weiterhelfen? Ich bin leider nicht sehr gut in Powershell und brauche Hilfe.
Vielen Dank schon im voraus!
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!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 582335
Url: https://administrator.de/contentid/582335
Ausgedruckt am: 26.11.2024 um 12:11 Uhr
8 Kommentare
Neuester Kommentar
Servus @simonfcz1996 ,
Kommentare siehe Code.
Grüße Uwe
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()
}
Moin,
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.
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
Zur Info: Das ? ist ein Alias für where-object*, das % ist ein alias für foreach-object**
Gruß Thomas
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)
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
# 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")}
}
Gruß Thomas
Moin,
Gruß Thomas
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.@thomas
Mit deinem Skript speichert er nur das letzte PDF mit dem namen 1.pdf
Gruß Thomas
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.@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.
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.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?
Gruß Thomas