Heim >Backend-Entwicklung >Python-Tutorial >Beispiel dafür, wie Python3 das SMTP-Protokoll zum Senden von E-Mail-E-Mails verwendet

Beispiel dafür, wie Python3 das SMTP-Protokoll zum Senden von E-Mail-E-Mails verwendet

黄舟
黄舟Original
2017-10-02 09:43:143449Durchsuche

SMTP (Simple Mail Transfer Protocol) ist ein einfaches E-Mail-Übertragungsprotokoll. Es handelt sich um eine Reihe von Regeln für die Übertragung von E-Mails von einer Quelladresse an eine Zieladresse. Es steuert die Übertragungsmethode von Briefen. Der folgende Artikel stellt hauptsächlich vor, wie Python3 das SMTP-Protokoll zum Senden von E-Mails verwendet. Freunde in Not können sich darauf beziehen.

Vorwort

Dieser Artikel führt Sie hauptsächlich in die relevanten Inhalte über Python3 ein, das das SMTP-Protokoll zum Senden von E-Mails verwendet. Außerdem wird die Verwendung von Python vorgestellt Programm zum Senden von E-Mails Bevor wir eine E-Mail-Adresse zum Senden einer E-Mail angeben, müssen wir einige Kenntnisse über E-Mail einführen.

E-Mail hat eine längere Geschichte als das Web Bislang ist E-Mail auch ein sehr weit verbreiteter Dienst im Internet.

Fast alle Programmiersprachen unterstützen das Senden und Empfangen von E-Mails, aber warten Sie, bevor wir mit dem Schreiben von Code beginnen, müssen Sie verstehen, wie E-Mails im Internet funktionieren.

Angenommen, unsere eigene E-Mail-Adresse ist me@163.com und die E-Mail-Adresse der anderen Partei ist friend@sina.com. Jetzt verwenden wir Software wie Outlook oder Foxmail, um die E-Mail zu schreiben und die E-Mail-Adresse der anderen Partei einzugeben Geben Sie die E-Mail-Adresse ein, klicken Sie auf „Senden“ und die E-Mail wird versendet. Diese E-Mail-Software heißt MUA: Mail User Agent – ​​Mail User Agent.

E-Mails, die von MUA gesendet werden, erreichen nicht direkt den Computer der anderen Partei, sondern werden an MTA gesendet: Mail Transfer Agent – ​​Mail Transfer Agent, also E-Mail-Dienstanbieter wie NetEase, Sina usw. Da unsere eigene E-Mail-Adresse 163.com lautet, wird die E-Mail zunächst an den von NetEase bereitgestellten MTA zugestellt und dann vom MTA von NetEase an den anderen Dienstanbieter, den MTA von Sina, gesendet. Dieser Prozess kann auch andere MTAs durchlaufen, aber die spezifische Route ist uns egal, uns interessiert nur die Geschwindigkeit.

Nachdem die E-Mail Sinas MTA erreicht hat, stellt Sinas MTA die E-Mail an das endgültige Ziel der E-Mail zu, da die andere Partei die E-Mail-Adresse @sina.com verwendet: MDA: Mail Delivery Agent – ​​Mail Delivery Agent. Nachdem die E-Mail MDA erreicht hat, liegt sie still auf einem Server von Sina und wird in einer Datei oder speziellen Datenbank gespeichert. Wir nennen diesen Ort, an dem E-Mails für lange Zeit gespeichert werden, ein E-Mail-Postfach. Um die E-Mails zu erhalten, muss die andere Partei MUA verwenden, um die E-Mails vom MDA auf ihren Computer zu übertragen.

Der Weg einer E-Mail ist also:

Absender -> MTA -> ;- MUA <- Empfänger

Mit den oben genannten Grundkonzepten müssen Sie ein Programm zum Senden und Empfangen von E-Mails schreiben, das im Wesentlichen wie folgt lautet:

1. Schreiben MUA zum Senden von E-Mails an MTA.

2. Schreiben Sie MUA, um E-Mails von MDA zu erhalten.

Beim Versenden von E-Mails verwenden MUA und MTA das Protokoll SMTP: Simple Mail Transfer Protocol. Der nachfolgende MTA verwendet auch das SMTP-Protokoll für einen anderen MTA.

Beim Empfang von E-Mails verwenden MUA und MDA zwei Protokolle: POP: Post Office Protocol, die aktuelle Version ist 3, allgemein bekannt als POP3: Internet Message Access Protocol, die aktuelle Version ist 4, der Vorteil ist Das bedeutet nicht nur, dass Sie E-Mails direkt bearbeiten können, sondern auch die auf dem MDA gespeicherten E-Mails direkt bearbeiten können, z. B. indem Sie sie aus dem Posteingang in den Papierkorb verschieben usw.

Beim Versenden von E-Mails werden Sie von der E-Mail-Client-Software aufgefordert, zuerst den SMTP-Server zu konfigurieren, d. h. an welchen MTA Sie senden möchten. Vorausgesetzt, Sie verwenden die E-Mail-Adresse von 163, können Sie nicht direkt an den MTA von Sina senden, da dieser nur Sina-Benutzer bedient. Daher müssen Sie die von 163 bereitgestellte SMTP-Serveradresse eingeben: smtp.163.com, um zu beweisen, dass Sie es sind 163 Für Benutzer erfordert der SMTP-Server außerdem die Eingabe Ihrer E-Mail-Adresse und Ihres E-Mail-Passworts, damit der MUA normalerweise E-Mails über das SMTP-Protokoll an den MTA senden kann.

Ebenso verlangt der MDA-Server auch beim Empfang von E-Mails von MDA eine Überprüfung Ihres E-Mail-Passworts, um sicherzustellen, dass niemand vorgibt, Sie zu sein, um Ihre E-Mails zu erhalten. Daher werden Sie von E-Mail-Clients wie Outlook dazu aufgefordert Geben Sie die POP3- oder IMAP-Serveradresse, die E-Mail-Adresse und das Passwort ein, damit MUA erfolgreich E-Mails von MDA über das POP- oder IMAP-Protokoll abrufen kann.

Letzter besonderer Hinweis: Derzeit müssen die meisten E-Mail-Dienstanbieter die SMTP-Sende- und POP-Empfangsfunktionen manuell aktivieren, andernfalls dürfen sie sich nur anmelden das Web:

Zum Beispiel QQ-Postfach

Als nächstes beginnen wir mit unserem Thema, wie man E-Mails über Python versendet.

---------------- ------ ------------------------------------

Senden von Text-E-Mails ist ganz einfach

SMTP ist ein Protokoll zum Senden von E-Mails. Python verfügt über eine integrierte Unterstützung für SMTP und kann E-Mails im reinen Textformat, HTML-E-Mails und E-Mails senden Anhänge.

Python unterstützt SMTP mit zwei Modulen: smtplib und email. E-Mail ist für die Erstellung von E-Mails und smtplib für den Versand von E-Mails verantwortlich.

Erstens erstellen wir die einfachste Nur-Text-E-Mail:


from email.mime.text import MIMEText
msg = MIMEText(&#39;hello, this is axin...&#39;, &#39;plain&#39;, &#39;utf-8&#39;)

Hinweis: Beim Erstellen des MIMEText-Objekts ist der erste Parameter der E-Mail-Text und der zweite Parameter der Untertyp von MIME. Die Übergabe bedeutet „plain“. reiner Text, das endgültige MIME ist „text/plain“ und muss schließlich mit utf-8 codiert werden, um mehrsprachige Kompatibilität sicherzustellen.

Wir haben nicht nur den Textinhalt, wir müssen auch Header-Informationen zu der E-Mail hinzufügen, die wir senden möchten. Die Header-Informationen enthalten Informationen wie Absender und Empfänger sowie den Betreff der E-Mail.


msg = MIMEText(&#39;hello, this is axin...&#39;, &#39;plain&#39;, &#39;utf-8&#39;) #邮件正文
msg[&#39;From&#39;] = _format_addr(&#39;阿鑫 <%s>&#39; % from_addr) #邮件头部,发送者信息
msg[&#39;To&#39;] = _format_addr(&#39;aa <%s>&#39; % to_addr) #接收者信息
msg[&#39;Subject&#39;] = Header(&#39;test&#39;, &#39;utf-8&#39;).encode() #邮件主题

Nachdem wir die Informationen erstellt haben, die wir senden möchten, müssen wir nur noch die entsprechende Funktion in Python aufrufen und über SMTP senden:


server = smtplib.SMTP(smtp_server, 25) #SMTP协议默认端口是25
server.set_debuglevel(1) #打印出和SMTP服务器交互的所有信息
server.login(from_addr, password) #登录SMTP服务器
server.sendmail(from_addr, [to_addr], msg.as_string()) #发送邮件
server.quit()

Mit set_debuglevel(1) können wir alle Informationen ausdrucken, die mit dem SMTP-Server interagieren. Das SMTP-Protokoll besteht einfach aus Textbefehlen und Antworten. Die Methode login() wird zum Anmelden beim SMTP-Server verwendet. Die Methode sendmail() dient zum Senden einer E-Mail. Da diese an mehrere Personen gleichzeitig gesendet werden kann, wird eine Liste übergeben. Der E-Mail-Text ist eine Zeichenfolge . as_string() verwandelt das MIMEText-Objekt in str.

Das vollständige Codebeispiel lautet wie folgt:


from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr

import smtplib

def _format_addr(s): #格式化一个邮件地址
name, addr = parseaddr(s)
return formataddr((Header(name, &#39;utf-8&#39;).encode(), addr))

from_addr = &#39;fengxinlinux@sina.com&#39; #发送者邮箱地址
password = &#39;******&#39; #发送者邮箱密码,不告诉你密码=。=
to_addr = &#39;903087053@qq.com&#39; #接收者邮箱地址
smtp_server = &#39;smtp.sina.com&#39; #发送者所在的邮箱供应商的MTA地址
#from_addr = input(&#39;From: &#39;)
#password = input(&#39;Password: &#39;)
#to_addr = input(&#39;To: &#39;)
#smtp_server = input(&#39;SMTP server: &#39;)

msg = MIMEText(&#39;hello, this is axin...&#39;, &#39;plain&#39;, &#39;utf-8&#39;) #邮件正文
msg[&#39;From&#39;] = _format_addr(&#39;阿鑫 <%s>&#39; % from_addr) #邮件头部,发送者信息
msg[&#39;To&#39;] = _format_addr(&#39;axin <%s>&#39; % to_addr) #接收者信息
msg[&#39;Subject&#39;] = Header(&#39;test&#39;, &#39;utf-8&#39;).encode() #邮件主题


server = smtplib.SMTP(smtp_server, 25) # SMTP协议默认端口是25
server.set_debuglevel(1) #打印出和SMTP服务器交互的所有信息
server.login(from_addr, password) #登录SMTP服务器
server.sendmail(from_addr, [to_addr], msg.as_string()) #发送邮件
server.quit()
1

Beim Ausführen des Programms werden wir feststellen, dass eine E-Mail empfangen wurde Im Postfach habe ich neue E-Mails getestet.

Wir werden feststellen, dass die anderen Informationen gleich sind, aber die Informationen des Empfängers nicht mit den in unserem Programm ausgefüllten Axinen übereinstimmen.

Da viele E-Mail-Dienstanbieter bei der Anzeige der E-Mail automatisch den Namen des Empfängers durch den registrierten Namen des Benutzers ersetzen, die Anzeige der Namen anderer Empfänger jedoch nicht beeinträchtigt wird.

Bei meinen Tests wurden die von mir gesendeten E-Mails manchmal vom E-Mail-Dienstanbieter als Spam eingestuft und direkt in den Papierkorb verschoben. . . Was als Spam gilt, weiß ich nicht. .

E-Mail mit Anhängen senden

Oben haben wir beschrieben, wie man Text-E-Mails mit den oben genannten Kenntnissen versendet ganz einfach.

Eine E-Mail mit Anhängen kann als eine E-Mail betrachtet werden, die mehrere Teile enthält: Text und jeden Anhang selbst. Daher können Sie ein MIMEMultipart-Objekt erstellen, um die E-Mail selbst darzustellen, und ihm dann einen MIMEText als E-Mail hinzufügen Hauptteil und fahren Sie dann fort. Fügen Sie einfach das MIMEBase-Objekt hinzu, das den Anhang darstellt:


# 邮件对象:
msg= MIMEMultipart()
msg[&#39;From&#39;] = _format_addr(&#39;阿鑫 <%s>&#39; % from_addr) #邮件头部,发送者信息
msg[&#39;To&#39;] = _format_addr(&#39;axin <%s>&#39; % to_addr) #接收者信息
msg[&#39;Subject&#39;] = Header(&#39;test&#39;, &#39;utf-8&#39;).encode() #邮件主题

# 邮件正文是MIMEText:
msg.attach(MIMEText(&#39;hello, this is axin...&#39;, &#39;plain&#39;, &#39;utf-8&#39;))

# 添加附件就是加上一个MIMEBase,从本地读取一个图片:
with open(&#39;/home/fengxin/图片/11.jpg&#39;,&#39;rb&#39;) as fhandle:
mime = MIMEBase(&#39;image&#39;,&#39;jpeg&#39;,filename=&#39;11.jpg&#39;)
mime.add_header(&#39;Content-Disposition&#39;, &#39;attachment&#39;, filename=&#39;11.jpg&#39;)
mime.add_header(&#39;Content-ID&#39;, &#39;<0>&#39;)
mime.add_header(&#39;X-Attachment-Id&#39;, &#39;0&#39;)
# 把附件的内容读进来:
mime.set_payload(fhandle.read())
# 用Base64编码:
encoders.encode_base64(mime)
# 添加到MIMEMultipart:
msg.attach(mime)

Folgen Sie dann dem normalen Sendevorgang, um die Nachricht zu senden (beachten Sie, dass sich der Typ geändert hat). an MIMEMultipart). E-Mail mit Anhang erhalten.

Das vollständige Codebeispiel lautet wie folgt:


from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase


import smtplib

def _format_addr(s): #格式化一个邮件地址
name, addr = parseaddr(s)
return formataddr((Header(name, &#39;utf-8&#39;).encode(), addr))

from_addr = &#39;你的邮箱地址&#39; #发送者邮箱地址
password = &#39;你的邮箱密码&#39; #发送者邮箱密码
to_addr = &#39;903087053@qq.com&#39; #接收者邮箱地址
smtp_server = &#39;smtp.sina.com&#39; #发送者所在的邮箱供应商的MTA地址
#from_addr = input(&#39;From: &#39;)
#password = input(&#39;Password: &#39;)
#to_addr = input(&#39;To: &#39;)
#smtp_server = input(&#39;SMTP server: &#39;)


msg= MIMEMultipart()
msg[&#39;From&#39;] = _format_addr(&#39;阿鑫 <%s>&#39; % from_addr) #邮件头部,发送者信息
msg[&#39;To&#39;] = _format_addr(&#39;axin <%s>&#39; % to_addr) #接收者信息
msg[&#39;Subject&#39;] = Header(&#39;test&#39;, &#39;utf-8&#39;).encode() #邮件主题

msg.attach(MIMEText(&#39;hello, this is axin...&#39;, &#39;plain&#39;, &#39;utf-8&#39;))

with open(&#39;/home/fengxin/图片/11.jpg&#39;,&#39;rb&#39;) as fhandle:
mime = MIMEBase(&#39;image&#39;,&#39;jpeg&#39;,filename=&#39;11.jpg&#39;)
mime.add_header(&#39;Content-Disposition&#39;, &#39;attachment&#39;, filename=&#39;11.jpg&#39;)
mime.add_header(&#39;Content-ID&#39;, &#39;<0>&#39;)
mime.add_header(&#39;X-Attachment-Id&#39;, &#39;0&#39;)
# 把附件的内容读进来:
mime.set_payload(fhandle.read())
# 用Base64编码:
encoders.encode_base64(mime)
# 添加到MIMEMultipart:
msg.attach(mime)

server = smtplib.SMTP(smtp_server, 25) # SMTP协议默认端口是25
server.set_debuglevel(1) #打印出和SMTP服务器交互的所有信息
server.login(from_addr, password) #登录SMTP服务器
server.sendmail(from_addr, [to_addr], msg.as_string()) #发送邮件
server.quit()
1

Nach dem Ausführen. Das Testpostfach hat die E-Mail korrekt empfangen, wie im Bild gezeigt:

Zusammenfassung

Das obige ist der detaillierte Inhalt vonBeispiel dafür, wie Python3 das SMTP-Protokoll zum Senden von E-Mail-E-Mails verwendet. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn