Modul zum Senden von Emails (simplemail.py)

Code-Stücke können hier veröffentlicht werden.
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
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Superteil: einfach zu bedienen und bei der Verwendung sehr gut lesbar. Soll simplemail denn auch auf Dauer nur zum Versand genutzt werden? Ansonsten wäre ja noch eine Methode gut, um unkompliziert gucken zu können ob neue Emails gekommen sind. :P
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

snafu hat geschrieben:Ansonsten wäre ja noch eine Methode gut, um unkompliziert gucken zu können ob neue Emails gekommen sind. :P
Bitte nicht. Es gibt viel zu viele Methoden wie man auf Mails zugreifen kann: IMAP4, POP3, Maildir (+ Abwandlungen), MH, mbox (+ Abwandlungen), dass das definitiv übers ziel hinausschießen würde.

Wenn du so etwas willst, solltest du ein anderes Modul nehmen.
Zawinski's Law hat geschrieben:Every program attempts to expand until it can read mail. Those programs which cannot so expand are replaced by ones which can.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Also zumindest ich habe nicht vor auch noch einen E-Mail Empfang einzubauen, da das dann auch imho den Sinn dieses Moduls übersteigt. Klein, Fein und leicht zu benutzen. Sollte ich da noch nen Empfang einbauen, am besten noch die von Leonidas genannten -- nein Danke.


Aber hey, es steht jedem Frei das Programm nach seinen Interessen zu erweitern :=)


Gruß, Christopher
Benutzeravatar
Klip
User
Beiträge: 98
Registriert: Donnerstag 10. August 2006, 20:39

Vielen Dank für dieses tolle Modul, Gerold!

Funktioniert einwandfrei, nur leider stelle ich mich etwas blöd an. Ich habe eine Schleife, die die Empfänger aus einer Datei ausliest. Da man später ja Empfänger nur noch per recipients.add() hinzufügen kann, müsste ich dann den jeweils ersten Empfänger der Liste wieder entfernen.

Ich finde nur nicht raus, wie ich Zugriff auf die recipients-Liste kriege. Wenn ich probiere, die Liste direkt zu bearbeiten, bekomme ich eine Meldung, dass das Objekt len(), append(), pop(), usw. nicht kennt. Hier ein Beispiel:

Code: Alles auswählen

def send_mail(mail_to, attachment, path_to_here):
        email.recipients.add(mail_to)
        rec_list = email.recipients.get_list
        print len(rec_list)
Fehlermeldung:

Code: Alles auswählen

in send_mail
    print len(rec_list)
TypeError: object of type 'instancemethod' has no len()
Kann mir da vielleicht jemand auf die Sprünge helfen? Ich würde gerne die Empfängerliste bearbeiten irgendwie.

Ich hoffe, die Frage ist hier im Thread richtig aufgehoben.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Du musst die Funktion natürlich auch ausführen:

Code: Alles auswählen

rec_list = email.recipients.get_list()
Benutzeravatar
Klip
User
Beiträge: 98
Registriert: Donnerstag 10. August 2006, 20:39

Oooh, die Klammern waren's. Vielen Dank!

Klappt tadellos! Habe die Recipients-Klasse jetzt um eine pop-Methode erweitert, damit sie mir alle Empfänger bis auf den gerade gebrauchten wieder rauswirft :)

EDIT: Habe jetzt auch die Attachment-Klasse etwas modifiziert, sodass man alle Dateianhänge, die bis dahin in der Liste waren, rausnehmen kann. Vielleicht kannst du es ja gebrauchen.

Code: Alles auswählen

    def pop_all(self):
        """Delete all attachments from list"""
        for i in range(len(self._attachments)):
                       self._attachments.pop()
Vielleicht geht das noch eleganter ^^ Funktionieren tut es jedenfalls.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Code: Alles auswählen

    def pop_all(self):
        """Delete all attachments from list"""
        self._attachments = []
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Ich hab die beiden Methoden mal eingebaut: http://svn.webshox.org/public/sandbox/simplemail.py


MfG EnTeQuAk
INFACT
User
Beiträge: 385
Registriert: Freitag 5. Dezember 2008, 16:08

Sehr geehrtes Python Forum,
Ich habe versucht mal ein bisschen mit SM herumzuspielen, aber es funktioniert nicht
Ich habe es mit mehreren Möglichkeiten versucht.
Der Fehler ist immer

Code: Alles auswählen

