发送邮件

Twisted 提供了许多发送电子邮件的方式,但最简单的是 sendmail。它旨在作为 smtplib.SMTPsendmail 方法的近乎直接的替代品,它提供了以最小的麻烦或配置通过 SMTP/ESMTP 发送电子邮件的能力。

要充分利用本文档,需要了解 Twisted 的 Deferreds。

通过 SMTP 发送电子邮件

虽然不安全,但一些电子邮件系统仍然使用纯 SMTP 发送电子邮件。纯 SMTP 没有身份验证,没有传输安全(电子邮件以纯文本形式传输),并且不应在不受信任的网络上进行。

sendmail 的位置参数按顺序是

  • 您要发送邮件到的 SMTP/ESMTP 服务器

  • 您要发送邮件的电子邮件地址

  • 您要发送邮件到的电子邮件地址的 list

  • 邮件。

以下示例展示了这些参数的实际应用。

sendmail_smtp.py

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 功能。

sendmail_gmail.py

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,它允许您创建复杂的电子邮件

sendmail_message.py

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)

结论

在本文件中,您已经了解了如何

  1. 使用 sendmail 通过 SMTP 发送电子邮件。

  2. 使用 sendmail 通过加密和身份验证的 ESMTP 发送电子邮件。

  3. 使用标准库的 email.Message 功能发送包含主题行的“复杂”电子邮件。

  4. 强制使用 sendmail 发送的电子邮件的传输安全。