SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。
SMTP发送邮件Python对SMTP的支持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件。
Python创建SMTP对象的语法如下:
smtpObj=smtplib.SMTP([host [, port [, local_hostname]]])
语法中各个参数说明如下:
● host:SMTP服务器主机。可以指定主机的IP地址或域名(如www.baidu.com),是可选参数。
● port:如果提供了host参数,就需要指定SMTP服务使用的端口号。一般情况下,SMTP的端口号为25。
● local_hostname:如果SMTP在本地主机上,只需要指定服务器地址为localhost即可。
SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options]
语法中各个参数说明如下:
● from_addr:邮件发送者的地址。
● to_addrs:字符串列表,邮件发送地址。
● msg:发送消息。msg是字符串,表示邮件内容。我们知道邮件一般由标题、发信人、收件人、邮件内容、附件等构成,发送邮件时,要注意msg的格式。这个格式就是SMTP协议中定义的格式。
普通文本邮件发送的实现关键要将MIMEText中的_subtype设置为plain。首先导入smtplib和MIMEText。创建smtplib.smtp实例,连接邮件SMTP服务器,登录后发送,具体代码如下(send_email.py):
#! /usr/bin/python
# -*-coding:UTF-8-*-
import smtplib
from email.mime.textimport MIMEText
from email.headerimport Header
sender ='1510101@163.com'
pwd ='xxxxx' #开通邮箱服务后,设置的客户端授权密码
receivers = ['to@uzoo.cn']# 接收邮件,可设置为你的邮箱
# 三个参数:第一个为文本内容,第二个 plain 设置文本格式,第三个 utf-8 设置编码
message = MIMEText('Python 邮件发送测试...', 'plain', 'utf-8')
message['From'] = Header("邮件测试", 'utf-8')
message['To'] = Header("测试", 'utf-8')
subject ='Python SMTP 邮件测试'
message['Subject'] = Header(subject, 'utf-8')
try:
# 使用非本地服务器,需要建立SSL连接
smtpObj = smtplib.SMTP_SSL("smtp.163.com", 465)
smtpObj.login(sender, pwd)
smtpObj.sendmail(sender, receivers, message.as_string())
print("邮件发送成功")
except smtplib.SMTPExceptionas se:
print(f"Error: 无法发送邮件.Case:{se}")
发送HTML格式的邮件如果我们要发送的是HTML邮件,而不是普通的纯文本文件怎么办呢?方法很简单,在构造MIMEText对象时把HTML字符串传进去,再把第二个参数由plain变为html就可以了。代码实现如下(send_html_email.py):
#! /usr/bin/python
# -*-coding:UTF-8-*-
import smtplib
from email.mime.text import MIMEText
from email.header import Header
sender = '15101@163.com'
pwd = 'xxxxx' #开通邮箱服务后,设置的客户端授权密码
receivers = ['to@uzoo.cn'] # 接收邮件,可设置为你的邮箱
mail_msg = """
<p>Python 邮件发送测试...</p >
<p>< a href=" ">这是一个链接</ a></p >
"""
message = MIMEText(mail_msg, 'html', 'utf-8')
message['From'] = Header("邮件测试", 'utf-8')
message['To'] = Header("测试", 'utf-8')
subject = 'Python SMTP 邮件测试'
message['Subject'] = Header(subject, 'utf-8')
try:
# 使用非本地服务器,需要建立SSL连接
smtpObj = smtplib.SMTP_SSL("smtp.163.com", 465)
smtpObj.login(sender, pwd)
smtpObj.sendmail(sender, receivers, message.as_string())
print("邮件发送成功")
except smtplib.SMTPException as se:
print(f"Error: 无法发送邮件.Case:{se}")
发送带附件的邮件,可以构造一个MIMEMultipart对象代表邮件本身,然后往里面添加一个MIMEText作为邮件正文,再添加表示附件的MIMEBase对象即可。代码实现如下(send_fujian_email.py):
#coding:utf-8
import smtplib
from email.mime.multipartimport MIMEMultipart
from email.mime.textimport MIMEText
#发送邮件smtblib,邮件格式:MIMEText
import os
class SendEmail:
#全局变量
global send_user
global email_host
global password
email_host ="smtp.163.com"
send_user ="151010@163.com"
password ="ALFIUIP"
def send_mail(self,user_list,sub,content,att1):
#构建
user ="1510101" +"<"+send_user+">"
#构建邮件内容格式
# message = MIMEText(content,_subtype='plain',_charset='utf-8')
message = MIMEMultipart(_charset='utf-8')
message['Subject'] = sub#主题格式
message['From'] = user#发送人
message['To'] =";".join(user_list)#多个收件人,分号分割
message.attach(MIMEText(content,_subtype='plain',_charset='utf-8'))
# 构造附件1,传送当前目录下的文件
att1 = MIMEText(open('../dataconfig/appellation.xls', 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] ='application/octet-stream'
# 这里的filename可以任意写,写什么名字,邮件中显示什么名字
att1["Content-Disposition"] ='attachment; filename="test.xls"'
message.attach(att1)
message.attach(MIMEText(content, 'html', _charset='utf-8'))
server = smtplib.SMTP()#创建邮件服务
server.connect(email_host)#连接服务
server.login(send_user,password)
server.sendmail(user,user_list,message.as_string())
server.close()
def send_main(self,pass_list,fail_list):
pass_num =len(pass_list)#成功总数
fail_num =len(fail_list)#错误总数
count_num = pass_num+fail_num#执行用例总数
#百分比
pass_result ="%.2f%%" %(pass_num/count_num*100)#%.2f指却取值小数点后两位,%表示百分号
fail_result ="%.2f%%" %(fail_num/count_num*100)
att1 = MIMEText(open('../dataconfig/appellation.xls', 'rb').read(),'base64','utf-8')
att1["Content-Type"] ='application/octet-stream'
# 这里的filename可以任意写,写什么名字,邮件中显示什么名字
att1["Content-Disposition"] ='attachment; filename="test.xls"'
user_list = ['li@uzoo.cn']
sub ='接口自动化测试报告'
content="<p>此次一共运行接口个数为%s个</p><html><body><div><tr id="" class="" style=""><td><h1>用例集/测试用例</h1></td></tr></div></body></html>" \
"通过个数为%s个,失败个数为%s个,通过率为%s,失败率为%s"%(count_num,pass_num,fail_num,pass_result,fail_result)
# content = """
此次一共运行接口个数为%count_num个
# 通过个数%s失败个数%s
# 通过个数%pass_num失败个数%fail_num
#
# 通过率%s失败率%s
# 通过率%pass_result失败率%fail_result"""
if fail_num>=0:
self.send_mail(user_list,sub,content,att1)
else:
print("")
if __name__ =='__main__':
sen = SendEmail()
sen.send_main([1,2],[3,4])
网友评论