Traceback (most recent call last):
  File "C:/Dokumente und Einstellungen/Robin/Desktop/VIRUS/New Main/email.py", line 14, in <module>
    email.send()
  File "C:\Python\Lib\simplemail.py", line 343, in send
    smtp.connect(self.smtp_server)
  File "C:\Python\lib\smtplib.py", line 310, in connect
    raise socket.error, msg
error: (10061, 'Connection refused')
Mein Code:

Code: Alles auswählen

from simplemail import Email

email = Email()
email.from_address = "meine email@web.de"
email.smpt_server = "smtp.web.de"
email.smtp_user = "meine email"
email.smtp_password = "PASSWORT" 
email.to_address = ""
email.subject = "Test "
email.message = """Das ist die Nachricht
Noch ne Zeile"""
email.recipients.add("")
email.use_tls = True
email.send()
Kann mir jemand helfen?

Danke!
Zuletzt geändert von INFACT am Mittwoch 14. April 2010, 21:20, insgesamt 1-mal geändert.
[b][i]ein kleines game für die die lust haben http://konaminut.mybrute.com[/i][/b]
;-)
sebste
User
Beiträge: 11
Registriert: Mittwoch 22. Juli 2009, 12:50

Hallo Gerold!
Vielen Dank für dieses schöne Stück Software!
Ich verwende simplemail zum versenden von html mails. Bei einigen wenigen Empfängern kommen die Mails verstümmelt an (Umlaute und Sonderzeichen werden nicht oder falsch dargestellt) Mein verdacht war dass irgendwo eine angabe für das charset fehlt und die clients raten.

Was das coding angeht sieht es so aus:

Coding der Pythonmodule: utf-8 (ausser simplemail, das habe ich gelassen wie es ist)

content_subtype = "text/html"
content_charset = "iso-8859-1"
header_charset = "utf-8"

Im meta des HTML codes habe ich ebenfalls utf-8 als charset angegeben.

--
Erster Gedanke: content_charset ebenfalls auf utf-8 setzen, wäre ja naheliegend. wenn ich das tue, wird in der mail wird dann der größte Teil einfach abgeschnitten.
--
Irgend eine Idee was da schief läuft? Das Problem ist, ich kann den Fehler hier nicht nachstellen, da bei allen Rechnern mit verschiedenen os und clients alles gut aussieht. Ach ja, Die Empfänger mit dem Problem verwenden Outlook 2003 / SP3. Laut code der Antworten scheint auch ein Exchangeserver irgendwo beteiligt zu sein.

Liebe Grüße, Sebastian
sebste
User
Beiträge: 11
Registriert: Mittwoch 22. Juli 2009, 12:50

Ok - bin mittlerweile ein stück weiter,
hatte den content mal explizit nach utf8 encoded, seither sieht es ganz gut aus. Getested habe ich es noch nicht. Allerdings gehe ich auch davon aus, dass am client irgendwelche komischen codings eingestellt sein könnten.

Komisch ist aber, dass der content immer base64 codiert wird, sobald ich content_charset auf utf-8 umstelle. quoted printable wäre natürlich schöner. ist das normal oder ein bug?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo sebste!
sebste hat geschrieben:Ok - bin mittlerweile ein stück weiter
Da bin ich froh, denn ich kann mich im Moment nicht darum kümmern.
sebste hat geschrieben:Komisch ist aber, dass der content immer base64 codiert wird, sobald ich content_charset auf utf-8 umstelle. quoted printable wäre natürlich schöner. ist das normal oder ein bug?
Mit base64 kann jeder Email-Client umgehen, deshalb ist das für mich im Moment nicht wichtig. Ich werde mich sowiso in ein paar Monaten nochmal um simplemail kümmern. Ein kleiner Rewrite kann nicht schaden.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
lutz.horn
User
Beiträge: 205
Registriert: Dienstag 8. November 2005, 12:57
Wohnort: Pforzheim

Das Modul gefällt mir.

Wie wäre es, es auf http://pypi.python.org/ zu veröffentlichen?
https://www.xing.com/go/invite/18513630.6a91d4
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

lutz.horn hat geschrieben:Wie wäre es, es auf http://pypi.python.org/ zu veröffentlichen?
Hallo lutz.horn!

Das ist auf meiner ToDo-Liste. ;-)

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

gerold hat geschrieben:Ein kleiner Rewrite kann nicht schaden.
Allerdings. ;)

Ich würde Dinge wie Recipients.count() z.B. eher als Property lösen. Die ganze Klasse eignet sich IMHO dazu, von `list` zu erben. Für Attachements würde ich wahrscheinlich überhaupt keine eigene Klasse machen, sondern einfach ne Liste verwenden.
Antworten