silent-daniel
Goto Top

Power Automate Desktop - Email Anlagen exportieren

Hallo,

ich würde gerne einfach aus einer Office 365 Email Adresse die Anhänge in einen lokalen Ordner auf einem Windows Server exportieren, wenn der Anhang ein PDF ist.

Leider gestaltet sich das Ganze nicht sehr einfach.
Habe mit Power Automate gespielt, da Lizenz vorhanden, aber das funktioniert so nicht, oder ich bin zu dumm.

Habe versucht:
Neuer Flow, Office 365 Outlook, Anlage abrufen v2.
IDs? wo gebe ich den Speicherort an?

screenshot 2024-10-16 202411

oder:

Email Nachrichten verarbeiten, aber das braucht einen IMAP Server mit Basic Auth, aber das kann O365 nicht mehr aktivieren

screenshot 2024-10-16 202821

Flow Exchange Server oder Outlook findet das Konto nicht, obwohl Outlook am Server eingerichtet

screenshot 2024-10-16 202943

Kann mir jemand weiterhelfen?

gruß sd

Content-ID: 668818

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

Ausgedruckt am: 18.11.2024 um 19:11 Uhr

silent-daniel
silent-daniel 17.10.2024 um 13:58:37 Uhr
Goto Top
Ich habe jetzt mal Google Gemini gefragt, aber da steht es an bei "Datei speichern" das gibt es leider nicht beim Desktop FLow?

1. Flow starten:

Beginne mit einem Trigger, z.B. "Flow manuell starten" oder "Geplant", wenn der Flow automatisch zu bestimmten Zeiten ausgeführt werden soll.  
2. E-Mails abrufen:

"E-Mails abrufen (V3)": Verwende diese Aktion aus dem Outlook-Konnektor. Konfiguriere die Aktion, um E-Mails aus einem bestimmten Ordner abzurufen (z.B. Posteingang) und filtere nach Kriterien wie Betreff, Absender oder Datum.  
3. Schleife für jede E-Mail:

"Für jede": Verwende diese Schleife, um jede abgerufene E-Mail einzeln zu verarbeiten.  
4. Anhänge abrufen:

Innerhalb der Schleife: "Anhänge abrufen (V2)": Verwende diese Aktion, um die Anhänge der aktuellen E-Mail abzurufen.  
5. Schleife für jeden Anhang:

"Für jede": Verwende eine weitere Schleife, um jeden Anhang der E-Mail zu verarbeiten.  
6. PDF-Anhang identifizieren:

Innerhalb der Schleife: "Bedingung": Verwende eine Bedingung, um zu prüfen, ob der aktuelle Anhang ein PDF-Dokument ist (überprüfe die Dateierweiterung ".pdf").  
7. PDF-Anhang speichern:

"Datei erstellen": Speichere den Anhang in einem Ordner deiner Wahl. Verwende dynamische Inhalte aus den Aktionen "Anhänge abrufen" und "E-Mails abrufen", um den Dateinamen anzupassen (z.B. "E-Mail-Betreff_Anhang-Name.pdf").  
8. Schleifen beenden:

Schließe beide Schleifen ("Für jede").  

screenshot 2024-10-17 132808

Jemand eine andere Idee?

gruß sd
colinardo
Lösung colinardo 18.10.2024, aktualisiert am 22.10.2024 um 12:11:39 Uhr
Goto Top
Servus,
ich bin auch noch nie ein Fan von der Klicki-Bunti-Wiese aus dem Hause MS gewesen (schnell ist da was anderes), deswegen hier mal etwas Powershell-Code der von ungelesenen Mails aus dem Posteingang die *.PDF Anhänge in einen lokalen Ordner der Wahl extrahiert, sollten dort bereits Attachments mit dem Namen liegen wird den Dateinamen ein Zähler angehängt (braucht man das nicht kann man das natürlich jederzeit an eigene Bedürfnisse anpassen).
# mailbox user
$userid = 'myuser@xxxxxxx.onmicrosoft.com'  
# tenant FQDN
$tenant = 'xxxxxxx.onmicrosoft.com'  
# targetfolder for attachments
$download_folder = 'W:\attachments'  
# ============================
# stop on error
$ErrorActionPreference = 'Stop'  

# install module if it does not exist
if(!(Get-Module -ListAvailable -Name Microsoft.Graph.Mail)){
    # install module for current user
    Install-Module Microsoft.Graph.Mail -Force -Scope CurrentUser
}
# create output folder
if(!(Test-Path $download_folder -PathType Container)){
    New-Item -type dir -Path $download_folder -Force | out-null
}

# import module
Import-Module Microsoft.Graph.Mail

# connect to MG Graph with ReadWrite Permissions to mail scope (GUI-Login)
Connect-MgGraph -Tenant $tenant -Scopes Mail.ReadWrite -NoWelcome

# ======= Possible automated login methods (needs precreated azure app registration with app password or certificate) ==========

# connect with *.pfx certificate from file

#$client_id = 'XXXXXXXXXXXXXXXXXXXXX' 
#$certificate_file = 'D:\user.pfx' 
#$certificate_password = 'GEHEIM' 
#Connect-MgGraph -Tenant $tenant -ClientId $client_id -Certificate ([X509Certificate]::new($certificate_file,$certificate_password)) -NoWelcome

# connect with certificate from user cerificate store by thumbprint

#$client_id = 'XXXXXXXXXXXXXXXXXXXXX' 
#$certficate_thumbprint = 'XXXXXXXXXXXXXXXXXXXXXXXXXX' 
#Connect-MgGraph -Tenant $tenant -ClientId $client_id -CertificateThumbprint $certificate_thumbprint  -NoWelcome

# connect with application credentials (app password)

#$client_id = 'XXXXXXXXXXXXXXXXXXXXX' 
#$client_password = 'XXXXXXXXXXXXXXXXXXXXXXXX' 
#Connect-MgGraph -Tenant $tenant -ClientSecretCredential (new-Object PSCredential($client_id,(ConvertTo-SecureString $client_password -AsPlainText -Force))) -nowelcome

# ==============================

# get unread messages with attachments from inbox folder
foreach($message in Get-MgUserMailFolderMessage -UserId $userid -MailFolderId inbox -All -Property HasAttachments,IsRead,subject,sender,parentfolderid -Filter "isRead eq false and HasAttachments eq true"){  
    # process each pdf attachment
    foreach($attachment in Get-MgUserMailFolderMessageAttachment -UserId $userid -MessageId $message.id -MailFolderId $message.ParentFolderId -All -Filter "contentType eq 'application/pdf' and isInline eq false and endswith(name,'.pdf')"){     
        try{
            # create targetpath in downloadfolder
            $targetpath = join-path $download_folder $attachment.Name
            # generate new file name if file with the same name already exists
            $cnt = 0
            while(Test-Path $targetpath -PathType Leaf){
                $targetpath = join-path $download_folder "$([IO.Path]::GetFileNameWithoutExtension($attachment.Name))_$('{0:D3}' -f ((++$cnt)))$([IO.Path]::GetExtension($attachment.Name))"  
            }
            write-host "Saving attachment '$($attachment.Name)' from message with subject '$($message.Subject)' to '$targetpath'." -F Green  
            # save attachment to download folder
            [IO.File]::WriteAllBytes($targetpath,[Convert]::FromBase64String($attachment.AdditionalProperties.contentBytes))
        }catch{
            write-host $_.Exception.Message -F Red
        }
    }
    # Mark message as read
    Update-MgUserMessage -MessageId $message.id -UserId $userid -IsRead | out-null
}
# disconnect from MS-Graph
Disconnect-MgGraph | out-null
(und nein das hat keine KI geschrieben, das mache ich immer noch mit eigenem Grips, leider eine aussterbende Spezies face-wink)

Wer es gebrauchen kann, viel Spaß damit.

Grüße Uwe
silent-daniel
silent-daniel 18.10.2024 um 20:02:11 Uhr
Goto Top
Hallo,

Danke Dir, das ist genau was ich brauche.
Auch das mit dem automatischem Login in Kommentar funktioniert.

Nur speicher er mir auch PNG und JPG aus der Signatur ab, sollte die zeile sein:

foreach($attachment in Get-MgUserMailFolderMessageAttachment -UserId $userid -MessageId $message.id -MailFolderId $message.ParentFolderId -All -Filter "ContentType eq 'application/pdf' and IsInline eq false")  

gruß sd
colinardo
colinardo 18.10.2024 aktualisiert um 20:25:20 Uhr
Goto Top
Zitat von @silent-daniel:
Nur speicher er mir auch PNG und JPG aus der Signatur ab, sollte die zeile sein:

foreach($attachment in Get-MgUserMailFolderMessageAttachment -UserId $userid -MessageId $message.id -MailFolderId $message.ParentFolderId -All -Filter "ContentType eq 'application/pdf' and IsInline eq false")  

gruß sd

Dann wurde da vermutlich bei den Dateien der Mimetype falsch erkannt oder vom MTA falsch hinterlegt, kannst du aber fixen indem du zusätzlich die Dateierweiterung prüfst.

foreach($attachment in Get-MgUserMailFolderMessageAttachment -UserId $userid -MessageId $message.id -MailFolderId $message.ParentFolderId -All -Filter "contentType eq 'application/pdf' and isInline eq false and endswith(name, '.pdf')"){   
Habe das oben zur Sicherheit ergänzt.

Grüße Uwe
silent-daniel
silent-daniel 20.10.2024 um 19:30:39 Uhr
Goto Top
Danke Dir!

das hilft mir sehr weiter!

gruß sd