Senden von E-Mails mit Python

Senden von E-Mails mit Python

Sie haben dieses Tutorial wahrscheinlich gefunden, weil Sie E-Mails mit Python senden möchten. Vielleicht möchten Sie E-Mail-Erinnerungen von Ihrem Code erhalten, eine Bestätigungs-E-Mail an Benutzer senden, wenn diese ein Konto erstellen, oder E-Mails an Mitglieder Ihrer Organisation senden, um sie daran zu erinnern, ihre Gebühren zu zahlen. Das manuelle Senden von E-Mails ist eine zeitaufwändige und fehleranfällige Aufgabe, die sich jedoch mit Python leicht automatisieren lässt.

*In diesem Tutorial erfahren Sie, wie Sie* :
  • Richten Sie eine sichere Verbindung mit + SMTP_SSL () + und + .starttls () + ein Verwenden Sie die in Python integrierte Bibliothek "+ smtplib ", um* grundlegende E-Mails * zu senden. *Senden Sie E-Mails mit* HTML-Inhalten *und* Anhängen * mit dem Paket ` email +` *Senden Sie mehrere personalisierte E-Mails * mithilfe einer CSV-Datei mit Kontaktdaten Verwenden Sie das Paket Yagmail *, um E-Mails mit nur wenigen Codezeilen über Ihr Google Mail-Konto zu senden

Am Ende dieses Tutorials finden Sie einige Transaktions-E-Mail-Dienste, die nützlich sind, wenn Sie eine große Anzahl von E-Mails senden möchten.

*Kostenloser Bonus:* Link: [Klicken Sie hier, um Zugriff auf ein Kapitel aus Python Tricks: The Book zu erhalten], das Ihnen die Best Practices von Python anhand einfacher Beispiele zeigt, die Sie sofort anwenden können, um schöneren + Pythonic-Code zu schreiben.

Anfangen

Python enthält das integrierte Modul https://docs.python.org/3/library/smtplib.html [+ smtplib +] zum Senden von E-Mails mit dem SMTP (Simple Mail Transfer Protocol). + smtplib + verwendet das Protokoll RFC 821 für SMTP. In den Beispielen in diesem Lernprogramm wird der Google Mail-SMTP-Server zum Senden von E-Mails verwendet. Für andere E-Mail-Dienste gelten jedoch dieselben Grundsätze. Obwohl die meisten E-Mail-Anbieter dieselben Verbindungsports wie in diesem Lernprogramm verwenden, können Sie schnell Google ausführen Suche, um Ihre zu bestätigen.

Um mit diesem Tutorial zu beginnen, rufen Sie ein Google Mail-Konto für die Entwicklung auf oder Einrichten eines SMTP-Debugging-Servers, der von Ihnen gesendete E-Mails verwirft und an die Eingabeaufforderung druckt stattdessen. Beide Optionen sind unten für Sie aufgeführt. Ein lokaler SMTP-Debugging-Server kann hilfreich sein, um Probleme mit der E-Mail-Funktionalität zu beheben und sicherzustellen, dass Ihre E-Mail-Funktionen fehlerfrei sind, bevor Sie E-Mails versenden.

Option 1: Einrichten eines Google Mail-Kontos für die Entwicklung

Wenn Sie sich zum Senden Ihrer E-Mails für die Verwendung eines Google Mail-Kontos entscheiden, empfehle ich dringend, ein Wegwerfkonto für die Entwicklung Ihres Codes einzurichten. Dies liegt daran, dass Sie die Sicherheitseinstellungen Ihres Google Mail-Kontos anpassen müssen, um den Zugriff von Ihrem Python-Code aus zu ermöglichen, und dass Sie möglicherweise versehentlich Ihre Anmeldedaten preisgeben. Außerdem stellte ich fest, dass sich der Posteingang meines Testkontos schnell mit Test-E-Mails füllte. Dies ist Grund genug, ein neues Google Mail-Konto für die Entwicklung einzurichten.

