无法用php smtp发送邮件. 您的服务器可能没有配置用此方法_Web自动化测试:邮件发送测试报告...
在我們運(yùn)行完整個(gè)項(xiàng)目后,已經(jīng)生成了 測(cè)試報(bào)告,一般自動(dòng)化會(huì)在本地或者公司服務(wù)器上運(yùn)行,那如何獲取自動(dòng)化測(cè)試的運(yùn)行結(jié)果呢,此時(shí)就需要把測(cè)試結(jié)果以郵件的形式發(fā)送到郵箱,這樣就可以在測(cè)試完成的第一時(shí)間知道測(cè)試結(jié)果。
所以我們需要來學(xué)習(xí)一下如果使用python第三方庫來發(fā)送郵件。
其實(shí)關(guān)于發(fā)送郵件的方法,復(fù)制粘貼過來,修改下參數(shù)、賬號(hào)、密碼后,直接使用就可以了,再把數(shù)據(jù)寫到配置中參數(shù)化基本就搞定。
一、發(fā)送郵件的步驟
關(guān)于發(fā)送郵件,步驟有三步:定義配置信息、定義郵件內(nèi)容、發(fā)送郵件
第一步:定義配置信息
這一步將所有需要用到的:郵箱服務(wù)器地址、郵箱端口、郵箱賬號(hào)、密碼等信息先列出來,可以在方法中直接賦值,也可以放到config配置文件中,讀取后賦值。
# 接收郵箱 receiver = "***@****.com"# 發(fā)送郵件服務(wù)器 smtp_server = "smtp.***.com" port = "25"# 發(fā)送郵箱賬號(hào)和密碼(或者授權(quán)碼) username = "***@***.com" password = "****"第二步:定義郵件內(nèi)容
郵件內(nèi)容,我通過文件路徑來讀取html格式的文件,從而獲取到郵件的內(nèi)容。然后設(shè)置郵件的標(biāo)題、發(fā)送方、收件方、正文內(nèi)容、附件格式、附件內(nèi)容等。
# 讀取測(cè)試報(bào)告文件(report_file:測(cè)試報(bào)告文件路徑) mail_body = open(report_file, "r", encoding="utf-8").read() # 定義郵件內(nèi)容 msg = MIMEMultipart() body = MIMEText(mail_body, _subtype='html', _charset='utf-8') msg['Subject'] = u"自動(dòng)化測(cè)試報(bào)告" msg['from'] = username msg['to'] = receiver msg["date"] = time.strftime('%a, %d %b %Y %H:%M:%S %z') msg.attach(body) # 定義附件內(nèi)容 att = MIMEText(mail_body, "base64", "utf-8") att["Content-Type"] = "application/octet-stream" att["Content-Disposition"] = 'attachment; filename= "report.html"' msg.attach(att)第三步:發(fā)送郵件
確定好郵件內(nèi)容后,需要發(fā)送郵件了,不同的加密方式發(fā)送方法會(huì)有些不同,這個(gè)在下文具體探討下。
# 連接郵箱服務(wù)器 smtp = smtplib.SMTP() smtp.connect(host=smtp_server, port=port) # tls加密方式 smtp.ehlo() smtp.starttls() smtp.ehlo() # 登錄郵箱 smtp.login(username, password) # 發(fā)送郵件 smtp.sendmail(username, receiver, msg.as_string()) # 斷開連接 smtp.quit()二、發(fā)送郵件的注意事項(xiàng)
我在研究了發(fā)送郵件后,發(fā)現(xiàn)不同情況下,發(fā)送郵件的方式也有不同之處,這里整理如下:
2.1使用不同郵件發(fā)送方
目前我嘗試過使用163郵箱、qq郵箱、zimbra郵箱進(jìn)行發(fā)送郵件,每個(gè)郵箱設(shè)置不同,每個(gè)郵箱也沒有全面測(cè)試所支持的發(fā)送類型,這里大概講下我對(duì)每個(gè)郵箱的感受吧,不作為參考。其中:
163郵箱比較簡(jiǎn)單,我只設(shè)置了服務(wù)地址,在connect連接后直接可以登錄發(fā)送(可能和我163郵箱設(shè)置有關(guān))
qq郵箱需要設(shè)置一個(gè)授權(quán)碼,然后使用授權(quán)碼來進(jìn)行連接登錄
zimbra郵箱是公司部署的一個(gè)郵箱系統(tǒng),沒有授權(quán)碼,但是需要加密進(jìn)行登錄。
郵箱賬戶開啟第三方發(fā)送功能:
163郵箱:在設(shè)置菜單中,選擇POP3/SMTP/IMAP選項(xiàng),設(shè)置開啟SMTP發(fā)送功能。
Qq郵箱:在設(shè)置-賬戶中,設(shè)置開啟SMTP發(fā)送功能
2.2不同加密方式的登錄
這里我整理的幾種加密方式,有明文不加密、ssl、tls這三種方式,不同的加密方式有不同的登錄方法。
明文不加密:
默認(rèn)使用smtp的端口(默認(rèn)值25)具體端口值以郵箱設(shè)置為準(zhǔn)。
# 連接郵箱服務(wù)器 smtp = smtplib.SMTP() smtp.connect(host=smtp_server, port='25') # 登錄郵箱 smtp.login(username, password)ssl加密方式:
默認(rèn)使用ssl端口(默認(rèn)值465)具體端口值以郵箱設(shè)置為準(zhǔn)。
# 連接郵箱服務(wù)器 smtp = smtplib.SMTP_SSL() smtp.connect(host=smtp_server, port='465') # 登錄郵箱 smtp.login(username, password)tls加密方式:
默認(rèn)使用smtp的端口(默認(rèn)值25)具體端口值以郵箱設(shè)置為準(zhǔn)。
# 連接郵箱服務(wù)器 smtp = smtplib.SMTP() smtp.connect(host=smtp_server, port='25') # tls加密 smtp.ehlo() smtp.starttls() smtp.ehlo() # 登錄郵箱 smtp.login(username, password)2.3無法發(fā)送時(shí)如何檢查
當(dāng)遇到無法發(fā)送郵件時(shí),根據(jù)我踩過的坑,來給出幾點(diǎn)建議吧。
1.確定郵箱已經(jīng)開啟smtp功能,并且確定是否開啟授權(quán)碼登錄,如果開啟則需要使用授權(quán)碼登錄。
2.確定郵箱端口port值是否正確,是465、587、25,或者郵箱系統(tǒng)定義的其他端口
3.確定郵箱支持的加密方式,以及不同加密方式對(duì)應(yīng)的端口值正確與否。
三、代碼實(shí)例
這里根據(jù)項(xiàng)目,我創(chuàng)建了send_mail.py的文件,在里面除了發(fā)送郵件的方法,根據(jù)項(xiàng)目結(jié)構(gòu)加入了一個(gè)查找report報(bào)告文件夾最后生成文件的方法,并且獲取到文件路徑后,作為要發(fā)送的內(nèi)容:
send_mail.py
# -*- coding: UTF-8 -*- import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart import time import osdef find_report_name():"""查找最后生成的報(bào)告文件的路徑"""result_dir = os.path.abspath('..') + "report"lists = os.listdir(result_dir)lists.sort(key=lambda fn: os.path.getmtime(result_dir + "" + fn))file_name = os.path.join(result_dir, lists[-1])return file_namedef send_email(report_file):"""發(fā)送郵件方法"""try:# 配置郵件信息# 接收郵箱receiver = "***@***.com"# 發(fā)送郵件服務(wù)器smtp_server = "smtp.***.com"port = "25"# 發(fā)送郵箱賬號(hào)和密碼(授權(quán)碼)username = "***@***.com"password = "***"# 讀取測(cè)試報(bào)告文件mail_body = open(report_file, "r", encoding="utf-8").read()# 定義郵件內(nèi)容msg = MIMEMultipart()body = MIMEText(mail_body, _subtype='html', _charset='utf-8')msg['Subject'] = u"自動(dòng)化測(cè)試報(bào)告"msg['from'] = usernamemsg['to'] = receivermsg["date"] = time.strftime('%a, %d %b %Y %H:%M:%S %z')msg.attach(body)# 定義附件內(nèi)容att = MIMEText(mail_body, "base64", "utf-8")att["Content-Type"] = "application/octet-stream"att["Content-Disposition"] = 'attachment; filename= "report.html"' msg.attach(att)# 連接郵箱服務(wù)器smtp = smtplib.SMTP()smtp.connect(host=smtp_server, port=port)# tls加密方式smtp.ehlo()smtp.starttls()smtp.ehlo()# 登錄郵箱smtp.login(username, password)# 發(fā)送郵件smtp.sendmail(username, receiver, msg.as_string())# 斷開連接smtp.quit()print("%s 發(fā)送成功,查收%s郵箱" % (username, receiver))except Exception as e:print(e)def send_report():"""發(fā)送測(cè)試報(bào)告"""send_email(find_report_name())總結(jié)
以上是生活随笔為你收集整理的无法用php smtp发送邮件. 您的服务器可能没有配置用此方法_Web自动化测试:邮件发送测试报告...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自己写网络小说(自己写小说的网站)
- 下一篇: python global 变量_pyt