简单三步,用 Python 发邮件
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
0. 前言
發(fā)送電子郵件是個(gè)很常見(jiàn)的開(kāi)發(fā)需求。比如你寫(xiě)了個(gè)監(jiān)控天氣的腳本,發(fā)現(xiàn)第二天要下雨,或者網(wǎng)站上關(guān)注的某個(gè)商品降價(jià)了,就可以發(fā)個(gè)郵件到郵箱來(lái)提醒自己。
使用 Python 腳本發(fā)送郵件并不復(fù)雜。不過(guò)由于各家郵件的發(fā)送機(jī)制和安全策略不同,常常會(huì)因?yàn)橐恍┡渲脝?wèn)題造成發(fā)送失敗。今天我們來(lái)舉例講講如何使用 Python 發(fā)送郵件。
本文主要內(nèi)容包括,了解發(fā)郵件的思路,發(fā)送郵件需要的一些設(shè)置,發(fā)送一封簡(jiǎn)單的郵件,發(fā)送一封包含附件的郵件,在寫(xiě)代碼過(guò)程中我們需要注意哪些問(wèn)題等等。(完整參考代碼地址見(jiàn)文末)
1. 思路
使用腳本發(fā)送郵件的思路其實(shí)和客戶(hù)端發(fā)送郵件一樣,過(guò)程都是:
登錄 —> 寫(xiě)郵件 —> 發(fā)送
只不過(guò)通過(guò)腳本發(fā)送時(shí)我們需要考慮到整個(gè)過(guò)程的方方面面。以下為思路導(dǎo)圖:
2. Python-email 模塊
與發(fā)送郵件相關(guān)的 Python 模塊:
smtplib
是關(guān)于 SMTP(簡(jiǎn)單郵件傳輸協(xié)議)的操作模塊,在發(fā)送郵件的過(guò)程中起到服務(wù)器之間互相通信的作用。
簡(jiǎn)單來(lái)說(shuō),即服務(wù)器之間通信的信息,包括信息頭、信息主體等等。
舉個(gè)簡(jiǎn)單的例子,當(dāng)你登錄郵箱,寫(xiě)好郵件后點(diǎn)擊發(fā)送,這部分是由 SMTP 接管;而寫(xiě)郵件、添加附件是由 email 模塊控制。
3. 開(kāi)通電子郵箱的SMTP功能
在使用腳本發(fā)郵件之前,我們需要打開(kāi)自己郵箱的 SMTP 功能,各家郵箱的設(shè)置方法就不一一講述了,具體使用時(shí)可以百度一下,下面以 163 郵箱設(shè)置為例做一個(gè)簡(jiǎn)單的演示:
4. 簡(jiǎn)單代碼
實(shí)踐出真知,我們結(jié)合一個(gè)簡(jiǎn)單的代碼來(lái)理解這一過(guò)程:登錄 163 郵箱,向 qq 郵箱發(fā)送郵件。
腳本分為三個(gè)步驟:
另外在處理文本時(shí),我們需要使用 MIMEText 類(lèi)。
import smtplib from email.mime.text import MIMEText #設(shè)置服務(wù)器所需信息 #163郵箱服務(wù)器地址 mail_host = 'smtp.163.com' #163用戶(hù)名 mail_user = '159*****02' #密碼(部分郵箱為授權(quán)碼) mail_pass = '7******x' #郵件發(fā)送方郵箱地址 sender = '159*****02@163.com' #郵件接受方郵箱地址,注意需要[]包裹,這意味著你可以寫(xiě)多個(gè)郵件地址群發(fā) receivers = ['59*****02@qq.com'] #設(shè)置email信息 #郵件內(nèi)容設(shè)置 message = MIMEText('content','plain','utf-8') #郵件主題 message['Subject'] = 'title' #發(fā)送方信息 message['From'] = sender #接受方信息 message['To'] = receivers[0] #登錄并發(fā)送郵件 try:smtpObj = smtplib.SMTP() #連接到服務(wù)器smtpObj.connect(mail_host,25)#登錄到服務(wù)器smtpObj.login(mail_user,mail_pass) #發(fā)送smtpObj.sendmail(sender,receivers,message.as_string()) #退出smtpObj.quit() print('success') except smtplib.SMTPException as e:print('error',e) #打印錯(cuò)誤結(jié)果:
注意事項(xiàng):
一些郵箱登錄比如 QQ 郵箱需要 SSL 認(rèn)證,所以 SMTP 已經(jīng)不能滿(mǎn)足要求,而需要SMTP_SSL,解決辦法為:
#啟動(dòng) smtpObj = smtplib.SMTP() #連接到服務(wù)器 smtpObj.connect(mail_host,25) #######替換為######## smtpObj = smtplib.SMTP_SSL(mail_host)5. 帶有附件的email
上面我們介紹了發(fā)送字符串的郵件,但這明顯不滿(mǎn)足現(xiàn)代郵件的需求,下面我們介紹如何發(fā)送內(nèi)容以 HTML 格式,并且?guī)в袌D片和文本文件的郵件。
處理多種形態(tài)的郵件主體我們需要 MIMEMultipart 類(lèi),而處理圖片需要 MIMEImage 類(lèi)。
import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.image import MIMEImage#設(shè)置登錄及服務(wù)器信息 mail_host = 'smtp.163.com' mail_user = '159*****02' mail_pass = '7******x' sender = '159*****02@163.com' receivers = ['7******0@qq.com']#設(shè)置eamil信息 #添加一個(gè)MIMEmultipart類(lèi),處理正文及附件 message = MIMEMultipart() message['From'] = sender message['To'] = receivers[0] message['Subject'] = 'title' #推薦使用html格式的正文內(nèi)容,這樣比較靈活,可以附加圖片地址,調(diào)整格式等 with open('abc.html','r') as f:content = f.read() #設(shè)置html格式參數(shù) part1 = MIMEText(content,'html','utf-8') #添加一個(gè)txt文本附件 with open('abc.txt','r')as h:content2 = h.read() #設(shè)置txt參數(shù) part2 = MIMEText(content2,'plain','utf-8') #附件設(shè)置內(nèi)容類(lèi)型,方便起見(jiàn),設(shè)置為二進(jìn)制流 part2['Content-Type'] = 'application/octet-stream' #設(shè)置附件頭,添加文件名 part2['Content-Disposition'] = 'attachment;filename="abc.txt"' #添加照片附件 with open('1.png','rb')as fp:picture = MIMEImage(fp.read())#與txt文件設(shè)置相似picture['Content-Type'] = 'application/octet-stream'picture['Content-Disposition'] = 'attachment;filename="1.png"' #將內(nèi)容附加到郵件主體中 message.attach(part1) message.attach(part2) message.attach(picture)#登錄并發(fā)送 try:smtpObj = smtplib.SMTP()smtpObj.connect(mail_host,25)smtpObj.login(mail_user,mail_pass)smtpObj.sendmail(sender,receivers,message.as_string())print('success')smtpObj.quit() except smtplib.SMTPException as e:print('error',e)6.小結(jié)
通過(guò)上面的代碼,想必大家已經(jīng)對(duì)發(fā)郵件有了基本的認(rèn)識(shí)。
從整體上我們要把握整個(gè)過(guò)程的思路:
微觀上我們需要了解:
- smtplib/email 模塊的代碼規(guī)則;
- 什么時(shí)候使用 SMTP,什么時(shí)候使用 SMTP_SSL?
- 針對(duì)不同的郵件內(nèi)容需要使用到不同的類(lèi),MIMEmultipart、MIMEText、MIMEIamge 等等;
- 怎么去設(shè)置附件信息
當(dāng)然,看再多教程,不如親自動(dòng)手寫(xiě)一段代碼。大家不妨都自己發(fā)一封郵件試一試。
在公眾號(hào)(crossincode)中回復(fù)『email』,可以獲取實(shí)例代碼。
其他文章及回答:
Python 與 Excel 不得不說(shuō)的事 - Crossin的編程教室 - 知乎專(zhuān)欄
Python-Excel 模塊哪家強(qiáng)?- Crossin的編程教室 - 知乎專(zhuān)欄
爆款游戲《貪吃蛇大作戰(zhàn)》的 Python 實(shí)現(xiàn) - Crossin的編程教室 - 知乎專(zhuān)欄
NBA 舉辦編程馬拉松 - 數(shù)據(jù)分析時(shí)代的到來(lái) - Crossin的文章 - 知乎專(zhuān)欄
想用 Python 做數(shù)據(jù)分析?先玩玩這個(gè)再說(shuō) - Crossin的文章 - 知乎專(zhuān)欄
用 Python 實(shí)現(xiàn)你的量化交易策略 - Crossin的文章 - 知乎專(zhuān)欄
學(xué)習(xí)編程的過(guò)程中可能會(huì)走哪些彎路,有哪些經(jīng)驗(yàn)可以參考? - Crossin 的回答
你是如何自學(xué) Python 的? - Crossin 的回答
Python 抓取網(wǎng)頁(yè)亂碼原因分析 - Crossin的編程教室 - 知乎專(zhuān)欄
Crossin的編程教室
微信ID:crossincode
論壇:Crossin的編程教室
轉(zhuǎn)載于:https://my.oschina.net/crossin/blog/1820865
總結(jié)
以上是生活随笔為你收集整理的简单三步,用 Python 发邮件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: 函数(一.return)
- 下一篇: vue组件结构
