摘要:的提供了一種很方便的途徑發(fā)送電子郵件,它對協(xié)議進行了簡單的封裝。其中負責(zé)構(gòu)造郵件,則負責(zé)發(fā)送郵件??赡苓€不止一個發(fā)送郵件的主題。
如何使用Python將生成的測試報告以郵件附件的形式進行發(fā)送呢?
一、概要SMTP(Simple Mail Transfer Protocol)即簡單郵件傳輸協(xié)議,它是一組用于由源地址到目的地址傳送郵件的規(guī)則,由它來控制信件的中轉(zhuǎn)方式。
python的smtplib提供了一種很方便的途徑發(fā)送電子郵件,它對smtp協(xié)議進行了簡單的封裝。
Python對SMTP支持有smtplib和email兩個模塊。其中email負責(zé)構(gòu)造郵件,smtplib則負責(zé)發(fā)送郵件。
來理一理Python發(fā)送一個未知MIME類型的文件附件基本思路:
0、前提:導(dǎo)入郵件發(fā)送模塊 from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart import smtplib 1、構(gòu)造MIMEMultipart對象作為根容器 2、構(gòu)造MIMEText對象作為郵件顯示內(nèi)容并附加到根容器 a、讀入文件內(nèi)容并格式化 b、設(shè)置附件頭 3、設(shè)置根容器屬性 4、得到格式化后的完整文本 5、用smtp發(fā)送郵件 6、封裝成sendEmail類。二、郵件發(fā)送要素
同時想想我們要發(fā)送郵件的幾個要素:
1、服務(wù)器。以QQ郵箱舉例,則為smtp.qq.com 2、端口號。有465和587,請使用587 3、發(fā)送者。 4、密碼。密碼總不能直接寫在文件里吧?哈哈,這里需要使用qq郵箱獲取授權(quán)碼。 5、收件人。(可能還不止一個) 6、發(fā)送郵件的主題subject。 7、郵件文本內(nèi)容。 8、附件。
因為之前寫過如何讀取.ini配置文件,所以此部分,將發(fā)送郵件的一些要素放在了配置文件中,配置文件如下:
對應(yīng)讀取配置文件腳本為:(readConfig.py部分)
import os import configparser # config cur_path = os.path.dirname(os.path.relpath(__file__)) configPath = os.path.join(cur_path,"config.ini") conf = configparser.ConfigParser() conf.read(configPath) def get_smtpServer(smtpServer): smtp_server = conf.get("email",smtpServer) return smtp_server # ......三、郵件部分
構(gòu)建MIMEMultipart()郵件根容器對象后,需要借助根容器來定義郵件的各個要素,比如郵件主題subject、發(fā)送人from、接收人to、郵件正文body、郵件附件等。
如何給郵件定主題、收發(fā)人呢?# 構(gòu)建根容器 msg = MIMEMultipart() # 郵件主題、發(fā)送人、收件人、內(nèi)容,此部分可以來自配置文件,也可以直接填入 msg["Subject"] = self.mail_subject # u"自動化測試報告" msg["from"] = self.mail_sender msg["to"] = self.mail_pwd如何定義郵件正文body部分呢?
# 郵件正文部分body,1、可以用HTML自己自定義body內(nèi)容;2、讀取其他文件的內(nèi)容為body # body = "您好,如何給郵件添加附件呢?這里是使用Python登錄郵箱,并發(fā)送附件的測試
" with open(reportFile,"r",encoding="UTF-8") as f: body = f.read() msg.attach(MIMEText(_text=body, _subtype="html", _charset="utf-8")) # _charset 是指Content_type的類型
# 添加附件 attachment = MIMEText(_text=open(reportFile, "rb").read(), _subtype="base64",_charset= "utf-8") attachment["Content-Type"] = "application/octet-stream" attachment["Content-Disposition"] = "attachment;filename = "result.html"" msg.attach(attachment)如何發(fā)送?
發(fā)送四部曲:取得服務(wù)器連接、再登錄郵箱、發(fā)送郵件、退出。
大致如下啦:
try: smtp = smtplib.SMTP_SSL(host=self.mail_smtpserver, port=self.mail_port) # 繼承自SMTP except: smtp = smtplib.SMTP() smtp.connect(self.mail_smtpserver, self.mail_port) # smtp.set_debuglevel(1) # 創(chuàng)建安全連接,加密SMTP smtp.starttls() # Puts the connection to the SMTP server into TLS mode. # 用戶名和密碼 smtp.login(user=self.mail_sender, password=self.mail_pwd) # 函數(shù):sendmail(self, from_addr, to_addrs, msg, mail_options=[],rcpt_options=[]): smtp.sendmail(self.mail_sender, self.mail_receiverList, msg.as_string()) smtp.quit()
在里面添加了一句smtp.starttls()。這一句是用來加密SMTP會話,保證郵件安全發(fā)送不被竊聽的。
在創(chuàng)建完SMTP對象后,立刻調(diào)用starttls()方法即可。
其實整個下來郵件發(fā)送模塊也就完成了。
在這個過程中有遇見幾個問題,也貼上來跟大家一起分享一下。
拋錯535
拋錯:smtplib.SMTPAuthenticationError: (535, b"Error: xc7xebxcaxb9xd3xc3xcaxdaxc8xa8xc2xebxb5xc7xc2xbcxa1xa3xcfxeaxc7xe9xc7xebxbfxb4: http://service.mail.qq.com/cg...")
解決辦法:點擊最后的鏈接,其實是因為授權(quán)碼問題
替換授權(quán)碼后繼續(xù)報錯,535
解決辦法:替換端口。因為qq郵箱ssl協(xié)議端口有兩個:465/587。
報錯:smtplib.SMTPAuthenticationError: (530, b"Must issue a STARTTLS command first.")
解決方法:在login()之前,添加一句:smtp.starttls()
下面貼上整個文件,這個文件是依賴于其他文件的的,所以僅供參考,但是方法是一樣的。
import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.base import MIMEBase class SendEmail(object): """ 發(fā)送郵件模塊封裝,屬性均從config.ini文件獲得 """ def __init__(self, smtpServer, mailPort, mailSender, mailPwd, mailtoList, mailSubject): self.mail_smtpserver = smtpServer self.mail_port = mailPort self.mail_sender = mailSender self.mail_pwd = mailPwd # 接收郵件列表 self.mail_receiverList = mailtoList self.mail_subject = mailSubject # self.mail_content = mailContent def sendFile(self, reportFile): """ 發(fā)送各種類型的附件 """ # 構(gòu)建根容器 msg = MIMEMultipart() # 郵件正文部分body,1、可以用HTML自己自定義body內(nèi)容;2、讀取其他文件的內(nèi)容為body # body = "您好,這里是使用Python登錄郵箱,并發(fā)送附件的測試
" with open(reportFile,"r",encoding="UTF-8") as f: body = f.read() # _charset 是指Content_type的類型 msg.attach(MIMEText(_text=body, _subtype="html", _charset="utf-8")) # 郵件主題、發(fā)送人、收件人、內(nèi)容 msg["Subject"] = self.mail_subject # u"自動化測試報告" msg["from"] = self.mail_sender msg["to"] = self.mail_pwd # 添加附件 attachment = MIMEText(_text=open(reportFile, "rb").read(), _subtype="base64",_charset= "utf-8") attachment["Content-Type"] = "application/octet-stream" attachment["Content-Disposition"] = "attachment;filename = "result.html"" msg.attach(attachment) try: smtp = smtplib.SMTP_SSL(host=self.mail_smtpserver, port=self.mail_port) # 繼承自SMTP except: smtp = smtplib.SMTP() smtp.connect(self.mail_smtpserver, self.mail_port) # smtp.set_debuglevel(1) # 創(chuàng)建安全連接,加密SMTP smtp.starttls() # Puts the connection to the SMTP server into TLS mode. # 用戶名和密碼 smtp.login(user=self.mail_sender, password=self.mail_pwd) # 函數(shù):sendmail(self, from_addr, to_addrs, msg, mail_options=[],rcpt_options=[]): smtp.sendmail(self.mail_sender, self.mail_receiverList, msg.as_string()) smtp.quit() # 調(diào)試代碼 if __name__ == "__main__": mail_smtpserver = "smtp.qq.com" mail_port = 587 mail_sender = "@qq.com" mail_pwd = "" mail_receiverList = ["@qq.com", "@163.com"] mail_subject = u"自動化測試報告" s = SendEmail(mail_smtpserver, mail_port, mail_sender, mail_pwd, mail_receiverList, mail_subject) s.sendFile("F:Python_projectPythonLearnning_2018send_emailsendEmail_Test.html.tar.gz") print("--- test end --- ")
如果覺得文章有丟丟用處,動動小指,點個贊吧!
如果哪里寫的有問題,或者有更好的方式,cue我一下
? thanks for watching, keep on updating...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/42530.html
摘要:也就是說用戶先將郵件投遞到騰訊的服務(wù)器這個過程就使用了協(xié)議,然后騰訊的服務(wù)器將郵件投遞到網(wǎng)易的服務(wù)器這個過程也依然使用了協(xié)議,服務(wù)器就是用來收郵件。 郵件發(fā)送其實是一個非常常見的需求,用戶注冊,找回密碼等地方,都會用到,使用 JavaSE 代碼發(fā)送郵件,步驟還是挺繁瑣的,Spring Boot 中對于郵件發(fā)送,提供了相關(guān)的自動化配置類,使得郵件發(fā)送變得非常容易,本文我們就來一探究竟!看...
摘要:自動發(fā)送郵件我們把報表做出來以后一般都是需要發(fā)給別人查看,對于一些每天需要發(fā)的報表或者是需要一次發(fā)送多份的報表,這個時候可以考慮借助來自動發(fā)送郵件。一份郵件的組成下圖是中發(fā)送一份郵件的界面,主要包含發(fā)件人收件人抄送人主題正文附件這幾部分。 ...
摘要:程序人員對于郵件自動化的日常需求還是很高的。更是自帶一套模塊實現(xiàn)郵件發(fā)送。正是為了實現(xiàn)這個而生的,一句話就可以完成所有的登錄發(fā)送文字附件等功能。參考一句話發(fā)送郵件正常一點的發(fā)送郵件 程序人員對于郵件自動化的日常需求還是很高的。但是入過了Linux的命令行郵件客戶端如Sendmail, Mutt, Alpine等坑之后,發(fā)現(xiàn)現(xiàn)代其實很少人真的在用它們實現(xiàn)郵件自動化,根據(jù)搜索引擎里相關(guān)文章...
摘要:網(wǎng)上也有不少人反饋用手機客戶端無法使用新浪郵箱發(fā)送郵件,隨后我嘗試用登錄新浪郵箱,也出現(xiàn)只能接收郵件而不能發(fā)送郵件的情況。三附錄錯誤碼及建議解決方法發(fā)送郵件成功卻收不到郵件或收到郵件無主題無收件人亂碼新浪郵箱誠信平臺 前言 ??JavaMail的使用本身并不難,網(wǎng)上有不少案例,簡單易懂,而且有詳細的中文注解。但是由于JavaMail的機制設(shè)置不夠完善,特別是異常出錯時的參考信息太少,給...
閱讀 3300·2021-09-30 09:54
閱讀 3782·2021-09-22 15:01
閱讀 3105·2021-08-27 16:19
閱讀 2572·2019-08-29 18:39
閱讀 2146·2019-08-29 14:09
閱讀 623·2019-08-26 10:23
閱讀 1337·2019-08-23 12:01
閱讀 1862·2019-08-22 13:57