Python定时发送邮件
摘要:本文介绍了如何利用Windows的定时任务实现每天定时发送邮件。
首先我们先申请一个邮箱的授权码用于邮箱身份验证。然后编写Python程序,利用SMTP发送邮件。最后利用Windows任务计划程序实现每天定时执行程序。
一、申请授权码
这部分操作可以参考QQ邮箱的帮助中心:
什么是授权码,它又是如何设置?_QQ邮箱帮助中心
为了节省时间,在这里总结了申请授权码的操作:
登陆qq邮箱(mail.qq.com),点击设置
,点击账户
,(然后往下滑)看到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务,开启POP3/SMTP服务
然后会提示进行验证,手机验证后得到16位授权码,记录下来后面要用(很重要)。
二、使用SMTP发送邮件
我们用到smtplib包来发送邮件,email包来创建邮件内容。
这两个包都是Python标准库内容,可以去官网查看细节。
下面直接给出代码,以QQ邮箱为例:
将下面程序的发件人、收件人等内容进行修改,修改完成后运行即可发送邮件。
代码语言:javascript复制from smtplib import SMTP
from email.header import Header
from email.mime.text import MIMEText
def main():
# 使用email包创建邮件内容
#【发送者邮箱--你的QQ邮箱】
sender = 'abcdefg@qq.com'
#【接受者邮箱--收件人可以不是QQ邮箱,并且可以有多个收件邮箱】
receivers = ['uvwxyz@qq.com', 'uvwxyz@126.com']
#【邮件内容】
message = MIMEText('用Python发送邮件的示例代码.', 'plain', 'utf-8')
#【发件人】
message['From'] = Header('发件人AA', 'utf-8')
#【收件人】
message['To'] = Header('收件人BB', 'utf-8')
#【邮件主题】
message['Subject'] = Header('示例代码实验邮件', 'utf-8')
# 使用SMTP来发送邮件
smtper = SMTP('smtp.qq.com') # 使用QQ的smtp服务器
#!!【将secretpass改成自己的16位授权码】
smtper.login(sender, 'secretpass')
smtper.sendmail(sender, receivers, message.as_string())
print('邮件发送完成!')
if __name__ == '__main__':
main()
如果顺利,收件邮箱里会多出来一封邮件:
下面我们只需要将此任务变成定时任务就行。如果你是Linux系统用户,可以参考Crontab 定时任务Linux Crontab 定时任务 | 菜鸟教程 (runoob.com)。我们下面以Windows为例。
三、在Windows中开启定时任务
1、Windows键 R,调出运行窗口,输入compmgmt.msc,点击确定。
2、单击任务计划程序
,然后右键
,选择创建基本任务
。
然后按提示依次填写:
名称这里我们写自动发邮件
,然后下一步
触发器这里我们可以设置频率,每天、每周、每月...
选择每天后,继续填写起始时间,改成自己想发送的时间就行。
操作这里选启动程序
启动程序这里,程序
写Python解释器路径,参数
写上面的邮件脚本名称,如xxx.py
,起始于
写脚本所在文件夹路径。
注:如果不知道自己的解释器路径,可以通过运行下面代码查看
代码语言:javascript复制import sys
print(sys.executable) #解释器
最后是一个总结核对我们的任务信息,如果没问题点击完成即可。
四、补充内容:带附件的 邮件
代码语言:javascript复制from smtplib import SMTP
from email.header import Header
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
import urllib
def main():
# 创建一个带附件的邮件消息对象
message = MIMEMultipart()
# 创建文本内容
text_content = MIMEText('附件中有本月数据请查收', 'plain', 'utf-8')
message['Subject'] = Header('本月数据', 'utf-8')
# 将文本内容添加到邮件消息对象中
message.attach(text_content)
# 读取文件并将文件作为附件添加到邮件消息对象中
with open('hello.txt', 'rb') as f:
txt = MIMEText(f.read(), 'base64', 'utf-8')
txt['Content-Type'] = 'text/plain'
txt['Content-Disposition'] = 'attachment; filename=hello.txt'
message.attach(txt)
# 读取文件并将文件作为附件添加到邮件消息对象中
with open('myexcel.xlsx', 'rb') as f:
xls = MIMEText(f.read(), 'base64', 'utf-8')
xls['Content-Type'] = 'application/vnd.ms-excel'
xls['Content-Disposition'] = 'attachment; filename=month-data.xlsx'
message.attach(xls)
# 创建SMTP对象
smtper = SMTP('smtp.qq.com')
# 开启安全连接
# smtper.starttls()
sender = '你的@qq.com'
receivers = ['收件人的@qq.com']
# 登录到SMTP服务器
# 请注意此处不是使用密码而是邮件客户端授权码进行登录
smtper.login(sender, '你的16位授权码')
# 发送邮件
smtper.sendmail(sender, receivers, message.as_string())
# 与邮件服务器断开连接
smtper.quit()
print('发送完成!')
if __name__ == '__main__':
main()
发送效果:
参考资料:
Python-100-Days/14.网络编程入门和网络应用开发.md at master · jackfrued/Python-100-Days · GitHub
什么是授权码,它又是如何设置?_QQ邮箱帮助中心
windows中怎么添加定时任务 - 秋寻草 - 博客园 (cnblogs.com)