1.?????環境
操作系統 | Win10 |
---|---|
IDE | PyCharm Community 2018.1 |
Python | 3.5 |
2.?????設置QQ郵箱
????QQ郵箱是SSL認證的郵箱系統,要用QQ郵箱發送郵件,需要開啟POP3/ SMTP服務,并獲取授權碼。
2.1??開啟POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務
? ? 1) ?打開QQ郵箱,點擊【設置】
? ? 2)在【賬戶】tab頁,找到【POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務】,點擊【開啟】POP3/SMTP服務
2.1??QQ號申請第二代密碼保護
????如果QQ號還沒申請第二代密碼保護,則會彈出【驗證保密】對話框
?? ? 1)在【驗證保密】對話框中,點擊【申請密?!堪粹o
? ? 2) ?彈出【QQ安全中心】頁面,點擊【密保手機】右邊的【設置】按鈕
? ? 3) ?輸入手機號碼后,點擊【確定】按鈕,手機上會收到驗證碼
? ? 4)輸入手機上收到的驗證碼后,點擊【確定】按鈕
? ? 5) ?申請成功
2.3??繼續開啟POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務
????1) ?QQ號碼申請第二代密保成功后,點擊【驗證密?!繉υ捒蛑械摹疚乙呀浲瓿稍O置】按鈕
? ? 2) ?用手機往1069070069發送內容為【配置郵件客戶端】的短信后,點擊【我已發送】按鈕
?3) ?彈出【開啟POP3/SMTP】對話框,其中的虛線框中就是授權碼
2.4??獲取授權碼
????如果之前已經開啟了POP3/SMTP服務,而已經忘了之前申請的授權碼的話,可以點擊下圖中的【生成授權碼】鏈接。
可以重新發送短信獲取授權碼。試了一下,舊授權碼和新授權碼都可以用。
3.?????代碼
????前面已經提到過,QQ郵箱是SSL認證的郵箱系統,因此用QQ郵箱發送郵件,需要創建一個SMTP_SSL對象,而不是SMTP對象,然后用發送郵箱及之前獲取到的授權碼login,最后調用sendmail()發送郵件。
import smtplibsmtpserver = "smtp.qq.com"smtpport = 465from_mail = "aaaaa@qq.com"to_mail = ["bbbbb@qq.com"]password = "****************" # 16位授權碼try:????smtp = smtplib.SMTP_SSL(smtpserver,smtpport)????smtp.login(from_mail,password)????smtp.sendmail(from_mail,to_mail,msg.as_string())except(smtplib.SMTPException) as e: print(e.message)finally: smtp.quit()
用try-except-finally括起來,是為了捕捉可能的錯誤信息。
?????這很簡單,但細心的讀者應該注意到,上面代碼中所有的方法的參數都有定義,唯獨sendmail(from_addr, to_addrs, msg)的第3個參數msg,即郵件的發送內容沒有定義,而發送郵件的關鍵就在于此。發送內容的格式是SMTP規定的,如果不符合規定,即會導致郵件發送失敗。?
????郵件主要包括三個部分:一是我稱之為屬性的部分,二是正文,三是附件。包含各部分內容的是一個MIMEMultipart對象,其實郵件的任何部分都是可以為空的,甚至都為空,還是可以成功發送的。下面主要討論的就是這三部分內容的組織。
3.1??組織郵件屬性
????郵件的屬性,我指的是諸如發件人、主題、收件人、抄送等。
from email.mime.multipart import MIMEMultipartfrom email.header import Headersubject = "test report"from_name = "水云之外"from_mail = "aaaaaa@qq.com"to_mail = ["bbbbbb@qq.com"]cc_mail = ["cccccc@qq.com"]msg = MIMEMultipart()msg["Subject"] = Header(subject, "utf-8")msg["From"] = Header(from_name + " <" + from_mail + ">", "utf-8")msg["To"] = Header(",".join(to_mail), "utf-8")msg["Cc"] = Header(",".join(cc_mail), "utf-8")
3.2??組織郵件正文
3.2.1???文本格式正文
????用正文字符串生成一個plain類型的MIMEText對象,可指定編碼,然后黏貼到代表郵件全部內容的MIMEMultipart對象中。
from email.mime.multipart import MIMEMultipartfrom email.mime.text import MIMETextbody = "hi, the attachment is the test report of this test, please check it in time."msg = MIMEMultipart()msgtext = MIMEText(body, "plain", "utf-8")msg.attach(msgtext)
3.2.2???HTML格式正文
????HTML格式的正文和文本格式的正文,唯一區別就是MIMEText對象的類型不同,是html,當然正文字符串應該是一個符合html格式的字符串。
from email.mime.multipart import MIMEMultipartfrom email.mime.text import MIMETextbody = "<h3>hi, the attachment is the test report of this test, please check it in time.</h3>"msg = MIMEMultipart()msgtext = MIMEText(body, "html", "utf-8")msg.attach(msgtext)
3.2.3???包含圖片的正文
????包含圖片的正文,其實是一種特殊的html格式正文,正文字符串應符合html格式,且包含img標簽,指定src,用讀入圖片文件創建一個MIMEImage對象,指定其屬性,應和src中相匹配,最后將MIMEImage對象也黏貼到MIMEMultipart對象中。
from email.mime.multipart import MIMEMultipartfrom email.mime.text import MIMETextfrom email.mime.image import MIMEImageimgbody = '''<h3>hi, the attachment is the test report of this test, please check it in time.</h3><img src="cid:image1"/>'''imgfile = r"..testresult.png"msg = MIMEMultipart()msgtext = MIMEText(imgbody, "html", "utf-8")msg.attach(msgtext)file = open(imgfile, "rb")img = MIMEImage(file.read())img.add_header("Content-ID", "<image1>")msg.attach(img)
3.3??組織郵件附件
????經驗證,文本文件、HTML文件和圖片文件(png),都可以用下面的代碼組裝到郵件內容中。生成一個MIMEBase對象,讀入附件文件加載到該對象中,編碼、添加頭后同樣黏貼到MIMEMultipart對象中。
from email.mime.multipart import MIMEMultipartfrom email.mime.base import MIMEBaseattfile = r"..testresult.html"msg = MIMEMultipart()att = MIMEBase("application", "octet-stream")file = open(file, "rb")att.set_payload(file.read())encoders.encode_base64(att)list = file.split("\")filename = list[len(list) - 1]att.add_header("Content-Disposition", "attachment; filename='%s'" %filename)msg.attach(att)
4.?????最終代碼
4.1??MailAssembler類
????包含三個方法:attachAttributes()、attachBody()和attachAttachment(),分別用來組裝屬性、正文和附件。
from email.header import Headerfrom email.mime.base import MIMEBasefrom email.mime.text import MIMETextfrom email.mime.image import MIMEImagefrom email import encodersclass MailAssembler: def attachAttributes(self,msg,subject,from_name,from_mail,to_mail,cc_mail=None): msg["Subject"] = Header(subject, "utf-8") msg["From"] = Header(from_name + " <" + from_mail + ">", "utf-8") msg["To"] = Header(",".join(to_mail), "utf-8") msg["Cc"] = Header(",".join(cc_mail), "utf-8") def attachBody(self,msg,body,type,imgfile=None): msgtext = MIMEText(body, type, "utf-8") msg.attach(msgtext) if imgfile != None: try: file = open(imgfile, "rb") img = MIMEImage(file.read()) img.add_header("Content-ID", "<image1>") msg.attach(img) except(Exception) as err: print(str(err)) finally: if file in locals(): file.close() def attachAttachment(self,msg,attfile): att = MIMEBase("application", "octet-stream") try: file = open(attfile, "rb") att.set_payload(file.read()) encoders.encode_base64(att) except(Exception) as err: print(str(err)) finally: if file in locals(): file.close() if "\" in attfile: list = attfile.split("\") filename = list[len(list) - 1] else: filename = attfile att.add_header("Content-Disposition", "attachment; filename='%s'" %filename) msg.attach(att)
4.2??MailSender類
????只有一個sendMail()方法,初始化的時候保存了發送的相關參數,之后就可以用該方法發送其參數msg了。
import smtplibclass MailSender: def __init__(self,smtpserver,smtpport,password,from_mail,to_mail,cc_mail=None): self.smtpserver = smtpserver self.smtpport = smtpport self.password = password self.from_mail = from_mail self.to_mail = to_mail self.cc_mail = cc_mail def sendMail(self,msg): try: smtp = smtplib.SMTP_SSL(self.smtpserver, self.smtpport) smtp.login(self.from_mail, self.password) if self.cc_mail == None: smtp.sendmail(self.from_mail, self.to_mail, msg.as_string()) else: smtp.sendmail(self.from_mail, self.to_mail+self.cc_mail, msg.as_string()) print("successful") except(smtplib.SMTPRecipientsRefused): print("Recipient refused") except(smtplib.SMTPAuthenticationError): print("Auth error") except(smtplib.SMTPSenderRefused): print("Sender refused") except(smtplib.SMTPException) as e: print(e.message) finally: smtp.quit()
4.3??主程序
????在主程序中,調用了MailAssembler和MailSender的方法,完成郵件內容的組裝和發送。郵件正文包含文字和圖片,并有兩個附件。
from email.mime.multipart import MIMEMultipartfrom src.MailContent import MailAssemblerfrom src.MailSender import MailSendersubject = "test report"from_name = "水云之外"from_mail = "aaaaaa@qq.com"to_mail = ["bbbbbb@qq.com"]cc_mail = ["cccccc@qq.com"]imgbody = '''<h3>hi, the attachment is the test report of this test, please check it in time.</h3><img src="cid:image1"/>'''file1 = r"..testresult.html"file2 = r"..testresult.txt"imgfile = r"..testresult.png"smtpserver = "smtp.qq.com"smtpport = 465password = "****************" # 授權碼msg = MIMEMultipart()assembler = MailAssembler()sender = MailSender(smtpserver,smtpport,password,from_mail,to_mail,cc_mail)assembler.attachAttributes(msg,subject,from_name,from_mail,to_mail,cc_mail)assembler.attachBody(msg,imgbody,"html",imgfile)assembler.attachAttachment(msg,file1)assembler.attachAttachment(msg,file2)sender.sendMail(msg)
5.?????參考文獻
[1] 使用python發送QQ郵件??https://www.cnblogs.com/lovealways/p/6701662.html
[2] Python發送郵件(常見四種郵件內容)https://blog.csdn.net/xiaosongbk/article/details/60142996
[3] Selenium3+python3-發送添加附件的郵件??https://www.cnblogs.com/liyanqi/p/7885014.html
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
超人電熨斗使用方法?裝滿水,插上電源,打開開關,從頭頂往下燙。新款超人電熨斗怎么用?蒸汽熨斗的正確使用方法熨斗作為一種立式家用電器,使用頻率很高,但是在使用熨斗時你最好注意以下幾個方面:1。為了避免水垢,盡量倒涼開水。2.根據不同的衣物材料選擇合適的溫度。如果不知道衣服的布料,可以試著在穿衣時看不到的地方熨燙,從低溫開始逐漸升高。3.等到水溫達到調節好的溫度,再開始熨燙,否則水就會從底板漏出。請注...
北京國家會議中心在什么地方?公交路線:地鐵4號線大興線地鐵2號線地鐵8號線,全程約23.4公里。1.從公益西橋乘坐地鐵4號線大興線,經過6站到達宣武門站。2.乘坐地鐵2號線,經過7站,到達鼓樓街站。3.乘坐地鐵8號線,經過4站,到達奧林匹克公園站(E出口)。4.步行約440米至國家會議中心。北京國家會議中心在什么地方?我想參加CP05伴侶節…但是不知道國家會議中心在哪里?地鐵可以直達嗎?我住的地方...
碧歐泉護膚品效果怎么樣?碧歐泉護膚品效果不錯。碧歐泉是歐萊雅集團旗下的高級護膚品牌。其所有產品都含有獨特的礦泉活細胞因子生命浮游生物?活精,這也是他們的核心組成部分。碧歐泉補水很好,性價比還是很高的。歐碧泉好用嗎?蘭蔻的護膚品都是針對中年人的皮膚問題,適合年輕人的卻很少。但是,你可以放心使用他的化妝品。顏色時尚而輕盈,尤其是高睫毛絕對是NO1。全球首款高睫毛由蘭蔻生產。我們同歲。試過很多化妝品,我...