Python小应用系列之用Python写个邮件提醒

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」。


文章作者: &娴敲棋子&
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 &娴敲棋子& !
评论
 上一篇
Python小应用系列之迷你爬虫之15行代码搞定热门歌单 Python小应用系列之迷你爬虫之15行代码搞定热门歌单
昨天214你过的是情人节还是正月初十呢?是否需要一首歌来抚慰你受伤或躁动的心灵。现在教你用15行代码搞定热门歌单。学起来并听起来吧~!
下一篇 
Python小应用系列之拿Python给自己做个UI界面 Python小应用系列之拿Python给自己做个UI界面
学Python这么久了,一直想做个界面出来,最近发现Python有个内置库tkinter,利用它可以很轻松做出一些简易的UI界面。戳进来学习下吧~
  目录