Python 自带smptplib模块:使用 SMTP 协议发送邮件. smptplib 使用 RFC 821协议配合使用 SMTP。教程中将使用 Gmail SMTP 服务器作为案例寄送邮件。(Note:此基本原则同样适用于其他邮件服务)
两种练习方法:
一. 获取一个用于联系的Gmail账户(默认方法)
二. 建立一个SMTP调试服务器(此文忽略感兴趣的朋友可以自行阅览Option2)
将会拦截您发送的邮件并转发打印在command prompt
Note: 本地SMTP调试服务器对于解决邮件功能性问题或者错误排查效果优异
1. 使用Python寄送纯文本邮件
首先需要建立一个安全的SMTP连接
当您通过Python寄送邮件,您首先需要确保你的SMTP连接已加密,这样您的信息内容以及登录信息不会轻易的被他人获取. SSL (Secure Sockets Layer) 和 TLS (Transport Layer Security) 两种可以加密 SMTP连接的协议。
和您邮件服务器建立安全连接的两种方式:
一. 使用 SMTP_SSL() 建立SMTP安全连接 (从始加密)
二. 使用 .strattles() 对建立的未加密SMTP安全连接进行加密(后期加密)
Note: Gmail将使用TLS对邮件进行加密 (较SSL更安全)对于Python的安全考量,强烈建议您使用 ssl 模组里的 create_default_context()。 这样会载入系统中信任的CA证书并启用主机名检查和证书验证,并尝试选择合理的安全协议和密码设置。
smtplib 是Python的内置模块,用于通过SMTP或ESMTP侦听器守护程序向任何Internet计算机发送电子邮件。
我将首先向您展示如何使用 SMTP_SSL(),因为它实例化了从一开始就安全的连接,并且比.starttls()更为简洁。请注意,如果使用SMTP_SSL(),则Gmail要求您连接到端口465而使用.starttls(),则要求连接到端口587。
方法 1: 使用 SMTP_SSL() (默认方法)
下面的代码示例使用smtplib的SMTP_SSL()创建与TLS加密的连接,从而与Gmail的SMTP服务器建立安全连接。 ssl的默认环境验证主机名及其证书,并优化连接的安全性。确保填写您自己的电子邮件地址,而不是[email protected]:
注意:将电子邮件密码存储在代码中是不安全的做法,特别是如果您打算与他人共享。而是使用input()来让用户在运行脚本时输入密码,如上例所示。如果您不想在输入密码时在屏幕上显示密码,则可以导入getpass模块,并使用.getpass()代替盲目输入密码。
方法2: 使用 .strattles()(此处忽略,如果感兴趣请自行阅览Using .starttls
发送您的纯文本邮件
建立安全连接之后,您可以开始发送邮件
这里建议把以下内容在IDE中置顶,方便以后修改以及添加删除内容
以下为寄送实例:
2. 使用Python寄送高级文本邮件
Python的内置email模块使您可以构建更多精美的电子邮件,然后就可以通过smtplib进行传输了,就像已经完成的一样。下面,您将了解如何用email模块发送带有HTML内容和附件的电子邮件。
一. 添加HTML内容
如果要格式化电子邮件中的文本格式(粗体,斜体等),或者要添加任何图像,超链接或可响应内容,用HTML会非常方便。当今最常见的电子邮件类型是将HTML和纯文本结合在一起的MIME(多用途Internet邮件扩展名)多部分电子邮件。 MIME消息由Python的 email.mime 模块处理。有关详细说明,请查阅文档。
由于并非所有电子邮件客户端默认情况下都显示HTML内容,并且某些人出于安全原因仅选择接收纯文本电子邮件,因此为HTML消息包括纯文本替代非常重要。由于电子邮件客户端将首先呈现最后的多部分附件,因此请确保在纯文本版本之后添加HTML消息。
在下面的示例中,我们的 MIMEText()对象将包含消息的HTML版本和纯文本版本,而MIMEMultipart(“可替换的”)实例将这些消息合并为具有两个替代呈现选项的单个消息
为了将二进制文件发送到旨在处理文本数据的电子邮件服务器,需要在传输之前对它们进行编码。最常见的做法是使用base64,它将二进制数据编码为可打印的ASCII字符。
下面的代码示例显示了如何发送带有PDF文件作为附件的电子邮件:
3.发送多个个性电子邮箱
想象一下,您想向组织成员发送电子邮件,以提醒他们支付其会费。或者,您可能想在班级中向学生发送个性化的电子邮件,其中包含他们最近的作业成绩。这些任务在Python中轻而易举。
制作包含相关个人信息的CSV文件
发送多个个性化电子邮件的简单起点是创建一个包含所有必需的个人信息的CSV(逗号分隔值)文件。CSV文件可以看作是一个简单的表,其中第一行通常包含列标题。
以下是contacts_file.csv文件的内容,我将其与Python代码保存在同一文件夹中。它包含一组虚构人员的姓名,地址和成绩。我使用[email protected]构造来确保所有电子邮件最终都放在我自己的收件箱中,在此示例中为[email protected]:(注:Gmail的一个不错的功能是,您可以使用+号在@号之前添加任何修饰符到您的电子邮件地址。这样并不改变最终地址,所以可以用于模拟多重发送)
注:创建CSV文件时,请确保用逗号分隔值,且周围没有空格。
循环行发送多封电子邮件
下面的代码示例向您展示如何打开CSV文件并在其内容行之间循环(跳过标题行)。为了确保代码在您向所有联系人发送电子邮件之前都能正常工作,我已为每个联系人打印了“向…发送电子邮件”,我们稍后可以将其替换为实际发送电子邮件的功能:
在上面的示例中,使用open(filename)作为file:确保文件在代码块末尾关闭。使用csv.reader()可以轻松地逐行读取CSV文件并提取其值。下一行(阅读器)跳过标题行,以便在阅读器中的名称,电子邮件和成绩下面一行:在每个逗号处拆分后续行,并将结果值存储在当前联系人的字符串名称,电子邮件和成绩中。
注:如果CSV文件中的值在两侧或两侧包含空格,则可以使用.strip()方法将其删除。
个性化内容
您可以使用str.format()填写大括号的占位符,从而在邮件中放入个性化内容。例如,“ hi {name},您{result}您的作业”。format(name =“ 小鱼儿”,result =“ 通过”)将给您“ hi 小鱼儿,您通过了作业”。
代码示例
以下代码示例使您可以向多个联系人发送个性化电子邮件。如上例所示,它循环遍历每个联系人的名称,电子邮件,成绩的CSV文件。
4. 使用 Yagmail 模块快速发送邮件
Yagmail专门设计用于Gmail,它极大地简化了通过友好的API发送电子邮件的过程,如下面的代码示例所示:
此代码示例使用email和smtplib在本示例所需的几行中发送带有PDF附件的电子邮件。
注:设置Yagmail时,您可以按照文档中的说明将Gmail验证添加到操作系统的密钥环。如果您不这样做,Yagmail将在需要时提示您输入密码,并将其自动存储在钥匙圈中。
此外,网络中还有很多有用的付费电子邮件服务(大量群发以及其他功能)
感兴趣的朋友可自行搜索。以下为一些实例
文章到此为止,感兴趣的朋友可以去 Realpython 学习更多有用Python技巧
好了,最后统一结束: