国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python3利用SMTP協議發送E-mail電子郵件的方法

2020-01-04 16:33:12
字體:
來源:轉載
供稿:網友

前言

本文主要給大家介紹了關于Python3用SMTP協議發送電子郵件的相關內容,在介紹如何使用python/203713.html">python程序向指定郵箱發送郵件之前,我們需要先介紹一下有關電子郵件的相關知識。

Email的歷史比Web還要久遠,直到現在,Email也是互聯網上應用非常廣泛的服務。

幾乎所有的編程語言都支持發送和接收電子郵件,但是,先等等,在我們開始編寫代碼之前,有必要搞清楚電子郵件是如何在互聯網上運作的。

假設我們自己的電子郵件地址是me@163.com,對方的電子郵件地址是friend@sina.com,現在我們用Outlook或者Foxmail之類的軟件寫好郵件,填上對方的Email地址,點“發送”,電子郵件就發出去了。這些電子郵件軟件被稱為MUA:Mail User Agent——郵件用戶代理。

Email從MUA發出去,不是直接到達對方電腦,而是發到MTA:Mail Transfer Agent——郵件傳輸代理,就是那些Email服務提供商,比如網易、新浪等等。由于我們自己的電子郵件是163.com,所以,Email首先被投遞到網易提供的MTA,再由網易的MTA發到對方服務商,也就是新浪的MTA。這個過程中間可能還會經過別的MTA,但是我們不關心具體路線,我們只關心速度。

Email到達新浪的MTA后,由于對方使用的是@sina.com的郵箱,因此,新浪的MTA會把Email投遞到郵件的最終目的地MDA:Mail Delivery Agent——郵件投遞代理。Email到達MDA后,就靜靜地躺在新浪的某個服務器上,存放在某個文件或特殊的數據庫里,我們將這個長期保存郵件的地方稱之為電子郵箱。對方要取到郵件,必須通過MUA從MDA上把郵件取到自己的電腦上。

所以,一封電子郵件的旅程就是:

發件人 -> MUA -> MTA -> MTA -> 若干個MTA -> MDA <- MUA <- 收件人

有了上述基本概念,要編寫程序來發送和接收郵件,本質上就是:

      1.編寫MUA把郵件發到MTA。

      2.編寫MUA從MDA上收郵件。

發郵件時,MUA和MTA使用的協議就是SMTP:Simple Mail Transfer Protocol,后面的MTA到另一個MTA也是用SMTP協議。

收郵件時,MUA和MDA使用的協議有兩種:POP:Post Office Protocol,目前版本是3,俗稱POP3;IMAP:Internet Message Access Protocol,目前版本是4,優點是不但能取郵件,還可以直接操作MDA上存儲的郵件,比如從收件箱移到垃圾箱,等等。

郵件客戶端軟件在發郵件時,會讓你先配置SMTP服務器,也就是你要發到哪個MTA上。假設你正在使用163的郵箱,你就不能直接發到新浪的MTA上,因為它只服務新浪的用戶,所以,你得填163提供的SMTP服務器地址:smtp.163.com,為了證明你是163的用戶,SMTP服務器還要求你填寫郵箱地址和郵箱口令,這樣,MUA才能正常地把Email通過SMTP協議發送到MTA。

類似的,從MDA收郵件時,MDA服務器也要求驗證你的郵箱口令,確保不會有人冒充你收取你的郵件,所以,Outlook之類的郵件客戶端會要求你填寫POP3或IMAP服務器地址、郵箱地址和口令,這樣,MUA才能順利地通過POP或IMAP協議從MDA取到郵件。

最后特別注意:目前大多數郵件服務商都需要手動打開SMTP發信和POP收信的功能,否則只允許在網頁登錄:

比如QQ郵箱

python3,smtp,python,smtp發送郵件,發送電子郵件

接下來,我們開始我們的正題,如何通過python發送電子郵件。

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

發送簡單文本郵件

SMTP是發送郵件的協議,Python內置對SMTP的支持,可以發送純文本郵件、HTML郵件以及帶附件的郵件。

Python對SMTP支持有smtplib和email兩個模塊,email負責構造郵件,smtplib負責發送郵件。

首先,我們來構造一個最簡單的純文本郵件:

from email.mime.text import MIMETextmsg = MIMEText('hello, this is axin...', 'plain', 'utf-8')

注意:到構造MIMEText對象時,第一個參數就是郵件正文,第二個參數是MIME的subtype,傳入'plain'表示純文本,最終的MIME就是'text/plain',最后一定要用utf-8編碼保證多語言兼容性。

我們光有了正文內容還不可以,我們還需要給我們要發送的郵件添加頭部信息。頭部信息中包含發送者和接收者以及郵件主題等信息。

msg = MIMEText('hello, this is axin...', 'plain', 'utf-8') #郵件正文msg['From'] = _format_addr('阿鑫 <%s>' % from_addr) #郵件頭部,發送者信息msg['To'] = _format_addr('aa <%s>' % to_addr) #接收者信息msg['Subject'] = Header('test', 'utf-8').encode() #郵件主題

構造完我們要發送的信息后,我們只需要調用python對應的函數,通過SMTP發出去:

server = smtplib.SMTP(smtp_server, 25) #SMTP協議默認端口是25server.set_debuglevel(1) #打印出和SMTP服務器交互的所有信息server.login(from_addr, password) #登錄SMTP服務器server.sendmail(from_addr, [to_addr], msg.as_string()) #發送郵件server.quit()

我們用set_debuglevel(1)就可以打印出和SMTP服務器交互的所有信息。SMTP協議就是簡單的文本命令和響應。login()方法用來登錄SMTP服務器,sendmail()方法就是發郵件,由于可以一次發給多個人,所以傳入一個list,郵件正文是一個str,as_string()把MIMEText對象變成str。

完整代碼示例如下:

from email import encodersfrom email.header import Headerfrom email.mime.text import MIMETextfrom email.utils import parseaddr, formataddrimport smtplibdef _format_addr(s): #格式化一個郵件地址name, addr = parseaddr(s)return formataddr((Header(name, 'utf-8').encode(), addr))from_addr = 'fengxinlinux@sina.com' #發送者郵箱地址password = '******' #發送者郵箱密碼,不告訴你密碼=。=to_addr = '903087053@qq.com' #接收者郵箱地址smtp_server = 'smtp.sina.com' #發送者所在的郵箱供應商的MTA地址#from_addr = input('From: ')#password = input('Password: ')#to_addr = input('To: ')#smtp_server = input('SMTP server: ')msg = MIMEText('hello, this is axin...', 'plain', 'utf-8') #郵件正文msg['From'] = _format_addr('阿鑫 <%s>' % from_addr) #郵件頭部,發送者信息msg['To'] = _format_addr('axin <%s>' % to_addr) #接收者信息msg['Subject'] = Header('test', 'utf-8').encode() #郵件主題server = smtplib.SMTP(smtp_server, 25) # SMTP協議默認端口是25server.set_debuglevel(1) #打印出和SMTP服務器交互的所有信息server.login(from_addr, password) #登錄SMTP服務器server.sendmail(from_addr, [to_addr], msg.as_string()) #發送郵件server.quit()1

運行程序,我們會發現我測試的郵箱中收到了一封新的郵件。

python3,smtp,python,smtp發送郵件,發送電子郵件

我們會發現,其他的信息都一樣,但是收件人的信息不是我們程序里填寫的axin。

因為很多郵件服務商在顯示郵件時,會把收件人名字自動替換為用戶注冊的名字,但是其他收件人名字的顯示不受影響。

我在測試時,有時候發送的郵件會被郵件服務商判定為垃圾郵件,直接被放到垃圾箱中了。。。至于什么情況會被認定為垃圾郵件,我也摸不到頭緒。。

發送帶附件的郵件

上面我們介紹了如何發送文本郵件,有了上面的知識后,發送帶有附件的郵件其實也非常的簡單。

帶附件的郵件可以看做包含若干部分的郵件:文本和各個附件本身,所以,可以構造一個MIMEMultipart對象代表郵件本身,然后往里面加上一個MIMEText作為郵件正文,再繼續往里面加上表示附件的MIMEBase對象即可:

# 郵件對象:msg= MIMEMultipart()msg['From'] = _format_addr('阿鑫 <%s>' % from_addr) #郵件頭部,發送者信息msg['To'] = _format_addr('axin <%s>' % to_addr) #接收者信息msg['Subject'] = Header('test', 'utf-8').encode() #郵件主題# 郵件正文是MIMEText:msg.attach(MIMEText('hello, this is axin...', 'plain', 'utf-8'))# 添加附件就是加上一個MIMEBase,從本地讀取一個圖片:with open('/home/fengxin/圖片/11.jpg','rb') as fhandle:mime = MIMEBase('image','jpeg',filename='11.jpg')mime.add_header('Content-Disposition', 'attachment', filename='11.jpg')mime.add_header('Content-ID', '<0>')mime.add_header('X-Attachment-Id', '0')# 把附件的內容讀進來:mime.set_payload(fhandle.read())# 用Base64編碼:encoders.encode_base64(mime)# 添加到MIMEMultipart:msg.attach(mime)

然后,按正常發送流程把msg(注意類型已變為MIMEMultipart)發送出去,就可以收到帶附件的郵件。

完整代碼示例如下:

from email import encodersfrom email.header import Headerfrom email.mime.text import MIMETextfrom email.utils import parseaddr, formataddrfrom email.mime.multipart import MIMEMultipartfrom email.mime.base import MIMEBaseimport smtplibdef _format_addr(s): #格式化一個郵件地址name, addr = parseaddr(s)return formataddr((Header(name, 'utf-8').encode(), addr))from_addr = '你的郵箱地址' #發送者郵箱地址password = '你的郵箱密碼' #發送者郵箱密碼to_addr = '903087053@qq.com' #接收者郵箱地址smtp_server = 'smtp.sina.com' #發送者所在的郵箱供應商的MTA地址#from_addr = input('From: ')#password = input('Password: ')#to_addr = input('To: ')#smtp_server = input('SMTP server: ')msg= MIMEMultipart()msg['From'] = _format_addr('阿鑫 <%s>' % from_addr) #郵件頭部,發送者信息msg['To'] = _format_addr('axin <%s>' % to_addr) #接收者信息msg['Subject'] = Header('test', 'utf-8').encode() #郵件主題msg.attach(MIMEText('hello, this is axin...', 'plain', 'utf-8'))with open('/home/fengxin/圖片/11.jpg','rb') as fhandle:mime = MIMEBase('image','jpeg',filename='11.jpg')mime.add_header('Content-Disposition', 'attachment', filename='11.jpg')mime.add_header('Content-ID', '<0>')mime.add_header('X-Attachment-Id', '0')# 把附件的內容讀進來:mime.set_payload(fhandle.read())# 用Base64編碼:encoders.encode_base64(mime)# 添加到MIMEMultipart:msg.attach(mime)server = smtplib.SMTP(smtp_server, 25) # SMTP協議默認端口是25server.set_debuglevel(1) #打印出和SMTP服務器交互的所有信息server.login(from_addr, password) #登錄SMTP服務器server.sendmail(from_addr, [to_addr], msg.as_string()) #發送郵件server.quit()1

運行后。測試郵箱正確收到郵件,如圖:

python3,smtp,python,smtp發送郵件,發送電子郵件

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到python教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 八宿县| 淮滨县| 太白县| 施甸县| 凤翔县| 海丰县| 赤壁市| 吉林市| 保德县| 枣庄市| 邻水| 曲周县| 岳西县| 资阳市| 巴林左旗| 吉安市| 潜山县| 包头市| 贵州省| 沐川县| 兴山县| 甘孜| 永州市| 德清县| 礼泉县| 开远市| 双桥区| 遂川县| 平顶山市| 酉阳| 青田县| 营山县| 通山县| 阜宁县| 榆社县| 客服| 宾川县| 华阴市| 务川| 嘉祥县| 九寨沟县|