Als kleine Übung habe ich mich kürzlich wieder intensiver in Python 3 eingearbeitet, um zu testen, wie ich mit Python automatisiert E-Mails versenden. Falls du noch Anfänger bist und näher in die Programmierung mit Python einsteigen möchtest, ist das hier das richtige Tutorial für dich.
Stell dir folgendes Szenario vor:
Du hast die Namen und E-Mail-Adressen von mehreren Kontaktpersonen. Ferne möchtest du eine Email an jeden dieser Kontakte senden und dabei eine Standard-Nachricht am Anfang einfügen.
Beispiel der Email-Nachricht: "Hallo [Name]"
Der Einfachheit halber kannst du die Beispiel-Kontaktdaten in einer Datei speichern, anstatt in einer SQL-Datenbank. Ebenso kannst die Vorlage der Nachricht, die du senden möchtest, in einer Datei speichern.
Voraussetzung zum Senden von Emails in Python
Das smtplib-Modul von Python ist im Grunde alles, was du brauchst, um E-Mails zu verschicken. Der einzige Haken ist, dass hier keine Betreffzeile oder zusätzlichen Informationen mitgeschickt werden können. Für richtige E-Mails brauchst du jedoch eine Betreffzeile sowie weitere Funktionalitäten, wie Dokumenten-Anhänge oder Bilder.
Für diese etwas "komplexeren Emails" eignet sich das email-Modul von Python. Behalte jedoch im Hinterkopf, dass das email-Modul an sich keine Emails verschicken kann. Du benötigst daher eine Kombination beider Module (smtplib sowie email).
Emails verschicken in 4 Schritten
Hier sind vier grundlegende Schritte zum Versenden von E-Mails in Python 3:
- Einen SMTP Server einrichten und im Email-Account einloggen.
- Das
MIMEMultipart
Nachrichtenobjekt erstellen. Im Anschluss muss das Objekt mit den entsprechenden Headern für die FelderFrom
,To
undSubject
geladen werden. - Der Nachrichtentext muss hinzugefügt werden.
- Die Nachricht über das SMTP Server Objekt absenden.
In den folgenden Abschnitten gehen wir Schritt-für-Schritt vor, um den Prozess so einfach wie möglich zu gestalten.
Nehmen wir an, du hast eine Kontaktdatei kontakte.txt
, die wie folgt aussieht, wenn du sie öffnest:
- Max max.mustermann@gmail.com
- Petra petra.python@gmail.com
Jede Zeile in der Textdatei repräsentiert einen einzelnen Kontakt. Die Datei enthält den Vornamen, gefolgt von der Emailadresse.
Weiterhin haben wir eine Datei namens nachricht.txt
. Diese Datei enthält unsere Standard-Emailnachricht:
Hallo ${KONTAKT_NAME},
Ich lerne gerade Python 3 und wünsche dir ein tolles Wochenende.
Viele Grüße
Hast du das Wort "${KONTAKT_NAME}
" gesehen?
Das ist ein sogenannter Template-String in Python. Template Strings kannst du einfach durch andere Strings ersetzten. In unserem Beispiel wird der Template String ${KONTAKT_NAME}
durch den eigentlichen Vornamen der Person ersetzt, wie du gleich sehen wirst.
Lass uns nun mit dem Python-Code starten.
Als erstes müssen wir die Kontakte aus der Datei kontakte.txt
einlesen. Wir können diesen Teil auch in eine eigene Funktion verallgemeinern.
# Vornamen und Email-Adressen
def getContacts(filename):
namen = []
emails = []
with open(filename, mode='r', encoding='utf-8') as contactsFile:
for a_contact in contactsFile:
namen.append(a_contact.split()[0])
emails.append(a_contact.split()[1])
return namen, emails
Die Funktion getContacts()
nimmt einen Dateinamen als Argument. Sie öffnet die Datei (kontakte.txt), liest jede Zeile (d.h. jeden Kontakt) ein, teilt sie in Vorname und E-Mail auf und fügt sie dann in zwei separate Listen ein. Schließlich werden die beiden Listen von der Funktion zurückgegeben.
Als nächstes brauchen wir eine Funktion, die unsere Nachrichten-Vorlage (z.B. nachricht.txt
) einliest und ein Template-Objekt
zurückgibt, das aus ihrem Inhalt besteht.
from string import Template
def readTemplate(filename):
with open(filename, 'r', encoding='utf-8') as templateFile:
templateFileNachricht = templateFile.read()
return Template(templateFileNachricht)
Genau wie vorhin, nimmt diese Funktion einen Dateinamen als Argument entgegen.
Um die E-Mail zu versenden, musst du das Simple Mail Transfer Protocol (SMTP) verwenden. Wie bereits oben erwähnt, bietet Python die entsprechenden Bibliotheken (smtplib und email), die diese Aufgabe übernehmen.
# smtplib Module importieren
import smtplib
# SMTP-Server einrichten
s = smtplib.SMTP(host='deine_host_adresse', port=dein_email_port)
s.starttls()
s.login(MEINE_ADRESSE, PASSWORT)
Im obigen Codeschnipsel importierst du das smtplib
-Modul und erstellst dann eine SMTP-Instanz, die eine SMTP-Verbindung kapselt. Als Parameter werden die Hostadresse und eine Portnummer übergeben. Beides hängt von den SMPT-Einstellungen deines jeweiligen E-Mail-Anbieters ab.
Du musst die Hostadresse und die Portnummer deines E-Mail-Anbieters (GMX, Gmail, Web, Outlook, etc.) verwenden, damit das Ganze funktioniert.
MEINE_ADRESSE
und PASSWORT
sind zwei Variablen, die die vollständige E-Mail-Adresse und das Passwort des Email-Kontos enthalten, das du benutzen willst.
Jetzt ist ein guter Zeitpunkt, um die Kontaktinformationen und die Nachrichtenvorlagen mit den oben definierten Funktionen abzurufen.
namen, emails = getContacts('kontakte.txt') # Kontakte lesen
messageTemplate = readTemplate('nachricht.txt')
Lass uns nun für jeden dieser Kontakte die Mail separat verschicken.
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
# Sende eine Email für jeden Kontakt
for name, email in zip(namen, emails):
msg = MIMEMultipart() # Erstelle Nachricht
# Vorname in die Nachricht einfügen
message = messageTemplate.substitute(KONTAKT_NAME=name.title())
# Parameters der Nachricht vorbereiten
msg['From']=MEINE_ADRESSE
msg['To']=email
msg['Subject']="Ich lerne Python 3"
# Nachricht hinzufügen
msg.attach(MIMEText(message, 'plain'))
# Nachricht über den eingerichteten SMTP-Server abschicken
s.send_message(msg)
del msg
Für jeden Namen
und jede E-Mail
(aus der Kontaktdatei) erstellst du ein MIMEMultipart-Objekt, richtest die From-
, To-
und Subject-Header
als Keyword-Dictionary ein und fügst dann den Nachrichtentext als reinen Text an das MIMEMultipart-Objekt
an. Falls du mehr über andere MIME-Typen erfahren möchtest, kannst du dir die offizielle Python-Dokumentation anschauen.
Außerdem wird in in Zeile 10 im obigen Code das Template ${KONTAKT_NAME}
durch den tatsächlichen Vornamen ersetzt habe, der aus der Kontaktdatei extrahiert wurde.
In diesem Beispiel lösche ich das MIMEMultipart
Objekt und erzeuge es jedes Mal neu, wenn for-Schleife durchlaufen wurde. Sobald das erledigt ist, kannst du die Nachricht mit der send_message() Funktion des SMTP-Objekts, das du zuvor erstellt hast, versenden.
Das Skript testen
Wenn du bis hierhin mit gecodet hast, kannst du das Python-Skript (Dateiendung .py) abspeichern und danach über deine IDE oder die Kommandozeile aufrufen.
Den vollständigen Code dieses Python-Tutorials findest du nachfolgend.
Hier ist der vollständige Code zum Versenden von Emails mit Python:
import smtplib
from string import Template
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
MEINE_ADRESSE = 'test@test.com'
PASSWORT = 'meinpasswort'
def getContacts(filename):
namen = []
emails = []
with open(filename, mode='r', encoding='utf-8') as contactsFile:
for a_contact in contactsFile:
namen.append(a_contact.split()[0])
emails.append(a_contact.split()[1])
return namen, emails
def readTemplate(filename):
with open(filename, 'r', encoding='utf-8') as templateFile:
templateFileNachricht = templateFile.read()
return Template(templateFileNachricht)
def main():
namen, emails = getContacts('kontakte.txt')
messageTemplate = readTemplate('nachricht.txt')
s = smtplib.SMTP(host='deine_host_adresse', port=dein_email_port)
s.starttls()
s.login(MEINE_ADRESSE, PASSWORT)
for name, email in zip(namen, emails):
msg = MIMEMultipart()
message = messageTemplate.substitute(KONTAKT_NAME=name.title())
print(message)
msg['From']=MEINE_ADRESSE
msg['To']=email
msg['Subject']="Ich lerne Python 3"
msg.attach(MIMEText(message, 'plain'))
s.send_message(msg)
del msg
s.quit()
if __name__ == '__main__':
main()
Viel Spaß beim Nachbauen dieses Python-Tutorials!
- Programmiere echte Apps als Anfänger
- Keine Installation, sofort loslegen
- Komplett praxisbezogen
- Zugriff auf Online-Editor