Seite 1 von 1

Emails von einem Pop3-Server holen und weiterschicken

Verfasst: Montag 11. Dezember 2006, 11:01
von gerold
Hi!

Da am Wochenende die Emails bei uns in der Firma nicht korrekt weitergeleitet wurden, habe ich auf die Schnelle etwas mit Python programmiert. Es ist für mich immer wieder erstaunlich, wie einfach viele Probleme mit Python gelöst werden können.

Folgendes Programm holt Emails von einem POP3-Server und schickt diese an einen SMTP-Server weiter. Bei uns in der Firma wird dieses Programm seit heute dazu eingesetzt, um Emails von mehreren externen und internen POP3-Servern abzuholen und an unseren internen Exchange-Server weiterzuleiten.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
"""
simplemailgate.py

Holt Emails von einem POP3-Server und sendet diese unverändert an einen
SMTP-Server weiter.

Beispielaufruf: 
  simplemailgate.py <pop3server> <benutzername> <passwort> <smtpserver> <zieladresse>

"""

import sys
import poplib
import smtplib

POPSERVERPORT = 110
SMTPSERVERPORT = 25
SMTPFROM = "postmaster@XXXX.XX"


def fetch_email(
    popserverhost, popserverport, popuser, poppass, 
    smtpserverhost, smtpserverport, smtpfrom, smtpto
):
    """
    Holt Emails ab und schickt diese weiter.
    """
    
    pop3 = poplib.POP3(popserverhost, popserverport)
    pop3.user(popuser)
    pop3.pass_(poppass)
    
    pop3.set_debuglevel(1)
    
    maillist = pop3.list()[1]
    mailcount = len(maillist)
    
    print "Anzahl:", mailcount
    
    if maillist:
        smtp = smtplib.SMTP(smtpserverhost, smtpserverport)
        
        for i in range(1, mailcount + 1):
            # Email abholen
            mailtext = "\n".join(pop3.retr(i)[1])
            # Email senden
            smtp.sendmail(smtpfrom, smtpto, mailtext)
            # Email löschen
            pop3.dele(i)
        
        smtp.quit()
        smtp.close()
    
    pop3.quit()
    
    return True
    

def main():
    """
    Beispielaufruf: 
      simplemailgate.py <pop3server> <benutzername> <passwort> <smtpserver> <zieladresse>
    """
    
    if len(sys.argv) <> 6:
        print "Falsche Parameteranzahl"
        sys.exit(1)

    popserverhost = sys.argv[1]
    popserverport = POPSERVERPORT
    popuser = sys.argv[2]
    poppass = sys.argv[3]
    smtpserverhost = sys.argv[4]
    smtpserverport = SMTPSERVERPORT
    smtpfrom = SMTPFROM
    smtpto = sys.argv[5]
    
    if fetch_email(
        popserverhost, popserverport, popuser, poppass, 
        smtpserverhost, smtpserverport, smtpfrom, smtpto
    ):
        print "OK"
        print
        sys.exit(0)
    else:
        print "FEHLER"
        print
        sys.exit(1)


if __name__ == "__main__":
    main()
lg
Gerold
:-)

Verfasst: Montag 11. Dezember 2006, 14:18
von mkesper
Ähm, machen nicht fetchmail und Konsorten so etwas?
Ich meine, es ist schon toll, was man alles mit python machen kann, aber diese Tools sind schon hundertfach erprobt...

Verfasst: Montag 11. Dezember 2006, 21:02
von Leonidas
Nur dass gerade fetchmali dafür bekannt ist, Mails zu verlieren. Dann schon lieber getmail welches.. in Python geschrieben ist.

Verfasst: Montag 11. Dezember 2006, 23:45
von gerold
mkallas hat geschrieben:Ähm, machen nicht fetchmail und Konsorten so etwas?
Hi mkallas!

Willkommen im Python-Forum!

Ja, Fetchmail wäre eine Option gewesen. Man hätte nur Cygwin auf dem Exchange-Server installieren müssen. Fetchmail setze ich persönlich auch auf meinem Linux-Server für diese Arbeit ein.

Aber... ich habe für oben aufgezeigtes Skript (inkl. Testen) vielleich eine halbe Stunde gebraucht. :!: Und noch dazu weiß ich, dass die Emails nicht verloren sind, wenn es einen Fehler beim Übertragen zum SMTP-Server gibt.

Wir hatten schon mit zwei verschiedenen Programmen (nicht Fetchmail) das Problem, dass nicht alle Emails korrekt abgeholt wurden. Mit dem selber geschriebenen Programm gab es bis jetzt (also schon einen Arbeitstag lang) keine Probleme.

Irgendwie stehe ich drauf, wenn ich weiß, dass ich eine aussagekräftige Fehlermeldung vom Python bekomme wenn etwas nicht wie gewünscht läuft. Ich denke nicht, dass ich es bereuen werde, nicht Fetchmail genommen zu haben.

mfg
Gerold
:-)

Verfasst: Montag 11. Dezember 2006, 23:51
von gerold
Leonidas hat geschrieben:Dann schon lieber getmail welches.. in Python geschrieben ist.
Hi Leonidas!

Ich habe in getmail keine eingebaute Option gefunden, um Emails an einen SMTP-Server (Microsoft Exchange) weiterzuleiten. Außerdem braucht man schon länger, die Dokumentation von getmail zu lesen als oben aufgezeigtes Programm zu schreiben. :twisted:

lg
Gerold
:-)

Verfasst: Mittwoch 13. Dezember 2006, 13:32
von mkesper
Hallo,
gerold hat geschrieben: Hi mkallas!

Willkommen im Python-Forum!
Vielen Dank!

Ich hätte mich schon beinahe auf http://www.pythonforum.de angemeldet ;)
gerold hat geschrieben: Ja, Fetchmail wäre eine Option gewesen. Man hätte nur Cygwin auf dem Exchange-Server installieren müssen. Fetchmail setze ich persönlich auch auf meinem Linux-Server für diese Arbeit ein.

Aber... ich habe für oben aufgezeigtes Skript (inkl. Testen) vielleich eine halbe Stunde gebraucht. :!: Und noch dazu weiß ich, dass die Emails nicht verloren sind, wenn es einen Fehler beim Übertragen zum SMTP-Server gibt.
Das ist natürlich ein gutes Argument! :)