Modul zum Senden von Emails (simplemail.py)

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

Modul zum Senden von Emails (simplemail.py)

Beitragvon gerold » Montag 25. April 2005, 21:43

(Stichworte: Email versenden, Umlaute im Betreff, Coding, Attachments)

Hi!

Das Modul "simplemail" verwende ich zum Versenden von Emails.

Und so einfach ist es damit eine Email zu versenden:

Code: Alles auswählen

from simplemail import Email
Email(
    from_address = "absender@domain.at",
    to_address = "empfaenger@domain.at",
    subject = "Betreff",
    message = "Das ist der Nachrichtentext"
).send()

Weitere Beispiele finden sich im Quellcode in der Funktion testen().

Um dieses Forum zu entlasten, habe ich den Quellcode ausgelagert:

>>> Hier findest du python-simplemail <<<

mfg
Gerold
:-)
Zuletzt geändert von gerold am Freitag 15. Januar 2010, 15:52, insgesamt 15-mal geändert.
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: 5553
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Modul zum Senden von Emails mit Anhang (simplemail.py)

Beitragvon gerold » Samstag 20. August 2005, 09:59

(Stichworte: Email versenden, Umlaute im Betreff, Coding, Anhang, Anhänge, Attachment)

Hi!

- Es ist so weit -- simplemail.py kann jetzt auch mit Anhängen umgehen.
- (2005-09-29) Es gibt jetzt auch eine Möglichkeit, detailierte Rückmeldungen beim Versand an mehrere Adressen zu bekommen.
- (2005-11-11) Man kann sich jetzt auch am SMTP-Server mit Benutzername und Passwort anmelden.
- (2005-12-10) Schlampigkeitsfehler ausgebessert.

Es würde mich freuen, wenn du hier eine Nachricht hinterlässt, ob das Modul funktioniert oder ob es Fehler damit gibt.

mfg
Gerold
:-)
Zuletzt geändert von gerold am Mittwoch 22. März 2006, 15:50, insgesamt 9-mal geändert.
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: 5553
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Einfaches Beispiel

Beitragvon gerold » Samstag 20. August 2005, 10:17

Einfaches Beispiel

Code: Alles auswählen

# Einfaches Beispiel
from simplemail import Email

email = Email(
    from_address = "von_adresse@domäne",
    to_address = "empfaenger@domäne"
)
email.subject = "Das ist der Betreff mit Umlauten (öäüß)"
email.message = "Das ist der Nachrichtentext mit Umlauten (öäüß)"
email.send()


Noch einfacheres Beispiel

Code: Alles auswählen

# Noch einfacheres Beispiel
from simplemail import Email
Email(
    from_address = "von@domäne",
    to_address = "empfänger@domäne",
    subject = "Das ist der Betreff",
    message = "Das ist der Nachrichtentext"
).send()


lg
Gerold
:-)
Zuletzt geändert von gerold am Sonntag 2. Juli 2006, 17:06, insgesamt 3-mal geändert.
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: 5553
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Komplexeres Beispiel mit Umlauten und Anhaengen

Beitragvon gerold » Samstag 20. August 2005, 10:42

Komplexeres Beispiel mit Umlauten und Anhaengen

Code: Alles auswählen

# Komplexeres Beispiel mit Umlauten und Anhaengen
from simplemail import Email

email = Email()

# Ansender
email.from_address = "von@domäne"
email.from_caption = "Gerolds Server"

# Empfaenger
email.recipients.add("gerold@gp-server.gp", "Gerold Penz (lokal)")
email.recipients.add("gerold.penz@tirol.utanet.at", "Gerold Penz (utanet)")

# Betreff
email.subject = "Komplexeres Beispiel"

# Nachricht
email.message = \
    "Das ist ein etwas komplexeres Beispiel\n" + \
    "\n" + \
    "Hier steht normaler Text mit Umlauten (öäüß).\n" + \
    "Groß kann man sie auch schreiben -- ÖÄÜ.\n" + \
    "\n" + \
    "mfg\n" + \
    "Gerold\n" + \
    ":-)"

# Anhaenge
email.attachments.add_filename("/home/gerold/font_shadow_fuzzy.jpg")
email.attachments.add_filename(
    "/home/gerold/GEROLD/Bilder und Videos/Eigene Fotos/Glock 19 auf Holzplatte.JPG"
)

# Senden
if email.send():
    print "Nachricht gesendet."
else:
    print "Die Nachricht wurde nicht versendet."


mfg
Gerold
:-)
Zuletzt geändert von gerold am Sonntag 2. Juli 2006, 17:08, insgesamt 3-mal geändert.
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: 5553
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

HTML-Email

Beitragvon gerold » Samstag 20. August 2005, 10:54

HTML-Email

Code: Alles auswählen

# HTML-Email
from simplemail import Email

email = Email(
    from_address = "server@gp-server.gp",
    to_address = "gerold@gp-server.gp"
)
email.subject = "Das ist ein HTML-Email"
email.content_subtype = "html"
email.message = \
"""
<h1>Das ist die Überschrift</h1>
<p>
  Das ist ein <b>kleiner</b><br />
  Absatz.
</p>
<p>
  Das ist noch ein <i>Absatz</i>.
</p>
<p>
  mfg<br />
  Gerold<br />
  :-)
</p>
"""
email.send()

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Gast

Re: Komplexeres Beispiel mit Umlauten und Anhaengen

Beitragvon Gast » Montag 12. September 2005, 12:49

gerold hat geschrieben:Komplexeres Beispiel mit Umlauten und Anhaengen

Code: Alles auswählen

# Komplexeres Beispiel mit Umlauten und Anhaengen
from simplemail import Email

email = Email()

# Ansender
email.from_address = "server@gp-server.gp"
email.from_caption = "Gerolds Server"

# Empfaenger
email.recipients.add("gerold@gp-server.gp", "Gerold Penz (lokal)")
email.recipients.add("gerold.penz@tirol.utanet.at", "Gerold Penz (utanet)")

# Betreff
email.subject = "Komplexeres Beispiel"

# Nachricht
email.message = \
    "Das ist ein etwas komplexeres Beispiel\n" + \
    "\n" + \
    "Hier steht normaler Text mit Umlauten (öäüß).\n" + \
    "Groß kann man sie auch schreiben -- ÖÄÜ.\n" + \
    "\n" + \
    "mfg\n" + \
    "Gerold\n" + \
    ":-)"

# Anhaenge
email.attachments.add_filename("/home/gerold/font_shadow_fuzzy.jpg")
email.attachments.add_filename(
    "/home/gerold/GEROLD/Bilder und Videos/Eigene Fotos/Glock 19 auf Holzplatte.JPG"
)

# Senden
if email.send():
    print "Nachricht gesendet."
else:
    print "Die Nachricht wurde nicht versendet."


mfg
Gerold
:-)

Hallo erstmal,
danke für dieses Script :D
leider habe ich noch das ein oder andere Problemchen:
ich habe den Quellcode von simplemail in eine neue Datei Namens simplemail.py eingefügt und abgespeichert.
Im selben Ordner habe ich eine Datei sendmail.py erzeugt und den Code des o.g. Beispiels eingefügt und abgespeichert.
In der simplemail.py habe ich dann noch den SMTP Server eingetragen und in der sendmail.py meinen Absender und einen Empfänger ausgetauscht.

Wenn ich jetzt die sendmail starte, bringt er mir immer sofort diesen Fehler:
Traceback (most recent call last):
File "G:\zv\dvo\WWW\HIS-Massenmail\sendmail.py", line 29, in ?
if email.send():
File "G:\zv\dvo\WWW\HIS-Massenmail\simplemail.py", line 416, in send
smtp.connect(self.smtp_server)
File "C:\PROGRA~1\Python23\lib\smtplib.py", line 302, in connect
raise socket.error, msg
error: (10061, 'Connection refused')


Wo liegt mein Fehler ?
MfG
Buschdel
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5553
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: Komplexeres Beispiel mit Umlauten und Anhaengen

Beitragvon gerold » Montag 12. September 2005, 16:01

Anonymous hat geschrieben:danke für dieses Script :D
[...]
ich habe den Quellcode von simplemail in eine neue Datei Namens simplemail.py eingefügt und abgespeichert.
Im selben Ordner habe ich eine Datei sendmail.py erzeugt und den Code des o.g. Beispiels eingefügt und abgespeichert.
In der simplemail.py habe ich dann noch den SMTP Server eingetragen und in der sendmail.py meinen Absender und einen Empfänger ausgetauscht.

Hi Buschdel!

Normalerweise versucht "simplemail.py" "localhost" als SMTP-Server zu verwenden. Wenn du lokal keinen SMTP-Server laufen hast, dann must du mit dem Parameter "smtp_server" einen anderen Server verwenden. Ich würde den Server *nicht* direkt im "simplemai.py"-Modul ändern.

Code: Alles auswählen

email = Email(
    smtp_server = "localhost"
)


Musst du dich evt. an deinem SMTP-Server anmelden, um senden zu können?

Code: Alles auswählen

email = Email(
    smtp_server = "localhost",
    smtp_user = "benutzername",
    smtp_password = "passwort
)


Vielleicht ist dieser Server so eingestellt, dass du dich zuerst an die Mailbox anmelden musst. Dann funktioniert dieses Skript sicher nicht.

mfg
Gerold
:-)

PS: Ich würde mein Skript nicht "sendmail.py" nennen. Das könnte sich evt. mal mit einem eingebauten Namen schlagen.
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
jens
Moderator
Beiträge: 8426
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Montag 26. September 2005, 14:20

Ich hab dein simplemail testweise in PyLucid rein gepackt...

Lokal auf meinem Server läuft es, ich hab auch eine email verschicken lassen, die auch laut return-status verschickt wurde... Aber eigentlich hab ich auf dem Ubuntu mich nicht großartig mit eMail Server beschäftigt... Also es ist eigentlich nix dafür eingerichtet... Die email ist bisher auch nicht angekommen...

Kann man da noch mehr Status Informationen bekommen, ob die Email auch wirklich verschickt wurde???

Dann hab ich's mal bei Hosteurope versucht... Zu erstmal läuft das ganze nicht so einfach mit Python 2.2.1 :(
Aber naja, ich hab ja eh schon Backports eingebaut und diese dann mit ./Lib/email/* erweitert... Dennoch klappt es nicht. Ich erhalte einen SyntaxError in Iterators.py ???
SyntaxError: invalid syntax (Iterators.py, line 19)
__doc__ = 'Invalid syntax.'
__getitem__ = <bound method SyntaxError.__getitem__ of <exceptions.SyntaxError instance at 0x82d6a24>>
__init__ = <bound method SyntaxError.__init__ of <exceptions.SyntaxError instance at 0x82d6a24>>
__module__ = 'exceptions'
__str__ = <bound method SyntaxError.__str__ of <exceptions.SyntaxError instance at 0x82d6a24>>
args = ('invalid syntax', ('PyLucid_python_backports/email/Iterators.py', 19, 14, ' yield self\n'))
filename = 'PyLucid_python_backports/email/Iterators.py'
lineno = 19
msg = 'invalid syntax'
offset = 14
print_file_and_line = None
text = ' yield self\n'


Anscheinend irgendwas mit yield... Der Teil aus Iterators.py:

Code: Alles auswählen

def walk(self):
    """Walk over the message tree, yielding each subpart.

    The walk is performed in depth-first order.  This method is a
    generator.
    """
    yield self
    if self.is_multipart():
        for subpart in self.get_payload():
            for subsubpart in subpart.walk():
                yield subsubpart


EDIT: OK, wenn ich in Iterators.py ein "from __future__ import generators" einfüge geht's weiter, mit dem nächsten Fehler:
NameError: global name 'basestring' is not defined
__doc__ = 'Name not found globally.'
__getitem__ = <bound method NameError.__getitem__ of <exceptions.NameError instance at 0x832d6ac>>
__init__ = <bound method NameError.__init__ of <exceptions.NameError instance at 0x832d6ac>>
__module__ = 'exceptions'
__str__ = <bound method NameError.__str__ of <exceptions.NameError instance at 0x832d6ac>>
args = ("global name 'basestring' is not defined",)

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5553
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Dienstag 27. September 2005, 10:52

Hi Jens!

jens hat geschrieben: Kann man da noch mehr Status Informationen bekommen, ob die Email auch wirklich verschickt wurde???

Ich werde meinen Code noch einmal durchgehen und mehr Statusmeldungen über den Versand zurück geben.

jens hat geschrieben: Aber naja, ich hab ja eh schon Backports eingebaut und diese dann mit ./Lib/email/* erweitert... Dennoch klappt es nicht. Ich erhalte einen SyntaxError in Iterators.py ???

Hier stehe ich an -- mit diesen Meldungen kann ich nichts anfangen. Da kann ich dir leider nicht weiter helfen.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
jens
Moderator
Beiträge: 8426
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Dienstag 27. September 2005, 15:20

Hab mir jetzt eine mini-Klasse gebastelt, mit der es geht's:

Code: Alles auswählen

class email:
    def send(self, to, subject, text):
        import time, smtplib
        from email.MIMEText import MIMEText

        msg = MIMEText(
            _text = text,
            _subtype = "plain",
            _charset = "UTF-8"
        )
        msg['From'] = "auto_mailer@blablabla"
        msg['To'] = to
        msg['Subject'] = subject
        # Datum nach RFC 2822 Internet email standard.
        msg['Date'] = time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime())
        msg['User-Agent'] = "PyLucid (Python v%s)" % sys.version

        s = smtplib.SMTP()
        s.connect()
        s.sendmail(msg['From'], [msg['To']], msg.as_string())
        s.close()


Ich brauche eigentliche eh nur plain-text Nachrichten...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5553
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Donnerstag 29. September 2005, 12:17

gerold hat geschrieben: Ich werde meinen Code noch einmal durchgehen und mehr Statusmeldungen über den Versand zurück geben.

Hi!

Ich habe den Code um mehr Statusmeldungen erweitert. Generell kann man aber von folgender Aussage ausgehen:

Wenn eine Email an *einen* Empfänger geschickt wird und dabei kein Fehler auftritt, dann hat der SMTP-Server die Email akzeptiert oder zumindest stillschweigend angenommen.
Wenn die Email trotzdem nicht an ein Postfach ausgeliefert wird, dann sollte man sich die Logfiles des SMTP-Servers ansehen.

Schickt man ein Email an *mehrere* Empfänger, dann tritt kein Fehler auf, wenn die Email an mindestens einen Empfänger geschickt werden konnte. Um herauszufinden, ob auch wirklich alle Empfänger das Email zugesandt bekommen haben, kann man jetzt zusätzlich das Attribut `statusdict` abfragen.

Code: Alles auswählen

if email.statusdict:
    print "Fehler bei mind. einem Empf."
    print email.statusdict
else:
    print "OK"


lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
ChrisSek
User
Beiträge: 10
Registriert: Samstag 8. Mai 2004, 13:06
Wohnort: Bremen
Kontaktdaten:

Beitragvon ChrisSek » Donnerstag 10. November 2005, 16:12

Hab' mir das Modul mal angeschaut. Klappte bei mir mit dem Anmelden bei meinem Provider nicht. Habe deshalb folgende Zeilen geändert:

Code: Alles auswählen

smtp = smtplib.SMTP()
# Geändert zu
smtp = smtplib.SMTP(self.smtp_server)


und

Code: Alles auswählen

smtp.connect(self.smtp_server)
# Geändert zu
smtp.login(self.smtp_user, self.smtp_password)


Dann Email mit dem passenden Konstruktor aufrufen - Klappt super :)

Wie sieht's mit dem Copyright aus? Darf ich das Modul in nen Programm von mir integrieren? Ist echt ne nette Lösung!
Benutzeravatar
Leonidas
Administrator
Beiträge: 16021
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 10. November 2005, 16:18

ChrisSek hat geschrieben:Wie sieht's mit dem Copyright aus? Darf ich das Modul in nen Programm von mir integrieren? Ist echt ne nette Lösung!

Im Header steht doch, dass es unter LGPL steht. Also: ja.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
ChrisSek
User
Beiträge: 10
Registriert: Samstag 8. Mai 2004, 13:06
Wohnort: Bremen
Kontaktdaten:

Beitragvon ChrisSek » Donnerstag 10. November 2005, 16:25

Leonidas hat geschrieben:Im Header steht doch, dass es unter LGPL steht. Also: ja.


Ups, hab ich total überlesen. Sorry und danke :)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5553
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Donnerstag 10. November 2005, 16:47

ChrisSek hat geschrieben:Hab' mir das Modul mal angeschaut. Klappte bei mir mit dem Anmelden bei meinem Provider nicht.
[...]
Dann Email mit dem passenden Konstruktor aufrufen - Klappt super :)

Wie sieht's mit dem Copyright aus? Darf ich das Modul in nen Programm von mir integrieren? Ist echt ne nette Lösung!

Hi ChrisSek!

Natürlich darfst du es verwenden. Deshalb habe ich es hier rein gestellt und es freut mich, wenn es verwendet wird.

Das mit der Authentifizierung werde ich demnächst einbauen. Da sieht man wieder, wie schnell etwas vergessen wird, wenn man etwas selbst nicht braucht. :shock:

Danke für den Hinweis. :D

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.

Zurück zu „Codesnippets“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder