摘要:的提供了一種很方便的途徑發(fā)送電子郵件,它對(duì)協(xié)議進(jìn)行了簡單的封裝。其中負(fù)責(zé)構(gòu)造郵件,則負(fù)責(zé)發(fā)送郵件。可能還不止一個(gè)發(fā)送郵件的主題。
如何使用Python將生成的測(cè)試報(bào)告以郵件附件的形式進(jìn)行發(fā)送呢?
一、概要SMTP(Simple Mail Transfer Protocol)即簡單郵件傳輸協(xié)議,它是一組用于由源地址到目的地址傳送郵件的規(guī)則,由它來控制信件的中轉(zhuǎn)方式。
python的smtplib提供了一種很方便的途徑發(fā)送電子郵件,它對(duì)smtp協(xié)議進(jìn)行了簡單的封裝。
Python對(duì)SMTP支持有smtplib和email兩個(gè)模塊。其中email負(fù)責(zé)構(gòu)造郵件,smtplib則負(fù)責(zé)發(fā)送郵件。
來理一理Python發(fā)送一個(gè)未知MIME類型的文件附件基本思路:
0、前提:導(dǎo)入郵件發(fā)送模塊 from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart import smtplib 1、構(gòu)造MIMEMultipart對(duì)象作為根容器 2、構(gòu)造MIMEText對(duì)象作為郵件顯示內(nèi)容并附加到根容器 a、讀入文件內(nèi)容并格式化 b、設(shè)置附件頭 3、設(shè)置根容器屬性 4、得到格式化后的完整文本 5、用smtp發(fā)送郵件 6、封裝成sendEmail類。二、郵件發(fā)送要素
同時(shí)想想我們要發(fā)送郵件的幾個(gè)要素:
1、服務(wù)器。以QQ郵箱舉例,則為smtp.qq.com 2、端口號(hào)。有465和587,請(qǐng)使用587 3、發(fā)送者。 4、密碼。密碼總不能直接寫在文件里吧?哈哈,這里需要使用qq郵箱獲取授權(quán)碼。 5、收件人。(可能還不止一個(gè)) 6、發(fā)送郵件的主題subject。 7、郵件文本內(nèi)容。 8、附件。
因?yàn)橹皩戇^如何讀取.ini配置文件,所以此部分,將發(fā)送郵件的一些要素放在了配置文件中,配置文件如下:
對(duì)應(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()郵件根容器對(duì)象后,需要借助根容器來定義郵件的各個(gè)要素,比如郵件主題subject、發(fā)送人from、接收人to、郵件正文body、郵件附件等。
如何給郵件定主題、收發(fā)人呢?# 構(gòu)建根容器 msg = MIMEMultipart() # 郵件主題、發(fā)送人、收件人、內(nèi)容,此部分可以來自配置文件,也可以直接填入 msg["Subject"] = self.mail_subject # u"自動(dòng)化測(cè)試報(bào)告" msg["from"] = self.mail_sender msg["to"] = self.mail_pwd如何定義郵件正文body部分呢?
# 郵件正文部分body,1、可以用HTML自己自定義body內(nèi)容;2、讀取其他文件的內(nèi)容為body # body = "您好,如何給郵件添加附件呢?這里是使用Python登錄郵箱,并發(fā)送附件的測(cè)試
" 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會(huì)話,保證郵件安全發(fā)送不被竊聽的。
在創(chuàng)建完SMTP對(duì)象后,立刻調(diào)用starttls()方法即可。
其實(shí)整個(gè)下來郵件發(fā)送模塊也就完成了。
在這個(gè)過程中有遇見幾個(gè)問題,也貼上來跟大家一起分享一下。
拋錯(cuò)535
拋錯(cuò):smtplib.SMTPAuthenticationError: (535, b"Error: xc7xebxcaxb9xd3xc3xcaxdaxc8xa8xc2xebxb5xc7xc2xbcxa1xa3xcfxeaxc7xe9xc7xebxbfxb4: http://service.mail.qq.com/cg...")
解決辦法:點(diǎn)擊最后的鏈接,其實(shí)是因?yàn)槭跈?quán)碼問題
替換授權(quán)碼后繼續(xù)報(bào)錯(cuò),535
解決辦法:替換端口。因?yàn)閝q郵箱ssl協(xié)議端口有兩個(gè):465/587。
報(bào)錯(cuò):smtplib.SMTPAuthenticationError: (530, b"Must issue a STARTTLS command first.")
解決方法:在login()之前,添加一句:smtp.starttls()
下面貼上整個(gè)文件,這個(gè)文件是依賴于其他文件的的,所以僅供參考,但是方法是一樣的。
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ā)送附件的測(cè)試
" 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"自動(dòng)化測(cè)試報(bào)告" 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"自動(dòng)化測(cè)試報(bào)告" 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 --- ")
如果覺得文章有丟丟用處,動(dòng)動(dòng)小指,點(diǎn)個(gè)贊吧!
如果哪里寫的有問題,或者有更好的方式,cue我一下
? thanks for watching, keep on updating...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/42530.html
摘要:也就是說用戶先將郵件投遞到騰訊的服務(wù)器這個(gè)過程就使用了協(xié)議,然后騰訊的服務(wù)器將郵件投遞到網(wǎng)易的服務(wù)器這個(gè)過程也依然使用了協(xié)議,服務(wù)器就是用來收郵件。 郵件發(fā)送其實(shí)是一個(gè)非常常見的需求,用戶注冊(cè),找回密碼等地方,都會(huì)用到,使用 JavaSE 代碼發(fā)送郵件,步驟還是挺繁瑣的,Spring Boot 中對(duì)于郵件發(fā)送,提供了相關(guān)的自動(dòng)化配置類,使得郵件發(fā)送變得非常容易,本文我們就來一探究竟!看...
摘要:自動(dòng)發(fā)送郵件我們把報(bào)表做出來以后一般都是需要發(fā)給別人查看,對(duì)于一些每天需要發(fā)的報(bào)表或者是需要一次發(fā)送多份的報(bào)表,這個(gè)時(shí)候可以考慮借助來自動(dòng)發(fā)送郵件。一份郵件的組成下圖是中發(fā)送一份郵件的界面,主要包含發(fā)件人收件人抄送人主題正文附件這幾部分。 ...
摘要:程序人員對(duì)于郵件自動(dòng)化的日常需求還是很高的。更是自帶一套模塊實(shí)現(xiàn)郵件發(fā)送。正是為了實(shí)現(xiàn)這個(gè)而生的,一句話就可以完成所有的登錄發(fā)送文字附件等功能。參考一句話發(fā)送郵件正常一點(diǎn)的發(fā)送郵件 程序人員對(duì)于郵件自動(dòng)化的日常需求還是很高的。但是入過了Linux的命令行郵件客戶端如Sendmail, Mutt, Alpine等坑之后,發(fā)現(xiàn)現(xiàn)代其實(shí)很少人真的在用它們實(shí)現(xiàn)郵件自動(dòng)化,根據(jù)搜索引擎里相關(guān)文章...
摘要:網(wǎng)上也有不少人反饋用手機(jī)客戶端無法使用新浪郵箱發(fā)送郵件,隨后我嘗試用登錄新浪郵箱,也出現(xiàn)只能接收郵件而不能發(fā)送郵件的情況。三附錄錯(cuò)誤碼及建議解決方法發(fā)送郵件成功卻收不到郵件或收到郵件無主題無收件人亂碼新浪郵箱誠信平臺(tái) 前言 ??JavaMail的使用本身并不難,網(wǎng)上有不少案例,簡單易懂,而且有詳細(xì)的中文注解。但是由于JavaMail的機(jī)制設(shè)置不夠完善,特別是異常出錯(cuò)時(shí)的參考信息太少,給...
閱讀 3308·2021-09-30 09:54
閱讀 3804·2021-09-22 15:01
閱讀 3110·2021-08-27 16:19
閱讀 2578·2019-08-29 18:39
閱讀 2164·2019-08-29 14:09
閱讀 634·2019-08-26 10:23
閱讀 1343·2019-08-23 12:01
閱讀 1873·2019-08-22 13:57