使用Python第三方库发送电子邮件的示例代码
作者:华仔仔coding 发布时间:2021-07-24 11:17:36
Python 作为当前最热门的编程语言之一,不仅仅是因为它的学习成本低、入门容易,还因为它具有丰富的生态环境,包括内置的模块以及第三方的库,使用它能够做很多事情。例如,办公自动化也是 Python 涉及的领域之一,如果能够用好 Python, 能够显著提高我们的工作效率。
今天我们就来学习,如何使用 Python 发送电子邮件。
1. 安装 yagmail 第三方库
首先,我们来安装一个第三方库,yagmail 模块。这个库实现了发送电子邮件的功能,因此,我们需要进行安装。可以通过 pip 命令进行安装,命令如下:
pip install yagmail -i https://mirrors.aliyun.com/pypi/simple/
2. 开启 POP3、IMAP 和 SMTP 服务
那么在安装完模块之后,我们还需要在邮箱平台进行相应地设置,那为什么要设置呢?大家想一下,我们平时发送邮件都是在邮箱平台编辑发送的,那么现在我们要使用 Python 的第三方模块操控我们的邮箱,进行发送邮件。这个时候就需要邮箱平台给予 Python 的第三方模块权限了啊,让它代替邮箱平台进行发送邮件。
因此,我们需要在邮箱平台上进行设置,开启对应的协议以及第三方授权(需要手机短信验证、QQ 安全验证中心等等)。所以,下面我们需要对开启的协议做一个简单的介绍,之后再带着大家开启协议以及第三方授权。
2.1 POP3、IMAP 和 SMTP 简介
POP3: 即 Post Office Protocol3,意思就是邮局协议第三个版本。这个协议规定了将个人计算机连接到 Internet 的邮件服务器和下载电子邮件的电子协议,帮助用户登录、取邮件和删除邮件等。
IMAP: 即 Internet Message Access Protocol, 意思就是邮件访问协议。它和 POP3 都是邮件访问最为普遍的 Internet 标准协议。它与 POP3 协议的主要区别是用户可以不用把所有的邮件全部下载,可以通过客户端直接对服务器上的邮件进行操作。
SMTP: 即 Simple Mail Transfer Protocol, 意思就是简单邮件传输协议。它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式,帮助每台计算机在发送或中转信件时找到下一个目的地址。
2.2 开启 POP3、IMAP、和 SMTP 协议
了解了 POP3、IMAP 和 SMTP 协议之后,接下来我们就要开启邮箱的 POP3、IMAP 和 SMTP 协议了。下面我以网易 163 邮箱为例进行演示,步骤如下:
登录 163 邮箱平台 -> 点击设置 -> 开启服务 -> 开启 IMAP/SMTP 服务 -> 开启 POP3/SMTP 服务。
当然,在操作的过程中会涉及到发送短信验证码,大家只要跟着提示一步一步操作就行,使用微信扫描二维码就可以自动编辑信息,然后选择发送即可。
下面,给出具体清晰的图文教程:
第一步,点击设置 -> POP3/SMTP/IMAP
第二步,开启服务 -> 开启 IMAP/SMTP 服务
点击 “继续开启”
使用微信扫描二维码,发送短信之后,再点击 “我已发送”
复制并记住授权密码,这个后面登录邮箱要用到,之后点击 “确定”
第三步,开启服务 -> 开启 POP3/SMTP 服务
点击 “确定” 即可
最后,经过一系列的操作之后,我们就将 POP3、IMAP 和 SMTP 服务成功打开了,下面就准备进入到写 Python 代码的环节!
3. 发送邮件
3.1 发送第一封电子邮件
发送一封电子邮件的过程,需要发送方的账号、密码以及 SMTP 服务器域名,收件人的账号、邮件标题、邮件内容以及附件等等。值得注意的是,这里提到的发件人密码并不是我们平时登录邮箱平台的密码哦,而是我们在 2.2 小节中开启 IMAP/SMTP 服务时,得到的授权密码,我之前说过要复制存储下来的,就是在这个时候要用到啦!
OK 废话不多说了, 下面直接给出一段发送第一封邮件的具体代码:
import yagmail
# yagmail.SMTP(user='发件人邮箱账号', password='授权码', host='SMTP 服务器域名')
yag = yagmail.SMTP(user='xxx@163.com', password='xxxxxx', host='smtp.163.com')
contents = 'hello, this is the first email' # 邮件内容
subject = '第一封邮件' # 邮件主题
receiver = 'xxx@qq.com' # 接收方邮箱账号
yag.send(receiver, subject, contents)
yag.close()
print('发送成功')
代码解析:
使用 yagmail 第三方模块发送邮件非常简单。首先,调用 yagmail.SMTP() 方法指定发送方账号、授权码 和 SMTP 服务器域名, 登录到邮箱系统中。之后,使用 yag.send() 方法将接收方,主题和内容分别传送到对应的参数位置即可。
发送完成之后,记得使用 yag.close() 退出登录状态,释放资源。
password 一定要小心存放,不要泄露,否则别人就相当于拿到了你的邮箱密码。
那么,我们可以运行这段代码。运行完成之后,看一下我的邮箱确实收到了刚才的邮件,截图如下所示:
大家可以看到,确实收到了邮件,这表明发送第一封邮件成功啦!
补充:
刚才我们说了授权密码一定要小心存放。那如何做才算“小心”呢?最好是授权密码不要出现在代码中,因此,我们可以将授权密码存储在系统中,每次登录时能够不用显式填写授权密码。操作过程如下:
首先,打开 Python 交互式环境,例如 IDLE 或者 Anaconda,如果使用的是 PyCharm,那么可以调出 Python Console:
然后,在命令行分别输入如下命令:
import yagmail
# yagmail.register(邮箱账号, 授权密码)
yagmail.register('xxx@126.com', 'xxx')
这样,就可以将授权密码存储在系统中,一定程度上保证了授权密码的安全性。在之后的代码中,我就可以不用将 password 传入到 yagmail.SMTP()
方法的参数中。
3.2 群发邮件
那么通过上一小节的学习,我们掌握了如何发送第一封电子邮件。但是,在日常使用中,我们常常需要发送通知之类的邮件,这类邮件往往接收方是多个的,不止一个接收方。下面我们再来看一下,当我需要群发邮件的时候,是如何做的。
老规矩,直接贴代码:
import yagmail
# yagmail.SMTP(user='发件人邮箱账号', host='SMTP 服务器域名')
yag = yagmail.SMTP(user='xxx@163.com', host='smtp.163.com')
contents = 'Happy New Year' # 邮件内容
subject = '新年快乐' # 邮件主题
receivers = ['xxx@qq.com', 'xxx@126.com', 'xxx@163.com'] # 接收方们的邮箱账号
yag.send(receivers, subject, contents)
yag.close()
print('发送成功')
代码解析:
大家可以看到,群发邮件的代码和上一小节的代码,不同的地方就是接收方。群发邮件肯定意味着有一个或多个收件人,因此我只需要定义一个接收方列表 receivers, 将多个接收方的账号放在列表里,随便你放多少个都可以。之后再将这个列表作为参数放到 yag.send() 方法中,就可以实现群发邮件的目的了,就是这么简单!
3.3 给邮件添加附件
在发送邮件时,我们经常需要用到附件。例如,我们上交方案给公司领导时,将方案作为邮件的附件发送给领导审查,领导收到邮件后打开附件进行预览或下载。具体的代码如下所示:
import yagmail
# yagmail.SMTP(user='发件人邮箱账号', password='授权码', host='SMTP 服务器域名')
yag = yagmail.SMTP(user='xxx@163.com', host='smtp.163.com')
contents = 'Happy New Year' # 邮件内容
subject = '新年快乐' # 邮件主题
receivers = ['xxx@qq.com', 'xxx@126.com', 'xxx@163.com'] # 接收方们的邮箱账号
attachments = [r'C:\Users\Desktop\设计方案一.docx', r'C:\Users\Desktop\设计方案二.docx', r'C:\users\Desktop\汇报.pptx']
# yag.send(接收方,主题,内容,附件)
yag.send(receivers, subject, contents, attachments)
yag.close()
print('发送成功')
代码解析:
在上面的代码中,相比之前两个小节的代码,我们增加了一个 attachments 变量,这是一个列表类型的变量,存放着附件在我们计算机上的位置以及名称。当有多个附件时,我们可以将多个附件的名称统统存放到列表中。之后,使用 yag.send() 方法,可以看到 attachments 放在最后一个参数的位置。
3.4 设置定时器
下面我们再进阶一下,对我们的邮件发送设置定时器,使得可以定时发送邮件。这里关键就是定时器功能的调用,需要我们安装 schedule 模块,这个模块含有很多关于调度以及定时相关的方法。安装命令如下
pip install schedule -i https://mirrors.aliyun.com/pypi/simple/
定时器和闹钟一样,你可以设置 day、week、hour、mintues、second, 设定定时触发函数执行任务。在这里就是定时触发函数,定时发送邮件。具体代码如下所示:
import time
import yagmail
import schedule
# yagmail.SMTP(user='发件人邮箱账号', password='授权码', host='SMTP 服务器域名')
yag = yagmail.SMTP(user='xxx@163.com', host='smtp.163.com')
def message():
contents = '早安朋友,新的一周开始啦!' # 邮件内容
subject = '早安' # 邮件主题
receivers = ['xxx@qq.com', 'xxx@126.com'] # 接收方们的邮箱账号
attachments = [r'C:\Users\\Desktop\早安.jpg', r'C:\Users\Desktop\早安.png']
yag.send(receivers, subject, contents, attachments)
print('发送成功')
# 设定时间:每周星期一早上7点钟发送邮件
schedule.every().monday.at('07:00').do(message)
while True:
schedule.run_pending()
time.sleep(3)
yag.close()
代码解析:
定义 message() 函数,实现指定发送邮件的内容、主题、附件、接收方。
schedule.every() 后面可以是 day、hour、week、monday、tuesday、wednesday 等等,在上面的代码中,意思就是每周星期一早上7点发送邮件。例如,如果想要实现每隔 30 秒发送邮件,可以写成 schedule.every().minute.at(":30").do(message)
while True 表示一个死循环,因为我们要求每周一发送邮件,所以一直处于一个监控的状态,时间一到就执行任务。schedule.run_pending() 表示运行所有任务。
4. 总结
来源:https://blog.csdn.net/weixin_43252521/article/details/122154639


