Emails von einem Pop3-Server holen und weiterschicken

Code-Stücke können hier veröffentlicht werden.
Antworten
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Montag 11. Dezember 2006, 11:01

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Montag 11. Dezember 2006, 14:18

Ä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...
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 11. Dezember 2006, 21:02

Nur dass gerade fetchmali dafür bekannt ist, Mails zu verlieren. Dann schon lieber getmail welches.. in Python geschrieben ist.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Montag 11. Dezember 2006, 23:45

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Montag 11. Dezember 2006, 23:51

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Mittwoch 13. Dezember 2006, 13:32

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! :)
Antworten