Anhang runterladen - Erweiterung für die POP3 UDF

  • Da heute die Frage gestellt wurde, wie man denn Anhänge runterläd und ich dieses Problem lösen konnte, hab ich mir gedacht, ich mach daraus mal ne UDF.
    Erklärung: Eine E-Mail besteht aus mehreren Teilen. Einer dieser Teile ist der Anhang. Dieser ist in Base64 verschlüsselt, also entschlüsselt dieses Script diesen Code und gibt einen Array bestehend aus dem Namen der Datei und dem entschlüsselten Text. Nun muss man nurnoch eine Datei mit dem Dateinenamen erstellen und dort den entschlüsselten Code reinschreiben (-->siehe Beispiel)

    Funktion: _getanhang($v_text)
    $v_text Text, der aus _POP3Retr(), bzw. _downloadmail() entstanden ist.
    Rückgabe:
    $rueckgabe Zurückgegebener Array
    $rueckgabe[0] Decodierter Anhang
    $rueckgabe[1] Name der Datei im Anhang

    Funktion _downloadmail()
    Kleines Auswahlmenü zum auswählen und runterladen der gewünschten E-Mail
    Rückgabe:
    $data Der Text der E-Mail (Mit Anhang) -->Siehe Beispiel

    Beispiel:

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    AutoIt Version: 3.3.5.4 (beta)
    Author: Cartan12

    [/autoit] [autoit][/autoit] [autoit]

    Script Function:
    Template AutoIt script.

    [/autoit] [autoit][/autoit] [autoit]

    #ce ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    #include <POP3.au3>
    #include <File.au3>
    #include <Anhang.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $conn = _POP3Connect($benutzer,$pass,$popserver)
    If $conn == 0 Then
    MsgBox(0,"","Keine Verbindung")
    Else
    $mails = _POP3Info()
    If $mails <> 0 Then
    $mail = _downloadmail() ; Neue Funktion - Keines Auswahlmenü der Vorhandenen E-Mails
    _FileCreate(@DesktopDir & "\mail.txt")
    FileWrite(@DesktopDir & "\mail.txt",$mail)
    $anhang = _getanhang($mail)
    _ArrayDisplay($anhang)
    If $anhang <> "" Then
    _FileCreate(@DesktopDir & "\" & $anhang[1])
    FileWrite(@DesktopDir & "\" & $anhang[1],$anhang[0])
    EndIf
    EndIf
    EndIf

    [/autoit]

    Anhang UDF:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <String.au3>
    #include <ButtonConstants.au3>
    #include <ComboConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include-once
    Func _Base64Decode($Data)
    Local $Opcode = "0xC81000005356578365F800E8500000003EFFFFFF3F3435363738393A3B3C3DFFFFFF00FFFFFF000102030405060708090A0B0C0D0E0F10111213141516171819FFFFFFFFFFFF1A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132338F45F08B7D0C8B5D0831D2E9910000008365FC00837DFC047D548A034384C0750383EA033C3D75094A803B3D75014AB00084C0751A837DFC047D0D8B75FCC64435F400FF45FCEBED6A018F45F8EB1F3C2B72193C7A77150FB6F083EE2B0375F08A068B75FC884435F4FF45FCEBA68D75F4668B06C0E002C0EC0408E08807668B4601C0E004C0EC0208E08847018A4602C0E00624C00A46038847028D7F038D5203837DF8000F8465FFFFFF89D05F5E5BC9C21000"

    [/autoit] [autoit][/autoit] [autoit]

    Local $CodeBuffer = DllStructCreate("byte[" & BinaryLen($Opcode) & "]")
    DllStructSetData($CodeBuffer, 1, $Opcode)

    [/autoit] [autoit][/autoit] [autoit]

    Local $Ouput = DllStructCreate("byte[" & BinaryLen($Data) & "]")
    Local $Ret = DllCall("user32.dll", "int", "CallWindowProc", "ptr", DllStructGetPtr($CodeBuffer), _
    "str", $Data, _
    "ptr", DllStructGetPtr($Ouput), _
    "int", 0, _
    "int", 0)

    [/autoit] [autoit][/autoit] [autoit]

    Return BinaryMid(DllStructGetData($Ouput, 1), 1, $Ret[0])
    EndFunc
    Func _getanhang($v_text)
    Local $pos, $split, $split2, $split3, $string2, $encodet, $string1
    $pos = StringInStr($v_text,'boundary="')
    If StringInStr($v_text,"Content-Type: multipart/mixed;") <> 0 And $pos <> 0 Then
    $searchstring = _StringBetween($v_text,'boundary="','"')
    $split = StringSplit($v_text,$searchstring[0],1)
    $split3 = StringSplit($split[$split[0]-1],'filename="',1)
    $string2 = _StringBetween($split3[2],"",'"')
    $split2 = _StringBetween($split[$split[0]-1],'filename="' & $string2[0] & '"',"")
    If StringInStr($split[$split[0]-1],"Content-Type: text") <> 0 Then
    $string1 = StringTrimLeft($split2[0],4)
    $encodet = StringTrimRight($string1,2)
    Else
    $encodet = _Base64Decode($split2[0])
    EndIf
    Local $rueckgabe[2] = [$encodet, $string2[0]]
    Return $rueckgabe
    EndIf
    Return 0
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _downloadmail()
    Local $Form1, $Combo1, $i, $Button1, $Msg, $data, $mail, $v_mails
    $v_mails = _POP3Info()
    If $v_mails[0][0] = 0 Then
    MsgBox(0,"!","Keine E-Mails auf dem Server vorhanden!")
    Exit
    EndIf
    $Form1 = GUICreate("E-Mails", 186, 132, 229, 149)
    $Combo1 = GUICtrlCreateCombo("", 24, 40, 145, 25)
    For $i = 1 To $v_mails[0][0]
    GUICtrlSetData(-1,$i & "= " & $v_mails[$i][3])
    Next
    $Button1 = GUICtrlCreateButton("Download", 48, 80, 75, 25)
    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $Msg = GUIGetMsg()
    Switch $Msg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    If GUICtrlRead($Combo1) = "" Then ContinueLoop
    $data = StringSplit(GUICtrlRead($Combo1), "=")
    GUIDelete()
    $mail = _POP3Retr($data[1])
    Return $mail

    [/autoit] [autoit][/autoit] [autoit]

    EndSwitch
    WEnd

    [/autoit]

    EDIT: _downloadmail()-Funltion hinzugefügt. _downloadmail Erstellt eine kleine GUI, in der man die gewünschte E-Mail runterladen kann. Viele, viele Bugs behoben, die UDF sollte jetzt ohne Probleme funktionieren...

  • Hallo Cartan12
    Also das Script sieht sehr schön aus, habs aber noch nicht getestet.
    Die Idee ist zwar gut, aber ich glaube nicht, dass Anbieter wollen, dass sich Bots
    in den Server einklinken und dann Anlagen durch geknackten Base64 Code downloaden :)
    Ansonsten isses schon gut.
    Du solltest es vllt. auch noch richtig auskommentieren.
    MfG. PrideRage

    Meine Projekte:
    ClipBoard Manager (beendet)
    Gutes ClipBoard Verwaltungs Programm mit nützlichen Funktionen.

    HTML Creator (beendet)
    Nützliches Tool um schnell ein eigenes HTML Dokument zu erstellen.

  • Funktioiert auf jeden Fall! Dieser Base64 ist der Standartcode vieler Anbieter... Ich mein, jedes Mailprogramm kann das, wiso sollen wir das nicht können!?! :thumbup:

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • Sieht interessant aus. Wollt ich zwar noch in die POP3-UDF einbauen, bin aber noch nicht dazugekommen.
    Evtl. wäre ein Test noch interessant ob der Anhang auch "Content-Transfer-Encoding: base64" ist.
    Was passiert eigentlich wenn der Anhang kein "Text" ist?

    Hallo Cartan12
    Also das Script sieht sehr schön aus, habs aber noch nicht getestet.
    Die Idee ist zwar gut, aber ich glaube nicht, dass Anbieter wollen, dass sich Bots
    in den Server einklinken


    Diese "Bots" nennen sich im allgemeinen eMail-Programm und machen nichts anderes.


    und dann Anlagen durch geknackten Base64 Code downloaden :)


    was ist da zu "knacken"? Das ist ein dokumentiertes Verfahren um binär-Dateien bzw. alles <> ASCII, per ASCII zu übertragen ...

    Versteh die Aufregung nicht ?(

  • Ich war sehr überrascht, als ich den ersten Anhang runtergeladen hatte. Es war ein Zip Archiv, doch in der Mail stand nur ein sehr langer String. Nach ein bisschen recherchieren fand ich heraus, das Anhänge (Versucht mal irgendeine Datei mit z.B. EditPlus zu öffnen) in Base64 als STRING verschlüsselt versendet werden. Das Mailprogramm entschlüsselt diese Datei und gibt den Namen an. Dann läd es diesen String runter, speichert es in eine Textdatei und ändert den Namen. Das ist genau das, was mein Script macht...
    Ach ja, es gibt ein Problem, sobald der Anhang eine Textdatei IST. Dann wird der Inhalt der Datei nicht verschlüsselt, mein Script Versucht jedoch genau das... Was dabei rauskommt kann man sich ja denken :P
    Bin fast fertig diesen Fehler zu beheben...

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • Bug gefixt ; Es klappten nun auch Texte als Anhang --> post#1

    Stilgar würde mich sehr freuen, wenn die UDF in die POP3 UDF aufgenommen wird... Wäre nett wenn du dann noch meinen Namen nennst :rolleyes:

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

    Einmal editiert, zuletzt von Cartan12 (16. Februar 2010 um 21:56)

  • UPDATE! Die UDF unterstützt nun alle (mir bekannten) E-Mail Anbieter und es wurden viele Bugs behoben. Außerdem habe ich noch ein kleines Auswahlmenü hinzugefügt. Ich glaube, diese UDF kann man nun gut zu benutzen :thumbup: --> Siehe Post#1

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • hi Cartan,

    diese fehler gibt das aus

    [autoit]

    C:\Dokumente und Einstellungen\Administrator\Desktop\Beispiel.au3(24,25) : ERROR: _downloadmail() called with wrong number of args.
    $mail = _downloadmail()
    ~~~~~~~~~~~~~~~~~~~~~~^
    C:\Programme\AutoIt3\Include\Anhang.au3(44,29) : REF: definition of _downloadmail().
    Func _downloadmail($v_mails)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    C:\Dokumente und Einstellungen\Administrator\Desktop\Beispiel.au3 - 1 error(s), 0 warning(s)

    [/autoit]


    ich habe aber keine t-online adresse.


    hmm.......wie komme ich da weiter ?


    danke erst mal

    gruss roland_k :whistling:

  • Das Problem ist schnell gelößt... Du musst dir nochmal die neue Anhang.au3 runterladen. Gab nämlich nochmal ein Update...

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"