POP3 (E-Mail) UDF

  • Hi,
    Ich hatte heute ein wenig langeweile und hab schnell eine UDF für POP3-Server gebastelt.
    Ich hatte leider noch keine Zeit es zu testen, deshalb wäre ich euch dankbar wenn ihr es mal testen könntet ;)

    Bevor ihr die Funktionen verwendet könnt, müsst ihr TCPStartup aufrufen :)
    - POP3 UDF.au3

    Spoiler anzeigen
    [autoit]

    ;===============================================================================
    ;
    ; Name: POP3 UDF
    ; Vorraussetzungen: TcpStartup () am Anfang des Skripts
    ; Beschreibung: Eine UDF um mit AutoIt auf einen POP3 Server zuzugreifen.
    ; Autor: Carsten8
    ;
    ;===============================================================================
    Global $csocket
    Global $sMsg
    ;===============================================================================
    ;
    ; Beschreibung: Verbindet sich zu einem POP3 Server und loggt sich ein.
    ; Parameter: $sServer - Adresse des Pop3-Servers
    ; $iPort - Port über den Verbunden werden soll (meistens 110)
    ; $sUser - Benutzername zum einloggen (bei ua. web.de ist es die E-Mail Adresse)
    ; $sPass - Passwort des E-Mail Accounts
    ; $timeout - Gibt an, wie lange auf eine Antwort gewartet werden soll (Standart: 10 Sek.).
    ; Rückgabewerte: Erfolg: Gibt 1 zurück.
    ; Fehler: Gibt 0 zurück zu setzt @error:
    ; 1 = Timeout
    ; 2 = Server gab einen anderen Fehler zurück
    ; 3 = Konnte nicht zum Server verbinden (meist falsche Adresse oder Port)
    ; 4 = Benutzername und/oder Passwort falsch
    ;===============================================================================
    Func _pop3_connect($sServer, $iPort, $sUser, $sPass, $timeout = 10000)
    $csocket = TCPConnect($sServer, $iPort)
    If @error = 1 Then
    $csocket = TCPConnect(TCPNameToIP($sServer), $iPort)
    EndIf
    If $csocket = -1 Then
    SetError(3)
    Return 0
    EndIf
    $iTimer = TimerInit ()
    Do
    If TimerDiff ($iTimer) > $timeout Then
    SetError(1)
    Return 0
    EndIf
    $recv = TCPRecv($csocket, 1024)
    Until StringLeft($Recv, 3) = "+OK"
    TCPSend($csocket, "USER " & $sUser & @CRLF)
    $iTimer = TimerInit ()
    Do
    If TimerDiff ($iTimer) > $timeout Then
    SetError(1)
    Return 0
    EndIf
    $recv = TCPRecv($csocket, 1024)
    Until StringLeft($Recv, 3) = "+OK"
    TCPSend($csocket, "PASS " & $sPass & @CRLF)
    $iTimer = TimerInit ()
    Do
    If TimerDiff ($iTimer) > $timeout Then
    SetError(1)
    Return 0
    EndIf
    $recv = TCPRecv($csocket, 1024)
    If StringLeft($recv, 4) = "-ERR" Then
    SetError(4)
    Return 0
    EndIf
    Until StringLeft($Recv, 3) = "+OK"
    Return $csocket
    EndFunc
    ;===============================================================================
    ;
    ; Beschreibung: Gibt die Anzahl und die Größe der E-Mails auf dem Server zurück
    ; Parameter: $socket - Serversocket
    ; $timeout - Gibt an, wie lange auf eine Antwort gewartet werden soll (Standart: 10 Sek.).
    ; Rückgabewerte: Erfolg: Setzt @error auf 0 und gibt ein Array mit folgenden Daten zurück:
    ; $array[0] = Anzahl der E-Mails
    ; $array[1] = Größe aller E-Mails in Bytes
    ; Fehler: Setzt @error auf 1 bei einem unbekannten Fehler (2 bei Timeout und gibt 0 zurück)
    ; und gibt den vom Server gesendeten Fehler zurück.
    ;===============================================================================
    Func _pop3_info($socket, $timeout = 10000)
    TCPSend($socket, "STAT" & @CRLF)
    $iTimer = TimerInit ()
    Do
    If TimerDiff ($iTimer) > $timeout Then
    SetError(2)
    Return 0
    EndIf
    $recv = TCPRecv($csocket, 1024)
    If StringLeft($recv, 4) = "-ERR" Then
    SetError(4)
    Return $recv
    EndIf
    Until StringLeft($Recv, 3) = "+OK"
    $sTrim = StringTrimLeft($recv, 4)
    $split = StringSplit($sTrim, " ")
    Dim $aStat[2]
    $aStat[0] = $split[1]
    $aStat[1] = $split[2]
    Return $aStat
    EndFunc
    ;===============================================================================
    ;
    ; Beschreibung: Empfängt eine E-Mail mit ihrem Header
    ; Parameter: $socket - Serversocket
    ; $timeout - Gibt an, wie lange auf eine Antwort gewartet werden soll (Standart: 10 Sek.).
    ; $iMail - Die Nummer der E-Meil zum Empfangen
    ; Rückgabewerte: Erfolg: Gibt die E-Mail zurück
    ; Fehler: Gibt 0 zurück und setzt @error bei einem Timeout auf 1 (bei anderen Fehlern 0)
    ;===============================================================================
    Func _pop3_getmailraw($socket, $iMail, $timeout = 10000)
    TCPSend($socket, "RETR " & $iMail & @CRLF)
    $iTimer = TimerInit ()
    Do
    If TimerDiff ($iTimer) > $timeout Then
    SetError(1)
    Return 0
    EndIf
    $recv = TCPRecv($csocket, 1024)
    If StringLeft($recv, 4) = "-ERR" Then
    SetError(0)
    Return 0
    EndIf
    Until StringLeft($recv, 3) = "+OK"
    $split = StringSplit($recv, @CRLF)
    For $i = 2 to $split[0] - 1
    $sMsg &= $split[$i] & @CRLF
    Next
    Return $sMsg
    EndFunc
    ;===============================================================================
    ;
    ; Beschreibung: Löscht eine E-Mail vom Server
    ; Parameter: $socket - Serversocket
    ; $timeout - Gibt an, wie lange auf eine Antwort gewartet werden soll (Standart: 10 Sek.).
    ; $iMail - Die Nummer der E-Meil zum Empfangen
    ; Rückgabewerte: Erfolg: Gibt 1 zurück
    ; Fehler: Gibt 0 zurück und setzt @error bei einem Timeout auf 1 (bei anderen Fehlern 0)
    ;===============================================================================
    Func _pop3_deletemail($socket, $iMail, $timeout = 10000)
    TCPSend($socket, "DELE " & $iMail & @CRLF)
    $iTimer = TimerInit ()
    Do
    If TimerDiff ($iTimer) > $timeout Then
    SetError(1)
    Return 0
    EndIf
    $recv = TCPRecv($csocket, 1024)
    If StringLeft($recv, 4) = "-ERR" Then
    SetError(0)
    Return 0
    EndIf
    Until StringLeft($recv, 3) = "+OK"
    Return 1
    EndFunc
    ;===============================================================================
    ;
    ; Beschreibung: Trennt die Verbindung zum Server
    ; Parameter: $socket - Serversocket
    ; Rückgabewerte: Keine
    ;===============================================================================
    Func _pop3_disconnect($socket)
    TCPSend($socket, "QUIT" & @CRLF)
    TCPCloseSocket($socket)
    EndFunc

    [/autoit]


    -Sehr einfaches Beipsiel (Empfängt die erste E-Mail auf dem Server, gibt diese aus und löscht sie.)

    Spoiler anzeigen
    [autoit]

    #include <POP3 UDF.au3>
    ;Ab hier ändern
    $server = "pop3.web.de"
    $port = 110
    $user = "max.musterman@web.de"
    $password = "musterpasswort"
    ;Ab hier nichts mehr ändern
    TCPStartup()
    $pop3sock = _pop3_connect($server, $port, $user, $password)
    $pop3info = _pop3_info($pop3sock)
    MsgBox(0, "Ergebnis", "Auf dem Server sind " & $pop3info[0] & " E-Mails mit einer Größe von " & $pop3info[1] & " Bytes.")
    $mail = _pop3_getmailraw($pop3sock, 1)
    MsgBox(0, "E-Mail 1", $mail)
    _pop3_deletemail($pop3sock, 1)
    _pop3_disconnect($socket)

    [/autoit]


    Todo: IMAP und SMTP

    Viel Spaß 8)

    2 Mal editiert, zuletzt von Carsten8 (28. März 2008 um 23:33)

  • Ja, find ich schon Klasse :thumbup::thumbup: aber ich hab halt im Moment überhaupt keine Verwendung dafür :whistling:^^:P;)

    Projekte: Keine größeren (und fertigen)
    Gegen Internetzensur:
    https://epetitionen.bundestag.de/index.php?acti…s;petition=3860
    (Zeichnungsfrist abgelaufen)
    __________________________________________________________________________________________________________________________________
    Dieser Beitrag wurde bereits 264 mal editiert, zuletzt von »Fast2« (30. Februar 2009, 12:99)

  • Hallo Carsten,
    kurze Frage (weil ich jetzt nicht alles zeitaufwändig installieren möchte um meine Frage selbst zu beantworten) .... hoffe es ist ok.

    Kann ich damit folgendes lösen?
    * Abholen von e-Mails + automatisches Verarbeiten des Inhalts (nur Text, kein Anhang)?
    * ggf. Selektion im e-Mail-Account nach Empfänger / Absender / Betreff, d.h. nur bestimmte e-Mails werden heruntergeladen und ggf. gelöscht

    Vielen Dank
    für eine kurze Antwort
    Carsten

  • Hallo,

    ich habe das alles grade mal ausprobiert, habe dabei die Funktion _pop3_getmailraw() gefixt diese liefert nun alle mail vollständig zurück.

    Spoiler anzeigen
    [autoit]

    ;===============================================================================
    ;
    ; Name: POP3 UDF
    ; Vorraussetzungen: TcpStartup () am Anfang des Skripts
    ; Beschreibung: Eine UDF um mit AutoIt auf einen POP3 Server zuzugreifen.
    ; Autor: Carsten8
    ;
    ;===============================================================================
    Global $csocket
    Global $sMsg
    ;===============================================================================
    ;
    ; Beschreibung: Verbindet sich zu einem POP3 Server und loggt sich ein.
    ; Parameter: $sServer - Adresse des Pop3-Servers
    ; $iPort - Port über den Verbunden werden soll (meistens 110)
    ; $sUser - Benutzername zum einloggen (bei ua. web.de ist es die E-Mail Adresse)
    ; $sPass - Passwort des E-Mail Accounts
    ; $timeout - Gibt an, wie lange auf eine Antwort gewartet werden soll (Standart: 10 Sek.).
    ; Rückgabewerte: Erfolg: Gibt 1 zurück.
    ; Fehler: Gibt 0 zurück zu setzt @error:
    ; 1 = Timeout
    ; 2 = Server gab einen anderen Fehler zurück
    ; 3 = Konnte nicht zum Server verbinden (meist falsche Adresse oder Port)
    ; 4 = Benutzername und/oder Passwort falsch
    ;===============================================================================
    Func _pop3_connect($sServer, $iPort, $sUser, $sPass, $timeout = 10000)
    $csocket = TCPConnect($sServer, $iPort)
    If @error = 1 Then
    $csocket = TCPConnect(TCPNameToIP($sServer), $iPort)
    EndIf
    If $csocket = -1 Then
    SetError(3)
    Return 0
    EndIf
    $iTimer = TimerInit ()
    Do
    If TimerDiff ($iTimer) > $timeout Then
    SetError(1)
    Return 0
    EndIf
    $recv = TCPRecv($csocket, 1024)
    Until StringLeft($Recv, 3) = "+OK"
    TCPSend($csocket, "USER " & $sUser & @CRLF)
    $iTimer = TimerInit ()
    Do
    If TimerDiff ($iTimer) > $timeout Then
    SetError(1)
    Return 0
    EndIf
    $recv = TCPRecv($csocket, 1024)
    Until StringLeft($Recv, 3) = "+OK"
    TCPSend($csocket, "PASS " & $sPass & @CRLF)
    $iTimer = TimerInit ()
    Do
    If TimerDiff ($iTimer) > $timeout Then
    SetError(1)
    Return 0
    EndIf
    $recv = TCPRecv($csocket, 1024)
    If StringLeft($recv, 4) = "-ERR" Then
    SetError(4)
    Return 0
    EndIf
    Until StringLeft($Recv, 3) = "+OK"
    Return $csocket
    EndFunc
    ;===============================================================================
    ;
    ; Beschreibung: Gibt die Anzahl und die Größe der E-Mails auf dem Server zurück
    ; Parameter: $socket - Serversocket
    ; $timeout - Gibt an, wie lange auf eine Antwort gewartet werden soll (Standart: 10 Sek.).
    ; Rückgabewerte: Erfolg: Setzt @error auf 0 und gibt ein Array mit folgenden Daten zurück:
    ; $array[0] = Anzahl der E-Mails
    ; $array[1] = Größe aller E-Mails in Bytes
    ; Fehler: Setzt @error auf 1 bei einem unbekannten Fehler (2 bei Timeout und gibt 0 zurück)
    ; und gibt den vom Server gesendeten Fehler zurück.
    ;===============================================================================
    Func _pop3_info($socket, $timeout = 10000)
    TCPSend($socket, "STAT" & @CRLF)
    $iTimer = TimerInit ()
    Do
    If TimerDiff ($iTimer) > $timeout Then
    SetError(2)
    Return 0
    EndIf
    $recv = TCPRecv($csocket, 1024)
    If StringLeft($recv, 4) = "-ERR" Then
    SetError(4)
    Return $recv
    EndIf
    Until StringLeft($Recv, 3) = "+OK"
    $sTrim = StringTrimLeft($recv, 4)
    $split = StringSplit($sTrim, " ")
    Dim $aStat[2]
    $aStat[0] = $split[1]
    $aStat[1] = $split[2]
    Return $aStat
    EndFunc
    ;===============================================================================
    ;
    ; Beschreibung: Empfängt eine E-Mail mit ihrem Header
    ; Parameter: $socket - Serversocket
    ; $timeout - Gibt an, wie lange auf eine Antwort gewartet werden soll (Standart: 10 Sek.).
    ; $iMail - Die Nummer der E-Meil zum Empfangen
    ; Rückgabewerte: Erfolg: Gibt die E-Mail zurück
    ; Fehler: Gibt 0 zurück und setzt @error bei einem Timeout auf 1 (bei anderen Fehlern 0)
    ;===============================================================================
    Func _pop3_getmailraw($socket, $iMail, $timeout = 10000)
    local $try = 5 , $recv = ""
    TCPSend($socket, "RETR " & $iMail & @CRLF)
    $iTimer = TimerInit ()
    while not StringRegExp($recv,"\s[.]\s")
    If TimerDiff ($iTimer) > $timeout Then
    SetError(1)
    Return 0
    EndIf
    $recv &= TCPRecv($csocket, 1024)
    If StringLeft($recv, 4) = "-ERR" Then
    if $try = 0 Then
    SetError(0)
    Return 0
    Else
    $try -= 1
    TCPSend($socket, "RETR " & $iMail & @CRLF)
    $recv = ""
    EndIf
    EndIf
    wend
    Return $recv
    EndFunc
    ;===============================================================================
    ;
    ; Beschreibung: Löscht eine E-Mail vom Server
    ; Parameter: $socket - Serversocket
    ; $timeout - Gibt an, wie lange auf eine Antwort gewartet werden soll (Standart: 10 Sek.).
    ; $iMail - Die Nummer der E-Meil zum Empfangen
    ; Rückgabewerte: Erfolg: Gibt 1 zurück
    ; Fehler: Gibt 0 zurück und setzt @error bei einem Timeout auf 1 (bei anderen Fehlern 0)
    ;===============================================================================
    Func _pop3_deletemail($socket, $iMail, $timeout = 10000)
    TCPSend($socket, "DELE " & $iMail & @CRLF)
    $iTimer = TimerInit ()
    Do
    If TimerDiff ($iTimer) > $timeout Then
    SetError(1)
    Return 0
    EndIf
    $recv = TCPRecv($csocket, 1024)
    If StringLeft($recv, 4) = "-ERR" Then
    SetError(0)
    Return 0
    EndIf
    Until StringLeft($recv, 3) = "+OK"
    Return 1
    EndFunc
    ;===============================================================================
    ;
    ; Beschreibung: Trennt die Verbindung zum Server
    ; Parameter: $socket - Serversocket
    ; Rückgabewerte: Keine
    ;===============================================================================
    Func _pop3_disconnect($socket)
    TCPSend($socket, "QUIT" & @CRLF)
    TCPCloseSocket($socket)
    EndFunc

    [/autoit]


    ich habe jetzt aber noch das Problem das der Subject irgentwie codiert ist, kann mir jemand sagen wie ich den string decoden kann

    ich habe Ihn schon aus der Email Extraiert in einer Variable.


    Spoiler anzeigen
    [autoit]

    Local $Subject = StringRegExp($Mail,"[Ss][Uu][Bb][Jj][Ee][Cc][Tt][\s]*:[\s]*(.+)\s",1)
    if IsArray($Subject) then $Subject = $Subject[0]

    [/autoit]

    So sieht der Codierte subjekt aus

    Spoiler anzeigen

    Subject: =?utf-8?b?QmFja3VwIEV4ZWMtTWVsZHVuZzogQXVmdHJhZyBtaXQgQXVzbmFobQ==?=
    =?utf-8?b?ZW4gYWJnZXNjaGxvc3NlbiAoU2VydmVyOiAiTkxSRUctREMxIikgKEF1ZnRyYQ==?=
    =?utf-8?b?ZzogInTDpGdsaWNoIikg?=

    Vielen Dank für eure Unterstützung.

  • Ja Schön läuft genauso gut wie mein gefixtes ... aber das Problem mit der Subjekt codierung habe ich immer noch, dafür brauche ich hilfe.

    Danke dennoch