Python SMTP-E-Mail-Versand

SMTP (Simple Mail Transfer Protocol) ist ein einfaches Mailübertragungsprotokoll. Es ist eine Reihe von Regeln für die Übertragung von E-Mails von einer Quelladresse zu einer Zieladresse, die die Art und Weise steuert, wie E-Mails 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 Domänennamen des Hosts angeben, z. B.: example.com. 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 Zeichenfolgen – die E-Mail-Adressen, an die gesendet werden soll.
  • msg: Die zu sendende Nachricht.

Beachten Sie den dritten Parameter hier: msg ist eine Zeichenfolge, die die E-Mail darstellt. Wir wissen, dass eine E-Mail im Allgemeinen aus einem Betreff, Absender, Empfänger, E-Mail-Inhalt, Anhängen usw. besteht. Beim Senden einer E-Mail sollten Sie auf das Format von msg achten. Dieses Format ist das im SMTP-Protokoll definierte Format.

Beispiel

Das folgende Beispiel setzt voraus, dass Sie einen SMTP-unterstützenden Dienst auf Ihrem Rechner installiert haben, wie z. B. sendmail.

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

Beispiel

#!/usr/bin/python # -*- coding: UTF-8 -*- 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 gesetzt werden # Drei Parameter: Der erste ist der Textinhalt, der zweite 'plain' legt das Textformat fest und der dritte 'utf-8' legt die Kodierung 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-Felder:From, To, undSubject, wobei jede Information durch eine Leerzeile getrennt wird.

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

Führen Sie das obige Programm aus. Wenn Siesendmail (Mail Transfer Agent)installiert haben, wird Folgendes ausgegeben:

$ python test.py 
邮件发送成功

Überprüfen Sie Ihren Posteingang (normalerweise im Spam-Ordner), um die E-Mail zu sehen:

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

Beispiel

#!/usr/bin/python # -*- coding: UTF-8 -*- 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 Ihre QQ-Mailbox oder ein anderes Postfach gesetzt 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-formatierte E-Mails mit Python senden

Der Unterschied zwischen dem Senden von HTML-formatierten E-Mails und Nur-Text-E-Mails in Python besteht darin, dass `_subtype` in MIMEText auf 'html' gesetzt wird. Der konkrete Code lautet wie folgt:

Beispiel

#!/usr/bin/python # -*- coding: UTF-8 -*- import smtplib from email.mime.text import MIMEText from email.header import Header sender = '[email protected]' receivers = ['[email protected]'] # Empfänger-E-Mail-Adresse, kann auf Ihre QQ-Mailbox oder ein anderes Postfach 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 installiert ist, wird Folgendes ausgegeben:

$ python test.py 
邮件发送成功

Überprüfen Sie Ihren Posteingang (normalerweise im Spam-Ordner), um die E-Mail zu 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 den Anhang. Wenn mehrere Anhänge vorhanden sind, können Sie diese nacheinander erstellen und schließlich mit smtplib.smtp versenden.

Beispiel

#!/usr/bin/python # -*- coding: UTF-8 -*- 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 eingestellt werden # Eine Instanz mit einem Anhang erstellen 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 ein Beispiel-Python-E-Mail-Versandtest...', 'plain', 'utf-8')) # Anhang 1 erstellen, wobei die Datei test.txt im aktuellen Verzeichnis gesendet wird att1 = MIMEText(open('test.txt', 'rb').read(), 'base64', 'utf-8') att1["Content-Type"] = 'application/octet-stream' # Der Dateiname hier kann beliebig sein. Welchen Namen Sie auch schreiben, die E-Mail zeigt diesen Namen an. att1["Content-Disposition"] = 'attachment; filename="test.txt"' message.attach(att1) # Anhang 2 erstellen, wobei die Datei example.txt im aktuellen Verzeichnis gesendet wird 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"
$ python test.py 
邮件发送成功

Überprüfen Sie Ihren Posteingang (normalerweise im Spam-Ordner), um die E-Mail zu sehen:


Bilder in HTML-Text einfügen

In HTML-E-Mail-Textkörpern ist das Hinzufügen externer Links bei E-Mail-Dienstanbietern im Allgemeinen unwirksam. Ein Beispiel für das korrekte Hinzufügen von Bildern ist wie folgt:

Beispiel

#!/usr/bin/python # -*- coding: UTF-8 -*- 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 eingestellt 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>Bilddemonstration:</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 und im HTML-Text referenzieren 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"
$ python test.py 
邮件发送成功

Prüfen Sie Ihren Posteingang (falls sie im Spam-Ordner liegt, müssen Sie sie möglicherweise in den Posteingang verschieben, um sie korrekt anzuzeigen), und Sie können die E-Mail sehen:


Senden mit einem SMTP-Dienst eines Drittanbieters

Hier verwenden wir den SMTP-Dienst von QQ Mail (Sie können auch 163, Gmail usw. verwenden). Die folgende Konfiguration ist erforderlich:

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/python # -*- coding: UTF-8 -*- import smtplib from email.mime.text import MIMEText from email.utils import formataddr my_sender='[email protected]' # Absender-E-Mail-Konto 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 eingeben','plain','utf-8') msg['From']=formataddr(["FromExample",my_sender]) # Die Klammern entsprechen dem E-Mail-Spitznamen des Absenders und dem E-Mail-Konto des Absenders msg['To']=formataddr(["FK",my_user]) # Die Klammern entsprechen dem E-Mail-Spitznamen des Empfängers und dem E-Mail-Konto des Empfängers msg['Subject']="Beispiel: E-Mail-Versandtest" # Der Betreff der E-Mail, auch bekannt als Titel 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 Absender-E-Mail-Konto, dem Empfänger-E-Mail-Konto und der zu sendenden E-Mail server.quit() # Die Verbindung schließen except Exception: # Wenn die Anweisungen in try nicht ausgeführt werden, wird das unten stehende 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 Informationen finden Sie unter:https://docs.python.org/2/library/email-examples.html。

Andere Erweiterungen