20.12. smtplib-SMTP 协议 Client 端

源代码: Lib/smtplib.py


smtplib模块定义 SMTPClient 端会话对象,该对象可用于pass SMTP 或 ESMTP 侦听器守护程序将邮件发送到任何 Internet 计算机。有关 SMTP 和 ESMTP 操作的详细信息,请参阅 RFC 821(简单邮件传输协议)和 RFC 1869(SMTP 服务扩展)。

对于正常使用,您只需要初始化/连接,sendmail()SMTP.quit()方法。下面包括一个示例。

在 2.6 版中进行了更改:添加了“超时”。

2.6 版的新Function。

使用常规 SMTP 机制支持身份验证。使用 Unix 套接字时,LMTP 通常不支持或不需要任何身份验证,但是您的里程可能会有所不同。

2.6 版的新Function。

还定义了一个很好的 exception 选择:

See also

  • RFC 821-简单邮件传输协议

  • SMTP 的协议定义。本文档介绍了 SMTP 的型号,操作过程和协议详细信息。

  • RFC 1869-SMTP 服务扩展

  • SMTP 的 ESMTP 扩展的定义。本文档介绍了用于使用新命令扩展 SMTP,支持动态发现服务器提供的命令的框架,并定义了一些其他命令。

20.12.1. SMTP 对象

SMTP实例具有以下方法:

这将返回一个由数字响应代码和实际响应行组成的 2Tuples(多行响应合并为一条长行.)

在正常操作中,不必显式调用此方法。它用于实现其他方法,可能对测试私有扩展有用。

如果在 await 答复时与服务器的连接丢失,则将引发SMTPServerDisconnected

在正常操作中,不必显式调用此方法。必要时它将由sendmail()隐式调用。

除非您希望在发送邮件之前使用has_extn(),否则不必显式调用此方法。必要时它将由sendmail()隐式调用。

2.6 版的新Function。

Note

许多站点禁用 SMTP VRFY来阻止垃圾邮件发送者。

如果提供了* keyfile certfile *,它们将被传递到socket模块的ssl()函数。

如果此会话没有先前的EHLOHELO命令,则此方法首先try ESMTP EHLO

在 2.6 版中进行了更改。

在 2.6 版中进行了更改。

Note

  • from_addr to_addrs *参数用于构造传输代理使用的消息信封。 SMTP不会以任何方式修改邮件头。

如果此会话没有先前的EHLOHELO命令,则此方法首先try ESMTP EHLO。如果服务器使用 ESMTP,则将向其传递邮件大小和每个指定的选项(如果该选项在服务器发布的Function集中)。如果EHLO失败,将tryHELO并抑制 ESMTP 选项。

如果至少一个收件人接受了该邮件,则此方法将正常返回。否则会引发异常。也就是说,如果此方法未引发异常,则应该有人收到您的邮件。如果此方法没有引发异常,它将返回一个字典,其中每个拒绝的接收者都有一个条目。每个条目都包含一个 SMTP 错误代码的 Tuples 以及服务器发送的附带错误消息。

此方法可能会引发以下异常:

除非另有说明,否则即使出现异常也将打开连接。

在 2.6 版中进行了更改:返回一个值。

还支持与标准 SMTP/ESMTP 命令HELPRSETNOOPMAILRCPTDATA对应的低级方法。通常,这些不需要直接调用,因此这里没有记录。有关详细信息,请查阅模块代码。

20.12.2. SMTP 范例

本示例提示用户 Importing 邮件信封中所需的地址(“收件人”和“发件人”地址)以及要传递的邮件。请注意,要包含在消息中的 Headers 必须包含在 Importing 的消息中;本示例不对 RFC 822Headers 进行任何处理。特别是,“收件人”和“发件人”地址必须明确包含在消息头中。

import smtplib

def prompt(prompt):
    return raw_input(prompt).strip()

fromaddr = prompt("From: ")
toaddrs  = prompt("To: ").split()
print "Enter message, end with ^D (Unix) or ^Z (Windows):"

# Add the From: and To: headers at the start!
msg = ("From: %s\r\nTo: %s\r\n\r\n"
       % (fromaddr, ", ".join(toaddrs)))
while 1:
    try:
        line = raw_input()
    except EOFError:
        break
    if not line:
        break
    msg = msg + line

print "Message length is " + repr(len(msg))

server = smtplib.SMTP('localhost')
server.set_debuglevel(1)
server.sendmail(fromaddr, toaddrs, msg)
server.quit()

Note

通常,您将需要使用email软件包的Function来构造电子邮件,然后可以将其转换为字符串并passsendmail()发送;参见email: Examples

首页