Modul zum Senden von Emails (simplemail.py)

Code-Stücke können hier veröffentlicht werden.
philippe
User
Beiträge: 4
Registriert: Mittwoch 7. November 2007, 20:54

ersten möchte ich an dieser stelle mitteilen, dass auch ich simplemail.py echt super finde!
zweitens bedanke ich mich bei gerold, der mir bei meinem dummen problem auf die sprünge geholfen hat....

aber der wahre grund für mein post ist folgender:
ich verwende nun simplemail seit einiger zeit und musste feststellen, dass bei kurzen netzunterbrüchen in ungünstigen momenten (wireless und co.) email verlohren gehen können. ich schreibe beim scheitern von send() einen logeintag so weiss ich was nicht versendet wurde (...) aber viel lieber wäre mir gar nichts unternehmen zu müssen - händisch versteht sich ;) .

nun meine idee:
ich will einen art email queue schreiben, welche die email bis zu 3 tagen zurück hält bis diese erfolgreich zugestellt werden konnte.

mein ansatz (pseudo code):

Code: Alles auswählen

loop mit 864 durchgängen:
     sendeversuch
     wenn erfolgreich: ende
     sonst: 300 sekunden schlafen
zustellung gescheitert: logeintrag schreibe.
vorteile:
- mail kann wahrscheinlich irgendwann zugestellt werden (innert 3 tagen)

nachteile:
- objekt im speicher
- laufender prozess, im schlechtesten fall 3 tage

fragen:
- hat jemand eine bessere idee?
- was kann verbessert werden??

mfg, philippe
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

philippe hat geschrieben:fragen:
- hat jemand eine bessere idee?
Also der Unix-Way ist, die Mail an den lokalen MTA zu vergeben und der soll sich darum kümmern. Dafür haben MTAs auch ihre Queues, wo sie Mails zwischenlagern, die gerade nicht weitergerelayt werden können. Man muss zugeben, dass SMTP ein recht robustes System ist (eben etwas was auch bei großen Netzwerkausfällen verursacht durch Atomwaffen - siehe ARPAnet noch läuft). Schade dass das durch das Spamming alles so zurückgedreht werden musste.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo philippe!

Ich halte den Vorschlag von Leonidas für die beste Lösung für dich. Unter Linux ist es ja kein großes Problem, einen MTA wie z.B. Postfix zu installieren. Die Emails verschickst du dann über den lokal eingerichteten SMTP-Server. Dieser kümmert sich dann um all das was du dir selber programmieren wolltest.

Unter Windows kannst du es mal mit dem JanaServer http://janaserver.de/ probieren. Wenn es damit nicht funktioniert, dann kannst du immer noch auf den mit *Cygwin* gelieferten *Exim* zurück greifen.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

gerold hat geschrieben:Unter Windows kannst du es mal mit dem JanaServer http://janaserver.de/ probieren. Wenn es damit nicht funktioniert, dann kannst du immer noch auf den mit *Cygwin* gelieferten *Exim* zurück greifen.
Daneben gibt es noch Hamster und Mercury, die beides Windows SMTP-Daemons sind.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

oder hMailServer, der ziemlich leicht zu konfigurieren ist
philippe
User
Beiträge: 4
Registriert: Mittwoch 7. November 2007, 20:54

besten dank für eure feedbacks,
ich werde mal brav Postfix installieren =)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hallo Gerold,

vielen Dank für Dein Modul. Ich habe es erfolgreich für die Lehre hier an der Uni einsetzen können (Bestätigungsmail an Studis, nach einer Anmeldung für eine kleine Aufgabe im HTML-Bereich). Eine Kleinigekeit würde ich gerne anmerken: Wäre toll, wenn mann das encoding des Outputs angeben könnte! (Ich habs im Quellcode hart reincodiert / bzw. geändert, aber das geht sicher eleganter) Oder hab ich nur die Möglichkeit übersehen?

Auf jeden Fall sehr schön!

Ciao,
Hyperion
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hyperion hat geschrieben:Wäre toll, wenn mann das encoding des Outputs angeben könnte!
Hallo Hyperion!

Die Attribute *content_charset* und *header_charset* sind dafür zuständig. Diese kann man zwar nicht direkt über die Methode *send()* einstellen, aber nach dem Initialisieren der Klasse *Email* neu setzen.

Code: Alles auswählen

email = Email(...)
email.content_charset = "utf-8"
email.header_charset = "utf-8"
email.send(...)
http://gelb.bcom.at/trac/simplemail/bro ... il.py#L209

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

*patsch* Ok, war damals in Zeitnot ... hätte ich auch so drauf kommen können ;) Hatte keine Instanz erstellt, sondern das ganze direkt abgesetzt, also

