发送邮件¶
Twisted 提供了许多发送电子邮件的方式,但最简单的是 sendmail
。它旨在作为 smtplib.SMTP
的 sendmail
方法的近乎直接的替代品,它提供了以最小的麻烦或配置通过 SMTP/ESMTP 发送电子邮件的能力。
要充分利用本文档,需要了解 Twisted 的 Deferreds。
通过 SMTP 发送电子邮件¶
虽然不安全,但一些电子邮件系统仍然使用纯 SMTP 发送电子邮件。纯 SMTP 没有身份验证,没有传输安全(电子邮件以纯文本形式传输),并且不应在不受信任的网络上进行。
sendmail
的位置参数按顺序是
您要发送邮件到的 SMTP/ESMTP 服务器
您要发送邮件的电子邮件地址
您要发送邮件到的电子邮件地址的
list
邮件。
以下示例展示了这些参数的实际应用。
from twisted.internet.task import react
from twisted.mail.smtp import sendmail
def main(reactor):
d = sendmail(
"myinsecuremailserver.example.com",
"[email protected]",
["[email protected]", "[email protected]"],
"This is my super awesome email, sent with Twisted!",
)
d.addBoth(print)
return d
react(main)
假设其中的值被替换为真实的电子邮件和真实的 SMTP 服务器,它将向指定的两个地址发送电子邮件,并打印返回状态。
通过 ESMTP 发送电子邮件¶
扩展 SMTP (ESMTP) 是 SMTP 的改进版本,大多数现代邮件服务器都使用它。与 SMTP 不同,ESMTP 支持身份验证和传输安全(电子邮件在传输过程中被加密)。如果您希望通过 GMail/Google Apps 或 Outlook.com/Office 365 等服务发送邮件,则必须使用 ESMTP。
使用 ESMTP 需要更多选项 - 通常默认端口 25 未打开,因此您必须找出您的电子邮件提供商的启用 TLS 的 ESMTP 端口。它还允许使用用户名和密码进行身份验证。
以下示例展示了 sendmail
的部分 ESMTP 功能。
from twisted.internet.task import react
from twisted.mail.smtp import sendmail
def main(reactor):
d = sendmail(
"smtp.gmail.com",
"[email protected]",
["[email protected]", "[email protected]"],
"This is my super awesome email, sent with Twisted!",
port=587,
username="[email protected]",
password="*********",
)
d.addBoth(print)
return d
react(main)
假设您拥有帐户 [email protected]
,这将向 [email protected]
和 [email protected]
发送电子邮件,并打印出类似以下内容(为了清晰起见,已格式化)
(2, [('[email protected]', 250, '2.1.5 OK hz13sm11691456pac.6 - gsmtp'),
('[email protected]', 250, '2.1.5 OK hz13sm11691456pac.6 - gsmtp')])
sendmail
返回一个 2 元组,包含成功发送的电子邮件数量(注意,这是从您到您指定的服务器,而不是到收件人 - 电子邮件可能仍然在该服务器和收件人之间丢失)以及发送邮件的状态列表。每个状态都是一个 3 元组,包含发送到的地址、SMTP 状态代码和服务器响应。
发送复杂电子邮件¶
有时您想发送更复杂的电子邮件 - 包含标题或附件的电子邮件。 sendmail
支持使用 Python 的 email.Message
,它允许您创建复杂的电子邮件
from email.mime.text import MIMEText
from twisted.internet.task import react
from twisted.mail.smtp import sendmail
def main(reactor):
me = "[email protected]"
to = ["[email protected]", "[email protected]"]
message = MIMEText("This is my super awesome email, sent with Twisted!")
message["Subject"] = "Twisted is great!"
message["From"] = me
message["To"] = ", ".join(to)
d = sendmail(
"smtp.gmail.com",
me,
to,
message,
port=587,
username=me,
password="*********",
requireAuthentication=True,
requireTransportSecurity=True,
)
d.addBoth(print)
return d
react(main)
有关如何使用 Message
的更多信息,请参阅 该模块的 Python 文档。
强制传输安全¶
为了防止降级攻击,您可以将 requireTransportSecurity=True
传递给 sendmail
。这意味着您的电子邮件不会以纯文本形式传输。
例如
sendmail("smtp.gmail.com", me, to, message,
port=587, username=me, password="*********",
requireTransportSecurity=True)
结论¶
在本文件中,您已经了解了如何