摘要:使用腳本發送郵件并不復雜。以下為思路導圖模塊與發送郵件相關的模塊是關于簡單郵件傳輸協議的操作模塊,在發送郵件的過程中起到服務器之間互相通信的作用。
0. 前言
發送電子郵件是個很常見的開發需求。比如你寫了個監控天氣的腳本,發現第二天要下雨,或者網站上關注的某個商品降價了,就可以發個郵件到郵箱來提醒自己。
使用 Python 腳本發送郵件并不復雜。不過由于各家郵件的發送機制和安全策略不同,常常會因為一些配置問題造成發送失敗。今天我們來舉例講講如何使用 Python 發送郵件。
本文主要內容包括,了解發郵件的思路,發送郵件需要的一些設置,發送一封簡單的郵件,發送一封包含附件的郵件,在寫代碼過程中我們需要注意哪些問題等等。(完整參考代碼地址見文末)
1. 思路使用腳本發送郵件的思路其實和客戶端發送郵件一樣,過程都是:
登錄 — > 寫郵件 —> 發送
只不過通過腳本發送時我們需要考慮到整個過程的方方面面。以下為思路導圖:
2. Python-email 模塊與發送郵件相關的 Python 模塊:
smtplib
是關于 SMTP(簡單郵件傳輸協議)的操作模塊,在發送郵件的過程中起到服務器之間互相通信的作用。
簡單來說,即服務器之間通信的信息,包括信息頭、信息主體等等。
舉個簡單的例子,當你登錄郵箱,寫好郵件后點擊發送,這部分是由 SMTP 接管;而寫郵件、添加附件是由 email 模塊控制。
3. 開通電子郵箱的SMTP功能在使用腳本發郵件之前,我們需要打開自己郵箱的 SMTP 功能,各家郵箱的設置方法就不一一講述了,具體使用時可以百度一下,下面以 163 郵箱設置為例做一個簡單的演示:
4. 簡單代碼實踐出真知,我們結合一個簡單的代碼來理解這一過程:登錄 163 郵箱,向 qq 郵箱發送郵件。
腳本分為三個步驟:
設置好服務器端信息
郵件主體信息
登錄發送
另外在處理文本時,我們需要使用 MIMEText 類。
import smtplib from email.mime.text import MIMEText #設置服務器所需信息 #163郵箱服務器地址 mail_host = "smtp.163.com" #163用戶名 mail_user = "159*****02" #密碼(部分郵箱為授權碼) mail_pass = "7******x" #郵件發送方郵箱地址 sender = "159*****02@163.com" #郵件接受方郵箱地址,注意需要[]包裹,這意味著你可以寫多個郵件地址群發 receivers = ["59*****02@qq.com"] #設置email信息 #郵件內容設置 message = MIMEText("content","plain","utf-8") #郵件主題 message["Subject"] = "title" #發送方信息 message["From"] = sender #接受方信息 message["To"] = receivers[0] #登錄并發送郵件 try: smtpObj = smtplib.SMTP() #連接到服務器 smtpObj.connect(mail_host,25) #登錄到服務器 smtpObj.login(mail_user,mail_pass) #發送 smtpObj.sendmail( sender,receivers,message.as_string()) #退出 smtpObj.quit() print("success") except smtplib.SMTPException as e: print("error",e) #打印錯誤
結果:
注意事項:
一些郵箱登錄比如 QQ 郵箱需要 SSL 認證,所以 SMTP 已經不能滿足要求,而需要SMTP_SSL,解決辦法為:
#啟動 smtpObj = smtplib.SMTP() #連接到服務器 smtpObj.connect(mail_host,25) #######替換為######## smtpObj = smtplib.SMTP_SSL(mail_host)5. 帶有附件的email
上面我們介紹了發送字符串的郵件,但這明顯不滿足現代郵件的需求,下面我們介紹如何發送內容以 HTML 格式,并且帶有圖片和文本文件的郵件。
處理多種形態的郵件主體我們需要 MIMEMultipart 類,而處理圖片需要 MIMEImage 類。
import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.image import MIMEImage #設置登錄及服務器信息 mail_host = "smtp.163.com" mail_user = "159*****02" mail_pass = "7******x" sender = "159*****02@163.com" receivers = ["7******0@qq.com"] #設置eamil信息 #添加一個MIMEmultipart類,處理正文及附件 message = MIMEMultipart() message["From"] = sender message["To"] = receivers[0] message["Subject"] = "title" #推薦使用html格式的正文內容,這樣比較靈活,可以附加圖片地址,調整格式等 with open("abc.html","r") as f: content = f.read() #設置html格式參數 part1 = MIMEText(content,"html","utf-8") #添加一個txt文本附件 with open("abc.txt","r")as h: content2 = h.read() #設置txt參數 part2 = MIMEText(content2,"plain","utf-8") #附件設置內容類型,方便起見,設置為二進制流 part2["Content-Type"] = "application/octet-stream" #設置附件頭,添加文件名 part2["Content-Disposition"] = "attachment;filename="abc.txt"" #添加照片附件 with open("1.png","rb")as fp: picture = MIMEImage(fp.read()) #與txt文件設置相似 picture["Content-Type"] = "application/octet-stream" picture["Content-Disposition"] = "attachment;filename="1.png"" #將內容附加到郵件主體中 message.attach(part1) message.attach(part2) message.attach(picture) #登錄并發送 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.小結
通過上面的代碼,想必大家已經對發郵件有了基本的認識。
從整體上我們要把握整個過程的思路:
登錄
寫郵件
發送
微觀上我們需要了解:
smtplib/email 模塊的代碼規則;
什么時候使用 SMTP,什么時候使用 SMTP_SSL?
針對不同的郵件內容需要使用到不同的類,MIMEmultipart、MIMEText、MIMEIamge 等等;
怎么去設置附件信息
當然,看再多教程,不如親自動手寫一段代碼。大家不妨都自己發一封郵件試一試。
在公眾號(crossincode)中回復『email』,可以獲取實例代碼。
其他文章及回答:
Python 與 Excel 不得不說的事 - Crossin的編程教室 - 知乎專欄
Python-Excel 模塊哪家強?- Crossin的編程教室 - 知乎專欄
爆款游戲《貪吃蛇大作戰》的 Python 實現 - Crossin的編程教室 - 知乎專欄
NBA 舉辦編程馬拉松 - 數據分析時代的到來 - Crossin的文章 - 知乎專欄
想用 Python 做數據分析?先玩玩這個再說 - Crossin的文章 - 知乎專欄
用 Python 實現你的量化交易策略 - Crossin的文章 - 知乎專欄
學習編程的過程中可能會走哪些彎路,有哪些經驗可以參考? - Crossin 的回答
你是如何自學 Python 的? - Crossin 的回答
Python 抓取網頁亂碼原因分析 - Crossin的編程教室 - 知乎專欄
Crossin的編程教室
微信ID:crossincode
論壇:Crossin的編程教室
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42016.html
摘要:程序人員對于郵件自動化的日常需求還是很高的。更是自帶一套模塊實現郵件發送。正是為了實現這個而生的,一句話就可以完成所有的登錄發送文字附件等功能。參考一句話發送郵件正常一點的發送郵件 程序人員對于郵件自動化的日常需求還是很高的。但是入過了Linux的命令行郵件客戶端如Sendmail, Mutt, Alpine等坑之后,發現現代其實很少人真的在用它們實現郵件自動化,根據搜索引擎里相關文章...
摘要:使用實現網頁截屏查庫發郵件的。本是用于發周報郵件的,周報內容包括數據庫中的記錄以及網頁指定元素的截屏。用于網頁截屏,用于傳遞參數。注意其中使用截取中為的元素的操作。 使用python(2.7)實現網頁截屏、查庫、發郵件的demo。用到了selenium、phantomjs、mailer、jinja2、mysqldb還有image,都是比較典型的用法,可復用性比較強,記錄分享一下。 本d...
摘要:一般郵箱中,進入設置,然后設置,打開服務就可以設置授權碼了。參數是收件人郵箱給多個目標發郵件只需創建一個列表,將郵箱放在列表中即可是主題是郵箱正文是附件傳入文件路徑 Python 發送郵件 網上其實是有關于python發郵件的教程的,主要用的都是smtplib庫,雖然也不復雜,但是并沒有今天要介紹的方法簡單! 今天要介紹的重點對象——yagmail庫 話不多說,先看例子: im...
摘要:定時給講笑話大四的生活就是這么無聊,我琢磨著也學了這么多東西了,為啥不能用自己的知識來給生活找點樂子呢我想反正每天都要給問候一聲早安,為何不同時講個笑話呢如果能寫個程序每天早上定時給發一條問候早安同時講一個笑話的短信該多好。 定時給Ta講笑話 大四的生活就是這么無聊,我琢磨著也學了這么多東西了,為啥不能用自己的知識來給生活找點樂子呢?我想反正每天都要給Ta問候一聲早安,為何不同時講個笑...
閱讀 2216·2021-09-07 09:58
閱讀 3391·2019-08-30 14:07
閱讀 1305·2019-08-29 12:32
閱讀 667·2019-08-29 11:06
閱讀 3692·2019-08-26 18:18
閱讀 3731·2019-08-26 17:35
閱讀 1381·2019-08-26 11:35
閱讀 611·2019-08-26 11:35