Python小应用系列之用Python写个邮件提醒
1 引言
春节假期已结束,患上了节后综合征?不想工作偷个懒,又不想错过重要事情被老板逮个正着,这时邮件提醒就派上用场了。本文教你如何使用Python来发邮件。
2 环境
操作系统:Windows / Linux
Python版本:3.7.2
3 邮件收发流程
邮件收发,很自然地涉及两个阶段:邮件发送过程、邮件接收过程。发邮件用的是SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件中转方式。SMTP协议只能用来发送邮件,不能用来接收邮件,而大多数的邮件发送服务器都是使用SMTP协议,SMTP协议的默认TCP端口号是25。收邮件最常用的两种协议是POP3协议(TCP 110)和IMAP(TCP 143)。
在python中我们利用Python中smtplib模块和email模块来进行邮件的发送。smtplib模块提供了一种很方便的途径发送电子邮件,它对smtp协议进行了简单的封装。而email模块,则是用来处理邮件消息的。
4 代码实现
首先导入用到的模块
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
from email.header import Header
接下来,先看看一封邮件中涉及哪些内容。
邮件由邮件头
、邮件体
两部分组成。发件人(from)、收件人(to)、邮件主题(subject)、MIME版本、邮件内容类型等属于邮件头;邮件体则指的是邮件的正文,有text/plain(纯文本)和text/html(超文本)之分,由邮件头中的“connect type”域指出。
转成代码如下:
# 邮件主题/标题
mail_title = 'Email Reminder'
# 邮件正文
mail_content = 'This is an email reminder from Python.'
# 发件人邮箱账号
Sender = '*********@qq.com'
# 收件人邮箱账号
Receiver = '***********@126.com'
# 发送邮件正文内容
msg = MIMEText(mail_content, "plain", 'utf-8')
# 发送邮件主题/标题
msg["Subject"] = Header(mail_title, 'utf-8')
# 发件人姓名
msg["From"] = formataddr(['&娴敲棋子&', Sender])
# 收件人姓名
msg["To"] = formataddr(['&娴敲棋子&', Receiver])
实际上邮件正文的文本格式有三种,如下图,上述代码中"plain"对应的就是纯文本格式。
HTML,这是Outlook中的默认邮件格式。HTML 也是要使用要为其创建邮件看起来像传统的文档,使用各种字体、 颜色以及项目符号和编号列表,以及您希望显示在您的消息内的图片时的最佳格式。
纯文本,此格式适用于所有电子邮件程序,但它不支持粗体或斜体文本、 彩色的字体或其他文本格式。纯文本格式也不支持在邮件中,显示图片,虽然您可以包括附件的形式的图片。
RTF格式,丰富文本格式 (RTF) 是一种只能由这些电子邮件应用程序支持的 Microsoft 格式:Microsoft Exchange Client 版本 4.0 和 5.0、所有版本的Outlook。
邮件准备好了,接下来就是登录、发送邮件、登出,如下:
# 邮箱的传输协议,端口默认25
e = smtplib.SMTP("smtp.qq.com", 25)
# 登录邮箱,第二个参数为发件人的邮箱授权码
e.login(Sender, 'xxxxxxxxx')
# 发送邮件,参数依次:发件人、收件人、发送消息
e.sendmail(Sender, [Receiver, ], msg.as_string())
# 退出邮箱
e.quit()
注意:登录邮箱时填写不是邮箱的密码,而是授权码。
授权码是用于登录第三方邮件客户端的专用密码。适用于登录以下服务: POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务。
网易邮箱的设置入口:设置-客户端授权码
QQ邮箱的设置入口:邮箱设置-账户-生成授权码
最后可以添加try…except…语句,捕获异常并打印邮件发送状态。
try:
'''此处放置登录邮箱、发送邮件、登出邮箱的代码'''
print('Email Send Successful!')
except Exception:
print('Email Send Failed!')
执行一下,看看邮件是否发送成功了?
5 总结
在实际使用时,可将上述发送邮件的代码,用函数封装起来,封装在各种场景中,如:服务器出现异常时的提醒、自动化执行结束后,火车票抢票成功后等等。
本文所涉及的完整代码详见HGzhao/PythonApps
备注:本篇首发于知识星球「人人都是Pythonista」。