前言
想要实现自动化发送邮件,自己的邮箱必须开通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()
最后的呈现
b5e87121c9a9c821b86805ed93ae1d9.jpg
封装
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 原因:邮件地址中存在语法错误 解决方案:检查地址是否正确
总结
可复制直接使用,最好自己实践一次。