Python定时发送邮件

2022-12-06 09:28:21 浏览数 (1)

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)

0 人点赞