猜你喜欢
- 记得很早以前看到过这样的一段介绍:想象你在逛街边的一家书店,如果最终你没有购买任何图书就直接离开了,店长并不会知道你来过。但是如果你买了书,
- 题目:给一个列表,找元素在此列表中的位置,如果找到,返回此元素的下标,如果找不到,那就直接返回空解决方法1:# _*_ coding:UTF
- 1 简介Golang 是一门优秀的语言,特别是在并发编程上,得益于它的协程和 channel 等,非常方便易用。它通过 go module
- onchange在用于文本框输入框时,有一个明显的不足. 事件不会随着文字的输入而触发,而是等到文本框失去焦点(onblur)时才会触发.
- 1、引言续上一篇《一行代码,导入Python所有库》不知道是不是都跟小鱼一样,把剩下的时间来学(撩)习(妹)。为了体现小鱼在懒上的造就,小鱼
- 本文实例讲述了Go语言转换所有字符串为大写或者小写的方法。分享给大家供大家参考。具体如下:Go语言的string模块包含了ToLower和T
- 在查看MySQL对文件的操作中,它在不同的操作系统上对文件的操作,除了使用标准C运行库函数,包括open、close、seek等,在Win3
- IE 的 Cookie 文件保存在 ?:\Documents and Settings\<user>\Cookies 目录,后缀
- 一、TensorFlow变量管理1. TensorFLow还提供了tf.get_variable函数来创建或者获取变量,tf.variabl
- 如下所示:函数功能abs(x)返回一个数的绝对值。 参数可以是一个整数或浮点数。 如果参数是一个复数,则返回它的模。all(iterable
- 昨天同事无意又谈起了这个老话题,美工和设计师(视觉)有什么不同?以文字排版设计为例,列了下面两个图来说明,可能会有一些启发, 第一个图应该算
- 在上一篇Python接口自动化测试系列文章:Python接口自动化之浅析requests模块get请求,介绍了requests模块、get请
- pycharm安装cv2模块安装失败和无法使用的解决步骤一我们先到这个网址:cv2下载地址去下载与自己python版本号和电脑位数对应的op
- 对想要在可视化的环境下制作复杂网页的专业网页制作者来说,Dreamweaver 已经渐渐在网页编辑工具市场中展露头角,成为专业人士
- 1 获取当前完整时间1.1 now()函数select now();输出:2023-02-15 10:46:171.2 sysdate()函
- 改变conda虚拟环境的默认路径conda环境默认安装在用户目录C:\Users\username.conda\envs下,如果选择默认路径
- 1.var、let、const简介 ECMAS
- 本文实例讲述了Python基础之循环语句用法。分享给大家供大家参考,具体如下:while 循环Python中while语句的一般形式:whi
- 前言对于前端项目而言,ESLint 可以检查代码,统一代码风格,避免不必要的错误。在 vue3 中配置 ESLint,如下所示。环境vite
- ①. vscode的常用快捷键列表1.注释:a) 单行注释:[ctrl+k,ctrl+c] 或 ctrl+/b) 取消单行注释:[ctrl+