前言
想要实现自动化发送邮件,自己的邮箱必须开通SMTP服务。
开通SMTP服务
以QQ邮箱为例,其他邮箱类似。点击下方的「生成授权码」依照提示发送短信后,就能看到一串授权码了,例如:
复制这个授权码,别点击确定了,然后啥也不知道。
模块/包
yagmail模块先对简单易用,非常适合初学者。且底层用的依旧是smtplib
pip install yagmail
导入模块
import yagmail
发送邮件
import yagmail
mail = yagmail.SMTP('发送邮箱的账号','发送邮箱的授权码','smtp.qq.com')
mail.send('接受邮件的账号',"测试邮件","Hello QingAn")
mail.close()
send源码参数
def send(
self,
to=None,
subject=None,
contents=None,
attachments=None,
cc=None,
bcc=None,
preview_only=False,
headers=None,
prettify_html=True,
message_id=None,
group_messages=True,
)
to | 收件人邮箱 |
---|---|
subject | 邮件主题 |
attachments | 附件 |
cc | 抄送 |
bcc | 密送(类似于抄送,但是收件人看不到其他人的邮箱地址) |
perview_only | 仅预览(可以发送,但是接收方收不到) |
headers | 头部信息(需要时字典格式) |
prettify_html | 修饰HTML |
message_id | 消息ID |
group_messages | 组消息 |
初始化源码参数
def __init__(
self,
user=None,
password=None,
host="smtp.gmail.com",
port=None,
smtp_starttls=None,
smtp_ssl=True,
smtp_set_debuglevel=0,
smtp_skip_login=False,
encoding="utf-8",
oauth2_file=None,
soft_email_validation=True,
dkim=None,
**kwargs
)
user | 用户名 |
---|---|
password | 密码 |
host | 发信服务 |
port | 默认端口 |
smtp_ssl | True |
smtp_set_debuglevel | debug等级 |
smtp_skip_login | 跳过登录 |
encoding | 编码格式 |
oauth2_file | 身份鉴权 |
soft_email_validation | 邮箱验证 |
邮箱域名
163邮箱 | smtp.163.com |
---|---|
126邮箱 | smtp.126.com |
qq邮箱 | smtp.qq.com |
SMTP服务器域名都类似
批量发送邮箱
import yagmail
mail = yagmail.SMTP('11049@qq.com','yrynkiaaj','smtp.qq.com')
contents = ['下午好',"安某人批量代码测试"]
to_list = ['1867@163.com','204110@qq.com']
# 接收人,标题,内容,抄送
mail.send(to_list,"测试邮件",contents,cc="8736@qq.com")
mail.close()
自定义邮箱内容
import yagmail
mail = yagmail.SMTP('110489@qq.com','yrynkergiaaj','smtp.qq.com')
# 这里面有图片的写法,以及加入了超链接的写法
contents = ['下午好',"以此文件为准。安某人批量代码测试。",yagmail.inline(r"E:\VUE_DEMO\gzh.jpg"),'<a href="https://www.yuque.com/docs/share/6c284c79-d721-42bc-b8c5-210c05e7324b?#"> 《自动化发送邮件(yagmail)》密码:kl1l</a>']
# 附件
attachments = r'E:\352稳定性测试脚本.bat'
to_list = ['1867@163.com','2041@qq.com']
mail.send(to_list,"测试邮件",contents,cc="876@qq.com",headers={"name":"清安"},attachments=attachments)
mail.close()
最后的呈现
封装
class Mail:
"""
邮件相关类
"""
def log(self, content):
now_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print(f'{now_time}: {content}')
def yag_SMTP(self):
return yagmail.SMTP(
host=read_smtp()[0], user=read_smtp()[1],
password=read_smtp()[2], smtp_ssl=True
)
def sendmail(self, contents=read_config()[0], subject=read_config()[1],
to=read_config()[2], attachments=read_config()[3]):
"""
发送邮件
Arguments:
msg {str} -- 邮件正文
title {str} -- 邮件标题
receivers {list} -- 邮件发送者,数组
attachment -- 测试报告附件
"""
try:
self.yag_SMTP().send(contents=contents, subject=subject,
to=to, attachments=attachments)
self.log("邮件发送成功")
except BaseException as e:
print(e)
self.log("Error: 无法发送邮件")
拓展
在封装的基础上增加一个压缩的方法
import shutil
def Filezip(self):
try:
# 在路径下寻找指定的包
if os.path.exists('包路径/包名'):
os.remove('删除包')
except Exception as e:
print(e, "没有zip压缩包可以删除")
finally:
# 以.zip为后缀,root_dir开始打包的路径
shutil.make_archive('打包到指定的路径', "zip", root_dir=re.Base_reports)
def func(self):
# 压缩文件
self.Filezip()
# 发送邮件
self.sendmail()
错误
exception yagmail.error.YagAddressError
原因:无法识别的电子邮件,一般的,指电子邮件格式错误
解决方案:检查电子邮件的格式
exception yagmail.error.YagConnectionClosed
原因:链接被销毁
解决方案:在链接建立时发送邮件(一般是因为发信前调用了close方法)
exception yagmail.error.YagInvalidEmailAddress
原因:邮件地址中存在语法错误
解决方案:检查地址是否正确
总结
可复制直接使用,最好自己实践一次。