Python3 SMTP E-Mail-Versand

SMTP (Simple Mail Transfer Protocol) ist eine Reihe von Regeln für die Übertragung von E-Mails von einer Quelladresse zu einer Zieladresse und steuert die Art und Weise, wie Nachrichten weitergeleitet werden.

Pythons smtplib bietet eine bequeme Möglichkeit, E-Mails zu senden. Es ist ein einfacher Wrapper um das SMTP-Protokoll.

Die Syntax zum Erstellen eines SMTP-Objekts in Python lautet wie folgt:

import smtplib

smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )

Parameter description:

  • host: SMTP-Server-Host. Sie können die IP-Adresse oder den Domainnamen des Hosts wie example.com angeben. Dies ist ein optionaler Parameter.
  • port: Wenn Sie den Parameter host angeben, müssen Sie die Portnummer angeben, die vom SMTP-Dienst verwendet wird. Im Allgemeinen ist die SMTP-Portnummer 25.
  • local_hostname: Wenn sich SMTP auf Ihrem lokalen Rechner befindet, müssen Sie nur die Serveradresse als localhost angeben.

Das Python-SMTP-Objekt verwendet die Methode sendmail, um E-Mails zu senden. Die Syntax lautet wie folgt:

SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options]

Parameter description:

  • from_addr: E-Mail-Adresse des Absenders.
  • to_addrs: Eine Liste von Strings, die Empfängeradressen.
  • msg: Die zu sendende Nachricht.

Hier müssen Sie auf den dritten Parameter achten. msg ist eine Zeichenfolge, die die E-Mail darstellt. Wir wissen, dass eine E-Mail im Allgemeinen aus Betreff, Absender, Empfänger, E-Mail-Inhalt, Anhängen usw. besteht. Achten Sie beim Senden von E-Mails auf das Format von msg. Dieses Format ist im SMTP-Protokoll definiert.

Beispiel

Das folgende ist ein einfaches Beispiel für das Senden einer E-Mail mit Python:

Beispiel

#!/usr/bin/python3 import smtplib from email.mime.text import MIMEText from email.header import Header sender = '[email protected]' receivers = ['[email protected]'] # Empfänger-E-Mail, kann auf Ihr QQ-Postfach oder ein anderes Postfach eingestellt werden # Drei Parameter: Der erste ist der Textinhalt, der zweite 'plain' legt das Textformat fest, der dritte 'utf-8' legt die Codierung fest. message = MIMEText('Python E-Mail-Versandtest...', 'plain', 'utf-8') message['From'] = Header("Beispiel", 'utf-8') # Absender message['To'] = Header("Test", 'utf-8') # Empfänger subject = 'Python SMTP-E-Mail-Test' message['Subject'] = Header(subject, 'utf-8') try: smtpObj = smtplib.SMTP('localhost') smtpObj.sendmail(sender, receivers, message.as_string()) print ("E-Mail erfolgreich gesendet") except smtplib.SMTPException: print ("Fehler: E-Mail konnte nicht gesendet werden")

Wir verwenden drei Anführungszeichen, um die E-Mail-Informationen festzulegen. Eine Standard-E-Mail erfordert drei Header-Informationen:From, To, undSubjectJede Information wird durch eine Leerzeile getrennt.

Wir instanziieren das SMTP-Objekt des smtplib-ModulssmtpObj, um eine Verbindung zum SMTP-Zugang herzustellen, und verwenden diesendmail-Methode, um die Nachricht zu senden.

Führen Sie das obige Programm aus. Wenn sendmail auf Ihrem Rechner installiert ist, wird es Folgendes ausgeben:

$ python3 test.py 
邮件发送成功

Überprüfen Sie Ihren Posteingang (normalerweise im Spam-Ordner), und Sie können die E-Mail-Nachricht sehen:

Wenn wir keinen sendmail-Zugang auf unserem Rechner haben, können wir auch den SMTP-Zugang anderer Dienstanbieter (QQ, NetEase, Google usw.) verwenden.

Beispiel

#!/usr/bin/python3 import smtplib from email.mime.text import MIMEText from email.header import Header # SMTP-Dienst eines Drittanbieters mail_host="smtp.XXX.com" # Server festlegen mail_user="XXXX" # Benutzername mail_pass="XXXXXX" # Passwort sender = '[email protected]' receivers = ['[email protected]'] # Empfänger-E-Mail, kann auf Ihr QQ-Postfach oder ein anderes Postfach eingestellt werden message = MIMEText('Python-E-Mail-Versandtest...', 'plain', 'utf-8') message['From'] = Header("Beispiel", 'utf-8') message['To'] = Header("Test", 'utf-8') subject = 'Python SMTP-E-Mail-Test' message['Subject'] = Header(subject, 'utf-8') try: smtpObj = smtplib.SMTP() smtpObj.connect(mail_host, 25) # 25 ist die SMTP-Portnummer smtpObj.login(mail_user,mail_pass) smtpObj.sendmail(sender, receivers, message.as_string()) print ("E-Mail erfolgreich gesendet") except smtplib.SMTPException: print ("Fehler: E-Mail kann nicht gesendet werden")

