使用 Python 发送邮件

开发中,使用到邮件发送的场景特别多,比如用户注册、找回密码、推广等等。本文简单介绍下使用 Python 发送邮件的方法,不涉及协议那些理论知识,基本上看完就能使用。

1 准备

和自己手动发电子邮件一样,首先要准备好这些东西:邮箱账号、密码、邮件主题、内容、收件人邮箱。

需要注意的是,我们发送邮件需要使用邮件服务商的 SMTP 服务,而这个一般默认是关闭的,我们需要先开启。

这里以 163 邮箱为例进行说明,首先登陆并找到 SMTP 的设置位置

开启 SMTP

设置授权码

确定后会提示你是否另外开启 POP3 和 IMAP 服务,这两个服务都是是用于第三方客户端接收邮件使用的。发送邮件并不会使用到这两个服务,如果你有接收邮件的需求则需要开启其中的一个或两个,看你情况自行选择。

至此 SMTP 成功开启。

这里也要注意下,大部分平台邮箱账号登陆第三方客户端的时候,使用的是和登录密码不同的授权码,有小部分是相同的,根据你的邮件平台自行确定。

到这里我们有了如下信息

2 发送文本邮件

Python 内置了对 SMTP 的支持,email 包用来构造邮件,smtp 包用来发送邮件。

首先我们创建了一个 MIMEText 对象 msg,第一个参数指定邮件内容,第二个参数指定 MIME 的子类型为 plain,第三个指定编码类型为 uft-8。

然后填充 msg 的主题、发件人、收件人,如果填充的主题包含中文,需要将其通过 Header 进行编码。

再后面,我们使用服务器地址和端口创建了一个 SMTP 对象 server,使用邮箱名称和授权码登陆,然后发送邮件,最后关闭。

一般情况下,通过 25 端口连接 SMTP 服务器时使用的是明文传输,内容很容易被劫取。如果服务器支持 SSL,推荐使用这种加密传输的方式。由于 163 的 SMTP 服务器是支持 SSL 的,这里我们对上面代码进行两个小改动就能更安全的发送邮件了。

一是端口

改为

二是创建 SMTP 对象的方式

改为

这样就搞定了。

3 发送 HTML 邮件

我们发送文本邮件创建 MIMEText 对象时,我们指定的 MIME 子类型为 plain。如果要发送 HTML 邮件,将 plain 改为 html 就行。就像这样

4 带附件发送,比如 PDF

我们先看下 MIME 相关类的继承关系

可以看出,一个邮件对象就是一个 Message 类的实例。其中,由 MIMEMultipart 创建的对象可以由多个部分组成,它可以使用 attach 方法将 MIMEText、MIMEApplication 等的实例包含进来;而 MIMENonMultipart 没有 attach 方法。所以,如果要能发送附件的话,我们需要创建一个 MIMEMultipart 对象。

邮件内容,MIMEText 能处理;音频附件,MIMEAudio 能处理;图片附件,MIMEImage 能处理。但是 PDF 怎么处理呢?我们不要忽略了这个类 MIMEApplication,它的默认类型是 application/octet-stream,邮件客户端遇到这样的文件一般会根据文件扩展名来猜测文件类型。

清楚了上面的思路以及相关问题的解决方法后,下面的代码就不难理解了

需要注意的是,MIMEApplication 能办到的,MIMEBase 肯定也能实现。只是文件的 MIME 类型太多了,我们使用 MIMEBase 去自定义的话,要花费不少时间去搜索去尝试,过于麻烦,所以 MIMEApplication 一般会用的多一些。

5 参考

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20181109G0DACH00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券