Code: Alles auswählen

Email(...=...).send()
Ok, nun weiß ich ja aber, dass es auch besser geht :D

Danke Dir!
mr.hide
User
Beiträge: 108
Registriert: Montag 29. August 2005, 14:02

Habs für mich nun erweitert, so dass man Bilder direkt in die Email einbinden kann.
hab Gerold angeboten es ihm zu geben.

Bei Interesse falls er sich nicht die ARbeit macht das einzubinden pn an mich.
Grüße
Matthias

- Fluchen befreit von Kummer und Leid -
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

mr.hide hat geschrieben:Habs für mich nun erweitert, so dass man Bilder direkt in die Email einbinden kann.
Hallo Leute!

Ich bin im Moment ein wenig überlastet. Deshalb habe ich den Code von mr.hide in einen Subversion-Branch gestellt.

http://gelb.bcom.at/svn/pub/simplemail/ ... s/mr.hide/

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Ich bin noch nicht ganz fertig, aber ich bin grad dabei simplemail ein wenig aufzupeppen und zu erweitern.

Erstmal den Quelltext aufgeräumt und einige Altlasten entfernt: http://paste.pocoo.org/show/39500/

Nun, es ist nicht mehr 100%ig Rückwertskompatibel, aber das war nicht mein Ziel. Demnächst wird noch ein einfacheres SMTP-Interface sowie ein einfaches Alternative-Multipart interface, um HTML und Textnachrichten einfach zu mixen.

Mal schaun, was draus wird :D

MfG EnTeQuAk

EDIT: link zur fehlerbereinigten Version aktualisiert
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Gibt's eine Chance, dass das eines Tages als offizielles Modul oder im pypi auftaucht?
lunar

mkallas hat geschrieben:Gibt's eine Chance, dass das eines Tages als offizielles Modul oder im pypi auftaucht?
Die LGPL erlaubt dir, den Code unter gleichen Lizenzbedingungen zu verändern und weiterzugeben. Ergo darfst du auch selbst ein Setuptools-Script dafür schreiben und das Ganze in den Cheeseshop packen ;) Wenn gerold dann das Paket übernehmen will, kannst du ihn ja als Maintainer oder Owner eintragen.
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Ich hab vor einiger Zeit an simplemail wieder weitergebastelt, rausgekommen ist eine bessere Aufteilung zwischen SMTP geblapper und dem eigentlichen Email wrapper.

Siehe http://trac.webshox.org/browser/misc/simplemail.py

Es ist auch alles schön dokumentiert, ok ne deutsche version werd ich wohl mal demnächst schreiben.
Sofern noch jemand ne Idee hat, was man verbessern kann, immer her damit! Das Interface zum benutzen ist fast das gleiche geblieben siehe das unten angefügte Beispiel (inner simplemail.py)


MfG EnTeQuAk
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Habe mir jetzt dein Beispiel nicht richtig angesehen... Aber wie wäre es, das ganze im http://pypi.python.org/pypi zur Verfügung zu stellen. Evtl. sogar zur Aufnahme in Python vorschlagen?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

pypi werd ich mich mal mit auseinandersetzen, aufnahme in python denke ich nicht. Zumindest werde ich nicht als Maintainer einspringen, ich hab nur mal ein wenig dran rumgebastelt :)
Wobei das ja immernoch gerolds modul ist *g*
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Dann werde ich wohl demnächst schaun, wie zuverlässig das funzt ;)

Wenn demnächst ein Student nicht zu den Prüfungen angemeldet wird ist Gerold schuld :D
lunar

jens hat geschrieben:Habe mir jetzt dein Beispiel nicht richtig angesehen... Aber wie wäre es, das ganze im http://pypi.python.org/pypi zur Verfügung zu stellen. Evtl. sogar zur Aufnahme in Python vorschlagen?
Siehe mein vorheriges Posting: Auch du kannst das in den pypi eintragen, wenn dir daran so viel liegt ;)

Wenn EnTeQuAk oder jemand anders das dann übernehmen will, steht dem ja auch nichts im Weg ;)
Leon
User
Beiträge: 9
Registriert: Dienstag 10. Juni 2008, 22:06

Hi!

Ich find das simplemail sehr praktisch!
Allerdings verwende ich imap und wollte die gesendeten emails auch in meinem email-client und online sehen.
Deshalb habe ich ans simplemail.py noch folgenden text angefügt:

#
# Email nach gesendet kopieren...
#
imap_server = "imap.server.de"
im = imaplib.IMAP4(imap_server)
im.login(self.smtp_user, self.smtp_password)

im.select("Sent")
im.append("Sent", None, None, msg.as_string())

im.close()
im.logout()

Vielleicht hilfts ja jmd .-)

Leon
Antworten