Eine nette Funktion von Google Mail ist, dass Sie das Zeichen "+" verwenden können, um Ihrer E-Mail-Adresse unmittelbar vor dem Zeichen "+ @ " Modifikatoren hinzuzufügen. Beispielsweise werden E-Mails, die an " my + person1 @ gmail.com " und " my + person2 @ gmail.com " gesendet werden, beide an " my @ gmail.com +" gesendet. Wenn Sie die E-Mail-Funktionalität testen, können Sie damit mehrere Adressen emulieren, die alle auf denselben Posteingang verweisen.

Gehen Sie wie folgt vor, um eine Google Mail-Adresse zum Testen Ihres Codes einzurichten:

Wenn Sie die Sicherheitseinstellungen Ihres Google Mail-Kontos nicht verringern möchten, lesen Sie in Google documentation nach, wie Sie Zugriffsdaten für Ihr Python-Skript erhalten. Verwenden des OAuth2-Autorisierungsframeworks.

Option 2: Einrichten eines lokalen SMTP-Servers

Sie können die E-Mail-Funktionalität testen, indem Sie einen lokalen SMTP-Debugging-Server mit dem in Python vorinstallierten Modul + smtpd + ausführen. Anstatt E-Mails an die angegebene Adresse zu senden, werden sie verworfen und ihr Inhalt auf der Konsole gedruckt. Wenn Sie einen lokalen Debugging-Server ausführen, müssen Sie sich nicht mit der Verschlüsselung von Nachrichten befassen oder Anmeldeinformationen verwenden, um sich bei einem E-Mail-Server anzumelden.

Sie können einen lokalen SMTP-Debugging-Server starten, indem Sie in der Eingabeaufforderung Folgendes eingeben:

$ python -m smtpd -c DebuggingServer -n localhost:1025

Verwenden Sie unter Linux denselben Befehl, dem "+ sudo +" vorangestellt ist.

Alle über diesen Server gesendeten E-Mails werden verworfen und im Terminalfenster als https://docs.python.org/3/library/stdtypes.html#bytes-objects [+ bytes +] Objekt für jede Zeile angezeigt:

---------- MESSAGE FOLLOWS ----------
b'X-Peer: ::1'
b''
b'From: [email protected]'
b'To: [email protected]'
b'Subject: a local test mail'
b''
b'Hello there, here is a test email'
------------ END MESSAGE ------------

Für den Rest des Tutorials gehe ich davon aus, dass Sie ein Google Mail-Konto verwenden. Wenn Sie jedoch einen lokalen Debugging-Server verwenden, stellen Sie einfach sicher, dass Sie "+ localhost " als SMTP-Server verwenden und Port 1025 anstelle von Port verwenden 465 oder 587. Außerdem müssen Sie nicht " login () +" verwenden oder die Kommunikation mit SSL/TLS verschlüsseln.

Senden einer Nur-Text-E-Mail

Bevor wir uns mit dem Senden von E-Mails mit HTML-Inhalten und Anhängen befassen, lernen Sie, wie Sie mit Python Nur-Text-E-Mails senden. Dies sind E-Mails, die Sie in einem einfachen Texteditor schreiben können. Es gibt keine ausgefallenen Dinge wie Textformatierung oder Hyperlinks. Das erfahren Sie etwas später.

Starten einer sicheren SMTP-Verbindung

Wenn Sie E-Mails über Python senden, sollten Sie sicherstellen, dass Ihre SMTP-Verbindung verschlüsselt ist, damit andere nicht einfach auf Ihre Nachrichten- und Anmeldeinformationen zugreifen können. SSL (Secure Sockets Layer) und TLS (Transport Layer Security) sind zwei Protokolle, mit denen eine SMTP-Verbindung verschlüsselt werden kann. Bei Verwendung eines lokalen Debugging-Servers ist keines dieser Elemente erforderlich.

Es gibt zwei Möglichkeiten, eine sichere Verbindung mit Ihrem E-Mail-Server herzustellen:

  • Starten Sie eine SMTP-Verbindung, die von Anfang an mit + SMTP_SSL () + gesichert ist.

  • Starten Sie eine ungesicherte SMTP-Verbindung, die dann mit + .starttls () + verschlüsselt werden kann.

In beiden Fällen verschlüsselt Google Mail E-Mails mit TLS, da dies der sicherere Nachfolger von SSL ist. Gemäß Pythons Security Considerations wird dringend empfohlen, + create_default_context () + aus den https://docs zu verwenden .python.org/3/library/ssl.html [+ ssl +] Modul. Dadurch werden die vertrauenswürdigen CA-Zertifikate des Systems geladen, die Überprüfung des Hostnamens und die Zertifikatsüberprüfung aktiviert und versucht, einigermaßen sichere Protokoll- und Verschlüsselungseinstellungen auszuwählen.

Wenn Sie die Verschlüsselung für eine E-Mail in Ihrem Google Mail-Posteingang überprüfen möchten, gehen Sie zu MehrShow original, um den unter dem Header Received aufgeführten Verschlüsselungstyp anzuzeigen.

https://docs.python.org/3/library/smtplib.html [+ smtplib +] ist das in Python integrierte Modul zum Senden von E-Mails an jeden Internetcomputer mit einem SMTP- oder ESMTP-Listener-Daemon.

Ich werde Ihnen zuerst zeigen, wie Sie "+ SMTP_SSL () " verwenden, da dadurch eine Verbindung instanziiert wird, die von Anfang an sicher und etwas prägnanter als die Alternative " .starttls () " ist. Beachten Sie, dass für Google Mail eine Verbindung zu Port 465 erforderlich ist, wenn Sie " SMTP_SSL () " verwenden, und zu Port 587, wenn Sie " .starttls () +" verwenden.

Option 1: Verwenden von + SMTP_SSL () +

Das folgende Codebeispiel erstellt eine sichere Verbindung mit dem SMTP-Server von Google Mail. Verwenden Sie dazu "+ SMTP_SSL () " von " smtplib ", um eine TLS-verschlüsselte Verbindung herzustellen. Der Standardkontext von " ssl " überprüft den Hostnamen und seine Zertifikate und optimiert die Sicherheit der Verbindung. Stellen Sie sicher, dass Sie Ihre eigene E-Mail-Adresse anstelle von " my @ gmail.com +" eingeben:

import smtplib, ssl

port = 465  # For SSL
password = input("Type your password and press enter: ")

# Create a secure SSL context
context = ssl.create_default_context()

with smtplib.SMTP_SSL("smtp.gmail.com", port, context=context) as server:
    server.login("[email protected]", password)
    # TODO: Send email here

Durch die Verwendung von + mit smtplib.SMTP_SSL () als Server: + wird sichergestellt, dass die Verbindung am Ende des eingerückten Codeblocks automatisch geschlossen wird. Wenn "+ Port " Null ist oder nicht angegeben wird, verwendet " .SMTP_SSL () +" den Standardport für SMTP über SSL (Port 465).

Es ist nicht sicher, Ihr E-Mail-Passwort in Ihrem Code zu speichern, insbesondere wenn Sie beabsichtigen, es mit anderen zu teilen. Verwenden Sie stattdessen "+ input () ", damit der Benutzer beim Ausführen des Skripts sein Kennwort eingibt, wie im obigen Beispiel. Wenn Sie nicht möchten, dass Ihr Passwort bei der Eingabe auf Ihrem Bildschirm angezeigt wird, können Sie das Modul https://docs.python.org/3/library/getpass.html [` getpass `] importieren und ` verwenden .getpass () + `stattdessen zur blinden Eingabe Ihres Passworts.

Option 2: Verwenden von + .starttls () +

Anstatt mit "+ .SMTP_SSL () " eine von Anfang an sichere Verbindung herzustellen, können wir eine ungesicherte SMTP-Verbindung erstellen und mit " .starttls () +" verschlüsseln.

Erstellen Sie dazu eine Instanz von + smtplib.SMTP +, die eine SMTP-Verbindung kapselt und Ihnen den Zugriff auf ihre Methoden ermöglicht. Ich empfehle, Ihren SMTP-Server und -Port am Anfang Ihres Skripts zu definieren, um sie einfach zu konfigurieren.

Das folgende Codefragment verwendet die Konstruktion + server = SMTP () + anstelle des Formats + mit SMTP () als Server: +, das wir im vorherigen Beispiel verwendet haben. Um sicherzustellen, dass Ihr Code nicht abstürzt, wenn etwas schief geht, setzen Sie Ihren Hauptcode in einen "+ try " - Block und lassen Sie einen " außer " - Block alle Fehlermeldungen an " stdout +" drucken:

import smtplib, ssl

smtp_server = "smtp.gmail.com"
port = 587  # For starttls
sender_email = "[email protected]"
password = input("Type your password and press enter: ")

# Create a secure SSL context
context = ssl.create_default_context()

# Try to log in to server and send email
try:
    server = smtplib.SMTP(smtp_server,port)
    server.ehlo() # Can be omitted
    server.starttls(context=context) # Secure the connection
    server.ehlo() # Can be omitted
    server.login(sender_email, password)
    # TODO: Send email here
except Exception as e:
    # Print any error messages to stdout
    print(e)
finally:
    server.quit()

Um sich gegenüber dem Server zu identifizieren, sollte nach dem Erstellen eines "+ .SMTP () " - Objekts und erneut nach " .helo () " (SMTP) oder " .ehlo () " (ESMTP) aufgerufen werden + .starttls () + `. Diese Funktion wird bei Bedarf implizit von " .starttls () " und " .sendmail () " aufgerufen. Wenn Sie also nicht die SMTP-Diensterweiterungen des Servers überprüfen möchten, müssen Sie " .helo" nicht verwenden () + oder + .ehlo () + `explizit.

Senden Ihrer Nur-Text-E-Mail

Nachdem Sie eine sichere SMTP-Verbindung mit einer der oben genannten Methoden hergestellt haben, können Sie Ihre E-Mail mit + .sendmail () + senden, was ziemlich genau das tut, was es verspricht:

server.sendmail(sender_email, receiver_email, message)

Ich empfehle, die E-Mail-Adressen und den Nachrichteninhalt nach dem Import oben in Ihrem Skript zu definieren, damit Sie sie einfach ändern können:

sender_email = "[email protected]"
receiver_email = "[email protected]"
message = """\
Subject: Hi there

This message is sent from Python."""

# Send email here

Die + Nachricht + string beginnt mit " Betreff: Hi there " gefolgt von zwei Zeilenumbrüchen (+ \ n +). Dadurch wird sichergestellt, dass "+ Hallo +" als Betreff der E-Mail angezeigt wird und der Text nach den Zeilenumbrüchen als Nachrichtentext behandelt wird.

Das folgende Codebeispiel sendet eine Nur-Text-E-Mail mit + SMTP_SSL () +:

import smtplib, ssl

port = 465  # For SSL
smtp_server = "smtp.gmail.com"
sender_email = "[email protected]"  # Enter your address
receiver_email = "[email protected]"  # Enter receiver address
password = input("Type your password and press enter: ")
message = """\
Subject: Hi there

This message is sent from Python."""

context = ssl.create_default_context()
with smtplib.SMTP_SSL(smtp_server, port, context=context) as server:
    server.login(sender_email, password)
    server.sendmail(sender_email, receiver_email, message)

Zum Vergleich hier ein Codebeispiel, das eine Klartext-E-Mail über eine mit + .starttls () + gesicherte SMTP-Verbindung sendet. Die Zeilen "+ server.ehlo () " können weggelassen werden, da sie bei Bedarf implizit von " .starttls () " und " .sendmail () +" aufgerufen werden:

import smtplib, ssl

port = 587  # For starttls
smtp_server = "smtp.gmail.com"
sender_email = "[email protected]"
receiver_email = "[email protected]"
password = input("Type your password and press enter:")
message = """\
Subject: Hi there

This message is sent from Python."""

context = ssl.create_default_context()
with smtplib.SMTP(smtp_server, port) as server:
    server.ehlo()  # Can be omitted
    server.starttls(context=context)
    server.ehlo()  # Can be omitted
    server.login(sender_email, password)
    server.sendmail(sender_email, receiver_email, message)

Senden ausgefallener E-Mails

Mit dem in Python integrierten Paket "+ email " können Sie ausgefallenere E-Mails strukturieren, die dann wie bereits mit " smtplib " übertragen werden können. Im Folgenden erfahren Sie, wie Sie mit dem Paket " email +" E-Mails mit HTML-Inhalten und Anhängen senden.

Einschließlich HTML-Inhalt

Wenn Sie den Text in Ihrer E-Mail formatieren möchten ( fett , italics usw.) oder wenn Sie Bilder, Hyperlinks oder reaktionsschnelle Inhalte hinzufügen möchten, ist HTML sehr praktisch. Der heute häufigste E-Mail-Typ ist die mehrteilige MIME-E-Mail (Multipurpose Internet Mail Extensions), die HTML und Klartext kombiniert. MIME-Nachrichten werden vom Python-Modul "+ email.mime +" verarbeitet. Eine ausführliche Beschreibung finden Sie unter dokumentation.

Da nicht alle E-Mail-Clients standardmäßig HTML-Inhalte anzeigen und einige Benutzer aus Sicherheitsgründen nur Nur-Text-E-Mails empfangen, ist es wichtig, eine Nur-Text-Alternative für HTML-Nachrichten einzuschließen. Da der E-Mail-Client zuerst den letzten mehrteiligen Anhang rendert, müssen Sie die HTML-Nachricht nach der Nur-Text-Version hinzufügen.

Im folgenden Beispiel enthalten unsere "+ MIMEText () " - Objekte die HTML- und Klartextversionen unserer Nachricht, und die " MIMEMultipart (" alternative ") +" Instanz kombiniert diese zu einer einzigen Nachricht mit zwei alternativen Renderings Optionen:

import smtplib, ssl
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

sender_email = "[email protected]"
receiver_email = "[email protected]"
password = input("Type your password and press enter:")

message = MIMEMultipart("alternative")
message["Subject"] = "multipart test"
message["From"] = sender_email
message["To"] = receiver_email

# Create the plain-text and HTML version of your message
text = """\
Hi,
How are you?
Real Python has many great tutorials:
www.realpython.com"""
html = """\
<html>
  <body>
    <p>Hi,<br>
       How are you?<br>
       <a href="http://www.realpython.com">Real Python</a>
       has many great tutorials.
    </p>
  </body>
</html>
"""

# Turn these into plain/html MIMEText objects
part1 = MIMEText(text, "plain")
part2 = MIMEText(html, "html")

# Add HTML/plain-text parts to MIMEMultipart message
# The email client will try to render the last part first
message.attach(part1)
message.attach(part2)

# Create secure connection with server and send email
context = ssl.create_default_context()
with smtplib.SMTP_SSL("smtp.gmail.com", 465, context=context) as server:
    server.login(sender_email, password)
    server.sendmail(
        sender_email, receiver_email, message.as_string()
    )

In diesem Beispiel definieren Sie zuerst die Nur-Text- und HTML-Nachricht als Zeichenfolgenliterale und speichern sie dann als + plain +/+ html + + MIMEText + Objekte. Diese können dann in dieser Reihenfolge zur Nachricht + MIMEMultipart (" alternative ") + hinzugefügt und über Ihre sichere Verbindung mit dem E-Mail-Server gesendet werden. Denken Sie daran, die HTML-Nachricht nach der Nur-Text-Alternative hinzuzufügen, da E-Mail-Clients versuchen, den letzten Unterabschnitt zuerst zu rendern.

Hinzufügen von Anhängen mit dem Paket + E-Mail

Um Binärdateien an einen E-Mail-Server zu senden, der für die Arbeit mit Textdaten ausgelegt ist, müssen diese vor dem Transport codiert werden. Dies geschieht am häufigsten mit https://docs.python.org/3/library/base64.html [+ base64 +], das Binärdaten in druckbare ASCII-Zeichen codiert.

Das folgende Codebeispiel zeigt, wie Sie eine E-Mail mit einer PDF-Datei als Anhang senden:

import email, smtplib, ssl

from email import encoders
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

subject = "An email with attachment from Python"
body = "This is an email with attachment sent from Python"
sender_email = "[email protected]"
receiver_email = "[email protected]"
password = input("Type your password and press enter:")

# Create a multipart message and set headers
message = MIMEMultipart()
message["From"] = sender_email
message["To"] = receiver_email
message["Subject"] = subject
message["Bcc"] = receiver_email  # Recommended for mass emails

# Add body to email
message.attach(MIMEText(body, "plain"))

filename = "document.pdf"  # In same directory as script

# Open PDF file in binary mode
with open(filename, "rb") as attachment:
    # Add file as application/octet-stream
    # Email client can usually download this automatically as attachment
    part = MIMEBase("application", "octet-stream")
    part.set_payload(attachment.read())

# Encode file in ASCII characters to send by email
encoders.encode_base64(part)

# Add header as key/value pair to attachment part
part.add_header(
    "Content-Disposition",
    f"attachment; filename= {filename}",
)

# Add attachment to message and convert message to string
message.attach(part)
text = message.as_string()

# Log in to server using secure context and send email
context = ssl.create_default_context()
with smtplib.SMTP_SSL("smtp.gmail.com", 465, context=context) as server:
    server.login(sender_email, password)
    server.sendmail(sender_email, receiver_email, text)

Weitere Informationen zur Verwendung von MIME-Klassen finden Sie unter documentation für Pythons Modul "+ email.mime +".

Senden mehrerer personalisierter E-Mails

Stellen Sie sich vor, Sie möchten E-Mails an Mitglieder Ihrer Organisation senden, um sie daran zu erinnern, ihre Beitragsgebühren zu zahlen. Oder Sie möchten den Schülern in Ihrer Klasse personalisierte E-Mails mit den Noten für ihre letzte Aufgabe senden. Diese Aufgaben sind in Python ein Kinderspiel.

Erstellen Sie eine CSV-Datei mit relevanten persönlichen Informationen

Ein einfacher Ausgangspunkt für das Senden mehrerer personalisierter E-Mails ist create a CSV (Comma Separated Values) -Datei, die alle erforderlichen persönlichen Informationen enthält. (Stellen Sie sicher, dass Sie die privaten Informationen anderer Personen nicht ohne deren Zustimmung weitergeben.) Eine CSV-Datei kann als einfache Tabelle betrachtet werden, in der die erste Zeile häufig die Spaltenüberschriften enthält.

Unten finden Sie den Inhalt der Datei "+ contact_file.csv ", die ich im selben Ordner wie mein Python-Code gespeichert habe. Es enthält die Namen, Adressen und Noten einer Reihe von fiktiven Personen. Ich habe " my + modifier @ gmail.com +" -Konstruktionen verwendet, um sicherzustellen, dass alle E-Mails in meinem eigenen Posteingang landen, in diesem Beispiel [email protected]:

name,email,grade
Ron Obvious,[email protected],B+
Killer Rabbit of Caerbannog,[email protected],A
Brian Cohen,[email protected],C

Stellen Sie beim Erstellen einer CSV-Datei sicher, dass Sie Ihre Werte durch ein Komma ohne umgebende Leerzeichen trennen.

Durchlaufen von Zeilen zum Senden mehrerer E-Mails

Das folgende Codebeispiel zeigt Ihnen, wie Sie eine CSV-Datei öffnen und ihre Inhaltszeilen durchlaufen (Überspringen der Kopfzeile). Um sicherzustellen, dass der Code ordnungsgemäß funktioniert, bevor Sie E-Mails an alle Ihre Kontakte senden, habe ich für jeden Kontakt "+ E-Mail senden an …​ +" gedruckt, die wir später durch Funktionen ersetzen können, die tatsächlich E-Mails versenden:

import csv

with open("contacts_file.csv") as file:
    reader = csv.reader(file)
    next(reader)  # Skip header row
    for name, email, grade in reader:
        print(f"Sending email to {name}")
        # Send email here

Im obigen Beispiel stellt die Verwendung von "+ mit open (Dateiname) als Datei: " sicher, dass Ihre Datei am Ende des Codeblocks geschlossen wird. ` csv.reader () ` erleichtert das zeilenweise Lesen einer CSV-Datei und das Extrahieren ihrer Werte. Die Zeile " next (reader) " überspringt die Kopfzeile, so dass die folgende Zeile "" für Name, E-Mail, Note im Reader: + "nachfolgende Zeilen bei jedem Komma aufteilt und die resultierenden Werte in den Zeichenfolgen" + "speichert Name + , + E-Mail + und + Note + `für den aktuellen Kontakt.

Wenn die Werte in Ihrer CSV-Datei auf einer oder beiden Seiten Leerzeichen enthalten, können Sie sie mit der Methode + .strip () + entfernen.

Personalisierte Inhalte

Sie können personalisierte Inhalte in eine Nachricht einfügen, indem Sie + str.format () + verwenden, um Platzhalter in geschweiften Klammern auszufüllen. Beispiel: +" hi {name}, du {result} deine Aufgabe ".format (name =" John ", result =" übergeben ") + gibt dir `" hi John, du hast deine Aufgabe bestanden " `.

Ab Python 3.6 kann die Formatierung von Zeichenfolgen mithilfe von f-strings eleganter erfolgen. Hierfür müssen jedoch die Platzhalter vor der f-Zeichenfolge selbst definiert werden. Um die E-Mail-Nachricht am Anfang des Skripts zu definieren und Platzhalter für jeden Kontakt beim Durchlaufen der CSV-Datei einzugeben, wird die ältere Methode "+ .format () +" verwendet.

In diesem Sinne können Sie einen allgemeinen Nachrichtentext mit Platzhaltern einrichten, die auf Einzelpersonen zugeschnitten werden können.

Codebeispiel

Mit dem folgenden Codebeispiel können Sie personalisierte E-Mails an mehrere Kontakte senden. Es durchläuft eine CSV-Datei mit "+ Name, E-Mail, Note +" für jeden Kontakt, wie in https://realpython.com/python-send-email/#make-a-csv-file-with-relevant-personal -info [Beispiel oben].

Die allgemeine Nachricht wird am Anfang des Skripts definiert, und für jeden Kontakt in der CSV-Datei werden die Platzhalter + {name} + und + {grade} + ausgefüllt, und eine personalisierte E-Mail wird über a gesendet sichere Verbindung mit dem Google Mail-Server, wie Sie zuvor gesehen haben:

import csv, smtplib, ssl

message = """Subject: Your grade

Hi {name}, your grade is {grade}"""
from_address = "[email protected]"
password = input("Type your password and press enter: ")

context = ssl.create_default_context()
with smtplib.SMTP_SSL("smtp.gmail.com", 465, context=context) as server:
    server.login(from_address, password)
    with open("contacts_file.csv") as file:
        reader = csv.reader(file)
        next(reader)  # Skip header row
        for name, email, grade in reader:
            server.sendmail(
                from_address,
                email,
                message.format(name=name,grade=grade),
            )

Yagmail

Es gibt mehrere Bibliotheken, die das Senden von E-Mails erleichtern sollen, z. B. Envelopes, Flanker und Yagmail. Yagmail wurde speziell für die Verwendung mit Google Mail entwickelt und vereinfacht das Senden von E-Mails über eine benutzerfreundliche API erheblich, wie Sie im folgenden Codebeispiel sehen können:

import yagmail

receiver = "[email protected]"
body = "Hello there from Yagmail"
filename = "document.pdf"

yag = yagmail.SMTP("[email protected]")
yag.send(
    to=receiver,
    subject="Yagmail test with attachment",
    contents=body,
    attachments=filename,
)

Dieses Codebeispiel sendet eine E-Mail mit einem PDF-Anhang in einem Bruchteil der Zeilen, die für unser Beispiel mit + benötigt werden E-Mail + `und + smtplib + `.

Beim Einrichten von Yagmail können Sie Ihre Google Mail-Überprüfungen zum Schlüsselbund Ihres Betriebssystems hinzufügen, wie unter the document beschrieben. Wenn Sie dies nicht tun, werden Sie von Yagmail aufgefordert, bei Bedarf Ihr Passwort einzugeben und es automatisch im Schlüsselbund zu speichern.

Transaktions-E-Mail-Dienste

Wenn Sie vorhaben, eine große Anzahl von E-Mails zu senden, E-Mail-Statistiken anzeigen und eine zuverlässige Zustellung sicherstellen möchten, sollten Sie sich die Transaktions-E-Mail-Dienste ansehen. Alle folgenden Dienste haben zwar kostenpflichtige Pläne für den Versand großer E-Mail-Mengen, sie enthalten jedoch auch einen kostenlosen Plan, mit dem Sie sie ausprobieren können. Einige dieser kostenlosen Pläne sind unbegrenzt gültig und können für Ihre E-Mail-Anforderungen ausreichen.

Im Folgenden finden Sie eine Übersicht über die kostenlosen Tarife für einige der wichtigsten Transaktions-E-Mail-Dienste. Wenn Sie auf den Anbieternamen klicken, gelangen Sie zum Preisbereich der Website.

Provider Free plan

Sendgrid

40,000 emails for your first 30 days, then 100/day

Sendinblue

300 emails/day

Mailgun

First 10,000 emails free

Mailjet

200 emails/day

Amazon SES

62,000 emails/month

Sie können eine Google search ausführen, um festzustellen, welcher Anbieter Ihren Anforderungen am besten entspricht, oder einfach einige der kostenlosen Pläne ausprobieren um zu sehen, mit welcher API Sie am liebsten arbeiten.

Beispiel für einen Sendgrid-Code

Hier ist ein Codebeispiel zum Senden von E-Mails mit Sendgrid, um Ihnen einen Einblick in die Verwendung eines Transaktions-E-Mail-Dienstes mit Python zu geben:

import os
import sendgrid
from sendgrid.helpers.mail import Content, Email, Mail

sg = sendgrid.SendGridAPIClient(
    apikey=os.environ.get("SENDGRID_API_KEY")
)
from_email = Email("[email protected]")
to_email = Email("[email protected]")
subject = "A test email from Sendgrid"
content = Content(
    "text/plain", "Here's a test email sent through Python"
)
mail = Mail(from_email, subject, to_email, content)
response = sg.client.mail.send.post(request_body=mail.get())

# The statements below can be included for debugging purposes
print(response.status_code)
print(response.body)
print(response.headers)

Um diesen Code auszuführen, müssen Sie zuerst:

  • Melden Sie sich für ein (kostenloses) Sendgrid-Konto an

  • Request a API key zur Benutzerüberprüfung

  • Fügen Sie Ihren API-Schlüssel hinzu, indem Sie in der Eingabeaufforderung + setx SENDGRID_API_KEY" YOUR_API_KEY "+ eingeben (um diesen API-Schlüssel dauerhaft zu speichern) oder + set SENDGRID_API_KEY YOUR_API_KEY +, um ihn nur für die aktuelle Client-Sitzung zu speichern

Weitere Informationen zum Einrichten von Sendgrid für Mac und Windows finden Sie in der README-Datei des Repositorys unter Github.

Fazit

Sie können jetzt eine sichere SMTP-Verbindung herstellen und mehrere personalisierte E-Mails an die Personen in Ihrer Kontaktliste senden!

Sie haben gelernt, wie Sie eine HTML-E-Mail mit einer Nur-Text-Alternative senden und Dateien an Ihre E-Mails anhängen. Das Paket Yagmail vereinfacht all diese Aufgaben, wenn Sie ein Google Mail-Konto verwenden. Wenn Sie große E-Mail-Mengen senden möchten, sollten Sie sich die Transaktions-E-Mail-Dienste ansehen.

Viel Spaß beim Senden von E-Mails mit Python und denken Sie daran: keine Spam bitte!