eggired
Goto Top

Suche nach Möglichkeit, Download-Link automatisch aus Mail auslesen zu können

Guten Morgen in die Runde,

ich grübele gerade über folgender Idee:

Über eine externe Webseite können die dort hinterlegten Daten per Button-Klick als csv-Datei angefordert werden.

Die csv-Datei wird auf Anbieterseite generiert, kurze Zeit später bekommt der User eine HTML-Mail mit einem Button à la "Hier csv herunterladen" zugeschickt. Der Link hinter dem Button enthält eine URL nach ungefähr dem folgenden Motto: https://export.srv123.contoso.com/MusterObjekt-yyyymmddhhmm-1234567890.c ...

Nun habe ich überlegt, ob man den Workflow (vor allem Mail öffnen, Link anklicken für den csv-Download) irgendwie mit Bordmitteln unter Windows mit einem installierten Microsoft Office 2016 (oder höher) automatisieren kann.

Aber so einen richtigen "Pack-An" habe ich noch nicht und die Rechercheergebnisse waren auch noch nicht so überzeugend.

Die erste Idee war, irgendwie die Mail automatisch als HTML-Datei speichern zu lassen, um die so erzeugte HTML-Datei anschließend von der Powershell zerflücken zu lassen, um die URL des Downloadlinks extrahieren zu können. Vielleicht gibt es aber auch eine andere Idee, ich bin da offen. face-smile

Ist das skizzierte Anliegen technisch mit Windows-Bordmitteln möglich bzw. hat vielleicht jemand schon einmal Erfahrungswerte in der Richtung sammeln können?


Vielen Dank vorab und einen guten Start in den Tag!

Content-ID: 7188139304

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

Ausgedruckt am: 22.11.2024 um 01:11 Uhr

godlie
godlie 17.05.2023 um 08:08:22 Uhr
Goto Top
Hallo,

ich würde das ganze über ein VBA Makro abfahren, welches bei Mailempfang tätig wird.

Grobe Struktur:
  • Mailempfang
  • RawBody durchsuchen nach *.contoso
  • Download der csv

grüße
6376382705
6376382705 17.05.2023 aktualisiert um 08:22:56 Uhr
Goto Top
Hallo.

Ein Makro könnte das abfrühstücken:

 Option Explicit
' Erforderliche Verweise:  
' - Microsoft Outlook xx.x Object Library  
' - Microsoft Internet Controls  

Private WithEvents InboxItems As Outlook.Items

Private Sub Application_Startup()
    Dim OutlookApp As Outlook.Application
    Dim OutlookNamespace As Outlook.NameSpace
    Dim OutlookFolder As Outlook.MAPIFolder
    
    Set OutlookApp = Outlook.Application
    Set OutlookNamespace = OutlookApp.GetNamespace("MAPI")  
    Set OutlookFolder = OutlookNamespace.GetDefaultFolder(olFolderInbox)
    Set InboxItems = OutlookFolder.Items
End Sub

Private Sub InboxItems_ItemAdd(ByVal Item As Object)
    Dim Mail As Outlook.MailItem
    Dim HTMLDoc As MSHTML.HTMLDocument
    Dim Link As MSHTML.HTMLLinkElement
    Dim IEApp As InternetExplorer
    Dim TargetURL As String
    
    If TypeOf Item Is Outlook.MailItem Then
        Set Mail = Item
        
        ' Überprüfen, ob die E-Mail HTML-Format hat  
        If Mail.BodyFormat = olFormatHTML Then
            Set HTMLDoc = New MSHTML.HTMLDocument
            HTMLDoc.Body.innerHTML = Mail.HTMLBody
            
            ' Die spezielle URL mit Wildcard-Suche finden  
            TargetURL = "https://example.com/*" ' Beispiel-URL mit Wildcard  
            
            For Each Link In HTMLDoc.Links
                If Link.href Like TargetURL Then
                    Set IEApp = New InternetExplorer
                    IEApp.Visible = True
                    IEApp.navigate Link.href
                    Exit For
                End If
            Next Link
        End If
    End If
End Sub

Dadurch wird das Makro nach einem Link suchen, der mit der angegebenen URL übereinstimmt. Wenn ein entsprechender Link gefunden wird, wird der Internet Explorer geöffnet und der Link automatisch angeklickt.

Quelle: ChatGPT

ungetestet aber sieht recht schlüssig aus.

Gruß
7010350221
7010350221 17.05.2023 aktualisiert um 09:17:42 Uhr
Goto Top
$savedir= 'D:\Download'  
$newMailAction = {
    foreach ($mail in $Event.SourceArgs.Split(",")){  
        $mailItem = $objOL.Session.GetItemFromID($mail)
        if ($mailitem.HTMLBody -match '(?<=href=")https://export\.srv123\.com/[^"]+'){  
            write-host "Downloading file '$($matches[0])'" -ForegroundColor green  
            Invoke-WebRequest -uri $matches[0] -OutFile "$savedir\$([IO.Path]::GetFileName($matches[0]))"  
        }
    }
}
$ol = New-Object -ComObject "Outlook.Application"  
$null = Register-ObjectEvent $ol -EventName NewMailEx -Action $newMailAction -SourceIdentifier "NewMailEventSubscriber"  

write-host "Waiting for new mails ... " -ForegroundColor Green  
while($true){
    sleep 1
}
Gruß
NordicMike
NordicMike 17.05.2023 um 09:13:23 Uhr
Goto Top
while($true){
    sleep 1
}

Wie kommt er aus der Schleife raus?
7010350221
7010350221 17.05.2023 aktualisiert um 10:48:48 Uhr
Goto Top
Zitat von @NordicMike:

while($true){
    sleep 1
}

Wie kommt er aus der Schleife raus?

Muss er nicht weil das Skript ein Outlook Event abonniert und die Konsole dazu offen bleiben muss face-wink. Zum beenden kann er jeder Zeit STRG+C drücken.
Man kann natürlich auch mit Taskplaner stattdessen jede x Minuten den Posteingang auf neue Mails abfragen, das war jetzt nur ein Live-Beispiel das unmittelbar auf das Eintreffen neuer Mails reagiert, was dann stattdessen in etwa so aussehen könnte

$savedir= 'D:\Download'  
$ol = New-Object -ComObject "Outlook.Application"  
$newmails = $ol.Session.Stores['user@domain.de'].GetDefaultFolder(6).Items | ?{$_.Unread}  
foreach($mail in $newmails){
    if ($mail.HTMLBody -match '(?<=href=")https://export\.srv123\.com/[^"]+'){  
        write-host "Downloading file '$($matches[0])'"  
        Invoke-WebRequest -uri $matches[0] -OutFile "$savedir\$([IO.Path]::GetFileName($matches[0]))"  
        $mail.Unread = $false
    }
}
[void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($ol)