HTML-E-Mails mit Python senden

Der Unterschied zwischen dem Senden einer HTML-E-Mail und einer E-Mail im Nur-Text-Format in Python besteht darin, den _subtype in MIMEText auf html zu setzen. Der konkrete Code lautet wie folgt:

Beispiel

#!/usr/bin/python3 import smtplib from email.mime.text import MIMEText from email.header import Header sender = '[email protected]' receivers = ['[email protected]'] # Empfänger-E-Mail, kann auf Ihre QQ-Mailbox oder eine andere Mailbox gesetzt werden mail_msg = """<p>Python E-Mail-Versandtest...</p> <p><a href="http://www.example.com">Dies ist ein Link</a></p>""" message = MIMEText(mail_msg, 'html', 'utf-8') message['From'] = Header("Beispiel", 'utf-8') message['To'] = Header("Test", 'utf-8') subject = 'Python SMTP-E-Mail-Test' message['Subject'] = Header(subject, 'utf-8') try: smtpObj = smtplib.SMTP('localhost') smtpObj.sendmail(sender, receivers, message.as_string()) print ("E-Mail erfolgreich gesendet") except smtplib.SMTPException: print ("Fehler: E-Mail kann nicht gesendet werden")

Führen Sie das obige Programm aus. Wenn sendmail auf Ihrem Rechner installiert ist, wird es Folgendes ausgeben:

$ python3 test.py 
邮件发送成功

Überprüfen Sie Ihren Posteingang (normalerweise im Spam-Ordner), und Sie können die E-Mail-Nachricht sehen:


E-Mails mit Anhängen in Python senden

Um eine E-Mail mit Anhängen zu senden, erstellen Sie zuerst eine MIMEMultipart()-Instanz und erstellen Sie dann die Anhänge. Wenn es mehrere Anhänge gibt, erstellen Sie sie nacheinander und verwenden Sie schließlich smtplib.smtp zum Senden.

Beispiel

#!/usr/bin/python3 import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.header import Header sender = '[email protected]' receivers = ['[email protected]'] # Empfänger-E-Mail, kann auf Ihr QQ-Postfach oder ein anderes Postfach festgelegt werden # Erstellen Sie eine Instanz mit Anhängen message = MIMEMultipart() message['From'] = Header("Beispiel", 'utf-8') message['To'] = Header("Test", 'utf-8') subject = 'Python-SMTP-E-Mail-Test' message['Subject'] = Header(subject, 'utf-8') # Inhalt des E-Mail-Textes message.attach(MIMEText('Dies ist der Beispieltest zum Versenden von E-Mails mit Python...', 'plain', 'utf-8')) # Anhang 1 erstellen, die Datei test.txt im aktuellen Verzeichnis senden att1 = MIMEText(open('test.txt', 'rb').read(), 'base64', 'utf-8') att1["Content-Type"] = 'application/octet-stream' # Der Dateiname kann hier beliebig gewählt werden; der Name, den Sie angeben, wird in der E-Mail angezeigt. att1["Content-Disposition"] = 'attachment; filename="test.txt"' message.attach(att1) # Anhang 2 erstellen, die Datei example.txt im aktuellen Verzeichnis senden att2 = MIMEText(open('example.txt', 'rb').read(), 'base64', 'utf-8') att2["Content-Type"] = 'application/octet-stream' att2["Content-Disposition"] = 'attachment; filename="example.txt"' message.attach(att2) try: smtpObj = smtplib.SMTP('localhost') smtpObj.sendmail(sender, receivers, message.as_string()) print ("E-Mail erfolgreich gesendet") except smtplib.SMTPException: print ("Fehler: E-Mail konnte nicht gesendet werden")
$ python3 test.py 
邮件发送成功

Überprüfen Sie Ihren Posteingang (normalerweise im Spam-Ordner), und Sie können die E-Mail-Nachricht sehen:


Bilder zu HTML-Text hinzufügen

Im HTML-Text einer E-Mail ist das Hinzufügen externer Links bei E-Mail-Dienstanbietern im Allgemeinen ungültig. Ein korrektes Beispiel zum Hinzufügen von Bildern wird unten gezeigt:

Beispiel

#!/usr/bin/python3 import smtplib from email.mime.image import MIMEImage from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.header import Header sender = '[email protected]' receivers = ['[email protected]'] # Empfänger-E-Mail, kann auf Ihr QQ-Postfach oder ein anderes Postfach gesetzt werden msgRoot = MIMEMultipart('related') msgRoot['From'] = Header("Beispiel", 'utf-8') msgRoot['To'] = Header("Test", 'utf-8') subject = 'Python-SMTP-E-Mail-Test' msgRoot['Subject'] = Header(subject, 'utf-8') msgAlternative = MIMEMultipart('alternative') msgRoot.attach(msgAlternative) mail_msg = """<p>Python-E-Mail-Versandtest...</p> <p><a href="http://www.example.com">Beispiel-Tutorial-Link</a></p> <p>Bilddemo:</p> <p><img src="cid:image1"></p>""" msgAlternative.attach(MIMEText(mail_msg, 'html', 'utf-8')) # Bild im aktuellen Verzeichnis angeben fp = open('test.png', 'rb') msgImage = MIMEImage(fp.read()) fp.close() # Bild-ID definieren, auf die im HTML-Text verwiesen wird msgImage.add_header('Content-ID', '<image1>') msgRoot.attach(msgImage) try: smtpObj = smtplib.SMTP('localhost') smtpObj.sendmail(sender, receivers, msgRoot.as_string()) print ("E-Mail erfolgreich gesendet") except smtplib.SMTPException: print ("Fehler: E-Mail konnte nicht gesendet werden")
$ python3 test.py 
邮件发送成功

Überprüfen Sie Ihren Posteingang (wenn sie im Spam-Ordner liegt, müssen Sie sie möglicherweise in den Posteingang verschieben, damit sie richtig angezeigt wird), und Sie können die E-Mail-Nachricht sehen:


Senden über einen SMTP-Drittanbieterdienst

Hier verwenden wir den SMTP-Dienst von QQ Mail (Sie können auch 163, Gmail usw. verwenden). Sie müssen Folgendes konfigurieren:

QQ Mail legt das Passwort durch Generieren eines Autorisierungscodes fest:

QQ Mail SMTP-Serveradresse: smtp.qq.com, SSL-Port: 465.

Im folgenden Beispiel müssen Sie ändern: Absender-E-Mail (Ihre QQ-E-Mail), Passwort, Empfänger-E-Mail (Sie können an sich selbst senden).

QQ SMTP

#!/usr/bin/python3 import smtplib from email.mime.text import MIMEText from email.utils import formataddr my_sender='[email protected]' # E-Mail-Konto des Absenders my_pass = 'xxxxxxxxxx' # E-Mail-Passwort des Absenders my_user='[email protected]' # E-Mail-Konto des Empfängers, ich sende hier an mich selbst def mail(): ret=True try: msg=MIMEText('E-Mail-Inhalt ausfüllen','plain','utf-8') msg['From']=formataddr(["FromExample",my_sender]) # Die Angaben in Klammern entsprechen dem E-Mail-Nicknamen des Absenders und dem E-Mail-Konto des Absenders. msg['To']=formataddr(["FK",my_user]) # Die Angaben in Klammern entsprechen dem E-Mail-Nicknamen des Empfängers und dem E-Mail-Konto des Empfängers. msg['Subject']="Beispiel-E-Mail-Versandtest" # Der Betreff der E-Mail, auch als Titel bekannt. server=smtplib.SMTP_SSL("smtp.qq.com", 465) # Der SMTP-Server in der E-Mail des Absenders, Port ist 25. server.login(my_sender, my_pass) # Die Klammern entsprechen dem E-Mail-Konto des Absenders und dem E-Mail-Passwort. server.sendmail(my_sender,[my_user,],msg.as_string()) # Die Klammern entsprechen dem E-Mail-Konto des Absenders, dem E-Mail-Konto des Empfängers und der zu sendenden E-Mail. server.quit() # Verbindung schließen except Exception: # Wenn die Anweisungen in try nicht ausgeführt werden, wird das folgende ret=False ausgeführt. ret=False return ret ret=mail() if ret: print("E-Mail erfolgreich gesendet") else: print("E-Mail-Versand fehlgeschlagen")
$ python test.py 
邮件发送成功

Nach erfolgreichem Senden melden Sie sich im Postfach des Empfängers an, um es anzusehen:

Weitere Inhalte finden Sie unter:https://docs.python.org/3/library/email-examples.html。

Weitere Erweiterungen