Emails senden mit Python – Anfänger-Tutorial

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:

  1. Einen SMTP Server einrichten und im Email-Account einloggen.
  2. Das MIMEMultipart Nachrichtenobjekt erstellen. Im Anschluss muss das Objekt mit den entsprechenden Headern für die Felder  From, To und Subject geladen werden.
  3. Der Nachrichtentext muss hinzugefügt werden.
  4. 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.

python emails senden nachricht
Yihaaa. Die Email-Nachricht wurde erfolgreich in meinem Postfach zugestellt!

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!

Programmierer-Crashkurs für Anfänger...kostenlos!
Baue echte Apps, ohne Vorwissen, ohne Installation!
toolbox 1
Email eintragen und sofort loslegen: