smtplib

源代码: Lib / smtplib.py

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

class smtplib.SMTP([host[, port[, local_hostname[, timeout]]]])

一个SMTP实例封装了一个SMTP连接。它具有支持完整的SMTP和ESMTP操作的方法。如果给出了可选的主机和端口参数,则connect()在初始化期间使用这些参数调用SMTP 方法。如果指定,则使用local_hostname作为HELO / EHLO命令中本地主机的FQDN。否则,使用本地主机名socket.getfqdn()。如果connect()调用返回成功代码以外的任何其他内容,SMTPConnectError则引发。可选的timeout参数指定阻止诸如连接尝试(如果未指定,将使用全局默认超时设置)等操作的超时(以秒为单位)。如果超时过期,socket.timeout则提高。

对于正常使用,您只需要初始化/连接sendmail(),和quit()方法。下面是一个例子。

在版本2.6中更改:添加了超时

class smtplib.SMTP_SSL([host[, port[, local_hostname[, keyfile[, certfile[, timeout]]]]]])

一个SMTP_SSL实例的行为与实例的行为完全相同SMTPSMTP_SSL应该用于需要从连接开始使用SSL并且使用starttls()不合适的情况。如果主机没有指定,则使用本地主机。如果省略端口,则使用标准的SMTP-over-SSL端口(465)。local_hostname的含义与它对SMTP类的含义相同。密钥文件certfile也是可选的,并且可以包含用于SSL连接的PEM格式的私钥和证书链文件。可选超时参数指定阻止诸如连接尝试等操作的超时值(以秒为单位)(如果未指定,则将使用全局默认超时设置)。如果超时过期,socket.timeout则提高。

2.6版本中的新功能。

class smtplib.LMTP([host[, port[, local_hostname]]])

LMTP协议与ESMTP非常相似,主要基于标准的SMTP客户端。对LMTP使用Unix套接字是很常见的,所以我们的connect()方法必须支持以及常规的主机:端口服务器。local_hostname的含义与它对SMTP类的含义相同。要指定一个Unix套接字,您必须使用绝对路径作为主机,以'/'开头。

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

2.6版本中的新功能。

一个很好的例外选择也被定义为:

exception smtplib.SMTPException

此模块提供的所有其他例外的基本例外类。

exception smtplib.SMTPServerDisconnected

当服务器意外断开连接时,或者在将SMTP连接到服务器之前尝试使用实例时,会引发此异常。

exception smtplib.SMTPResponseException

包含SMTP错误代码的所有异常的基类。当SMTP服务器返回错误代码时,会在某些情况下生成这些例外情况。错误代码存储在错误的smtp_code属性中,并且smtp_error属性设置为错误消息。

exception smtplib.SMTPSenderRefused

发件人地址被拒绝。除了所有SMTPResponseException例外设置的属性之外,这会将“发件人”设置为SMTP服务器拒绝的字符串。

exception smtplib.SMTPRecipientsRefused

所有收件人地址被拒绝 每个收件人的错误都可以通过该属性进行访问,该属性recipientsSMTP.sendmail()回报完全一样。

exception smtplib.SMTPDataError

SMTP服务器拒绝接受消息数据。

exception smtplib.SMTPConnectError

在建立与服务器的连接期间发生错误。

exception smtplib.SMTPHeloError

服务器拒绝了我们的HELO消息。

exception smtplib.SMTPAuthenticationError

SMTP认证出错了。很可能服务器不接受提供的用户名/密码组合。

1. SMTP对象

一个SMTP实例有以下方法:

SMTP.set_debuglevel(level)

设置调试输出级别。级别的真值会导致连接的调试消息以及发送到服务器和从服务器接收的所有消息。

SMTP.docmd(cmd[, argstring])

发送命令cmd到服务器。可选参数argstring简单地连接到命令,由空格分隔。

这将返回一个由数字响应代码和实际响应行组成的2元组(多行响应连接成一个长行)。

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

如果在等待答复时到服务器的连接丢失,SMTPServerDisconnected则会引发。

SMTP.connect([host[, port]])

连接到给定端口上的主机。默认值是通过标准SMTP端口(25)连接到本地主机。如果主机名以冒号(':')后跟一个数字结尾,则该后缀将被剥离,并将该数字解释为要使用的端口号。如果在实例化过程中指定了主机,则此方法由构造函数自动调用。返回服务器在其连接响应中发送的响应代码和消息的2元组。

SMTP.helo([hostname])

使用自己的身份识别SMTP服务器HELO。主机名参数默认为本地主机的完全限定域名。服务器返回的消息存储为helo_resp对象的属性。

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

SMTP.ehlo([hostname])

使用自己的身份识别ESMTP服务器EHLO。主机名参数默认为本地主机的完全限定域名。检查ESMTP选项的响应并将其存储以供使用has_extn()。还设置了几个信息属性:服务器返回的消息存储为ehlo_resp属性,does_esmtp根据服务器是否支持ESMTP esmtp_features将其设置为true或false,并且将是包含此服务器支持的SMTP服务扩展名的字典,以及他们的参数(如果有的话)。

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

SMTP.ehlo_or_helo_if_needed()

此方法调用ehlo()和或者helo()如果之前没有EHLOHELO命令此会话。它EHLO首先尝试ESMTP 。

SMTPHeloError服务器没有正确回复HELO问候。

2.6版本中的新功能。

SMTP.has_extn(name)

返回True如果名称是在设置服务器返回的SMTP服务扩展的,False否则。案例被忽略。

SMTP.verify(address)

使用SMTP检查此服务器上地址的有效性VRFY。如果用户地址有效,则返回由代码250和完整RFC 822地址(包括人名)组成的元组。否则,返回400或更大的SMTP错误代码和错误字符串。

注意

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

SMTP.login(user, password)

登录需要认证的SMTP服务器。参数是用于验证的用户名和密码。如果之前没有EHLOHELO命令此会话,则此方法EHLO首先尝试使用ESMTP 。如果认证成功,此方法将正常返回,或者可能引发以下例外情况:

SMTPHeloError服务器没有正确回复HELO问候。SMTPAuthenticationError服务器不接受用户名/密码组合。SMTPException没有找到合适的验证方法。SMTP.starttls([keyfile[, certfile]])

将SMTP连接置于TLS(传输层安全性)模式。随后的所有SMTP命令都将被加密。你应该再打电话ehlo()

如果提供密钥文件certfile,则会将其传递给socket模块的ssl()功能。

如果之前没有EHLOHELO命令此会话,则此方法EHLO首先尝试使用ESMTP 。

在版本2.6中更改。

SMTPHeloError服务器没有正确回复HELO问候。SMTPException该服务器不支持STARTTLS扩展名。

在版本2.6中更改。

RuntimeError您的Python解释器不支持SSL / TLS支持。SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options])

发送邮件。所需要的参数是一个RFC 822从地址字符串的列表,RFC 822到地址字符串(裸串将被视为与1个地址的列表),以及消息字符串。调用者可以传递一个ESMTP选项列表(例如8bitmimeMAIL FROM作为mail_options在命令中使用DSN应该与所有RCPT命令一起使用的ESMTP选项(如命令)可以作为rcpt_options传递。(如果您需要使用不同的ESMTP选项不同的收件人必须使用低级别的方法,例如mail()rcpt()data()发送消息。)

注意

from_addrto_addrs参数被用于构建由传输代理使用的消息信封。在SMTP不修改的消息头以任何方式。

如果之前没有EHLOHELO命令此会话,则此方法EHLO首先尝试使用ESMTP 。如果服务器执行ESMTP,则将消息大小和每个指定的选项传递给它(如果选项位于服务器通告的功能集中)。如果EHLO失败,HELO则会尝试并取消ESMTP选项。

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

此方法可能会引发以下例外情况:

SMTPRecipientsRefused所有收件人都被拒绝。没有人收到邮件。recipients异常对象的属性是一个带有关于被拒绝的收件人的信息的字典(例如至少有一个收件人被接受时返回的信息)。SMTPHeloError服务器没有正确回复HELO问候。SMTPSenderRefused服务器不接受from_addrSMTPDataError服务器回复了一个意外的错误代码(拒绝收件人除外)。

除非另有说明,否则即使发生异常,连接也会打开。

SMTP.quit()

终止SMTP会话并关闭连接。返回SMTP QUIT命令的结果。

在版本2.6中更改:返回一个值。

对应于标准SMTP / ESMTP命令低级别的方法HELPRSETNOOPMAILRCPT,和DATA也被支持。通常这些不需要直接调用,所以它们在这里没有记录。有关详细信息,请查阅模块代码。

2. SMTP示例

本示例提示用户输入邮件信封('收件人'和'发件人'地址)中需要的地址以及要发送的邮件。请注意,消息中包含的标题必须包含在输入的消息中; 此示例不执行任何RFC 822标题的处理。特别是,“收件人”和“发件人”地址必须明确包含在邮件标题中。

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()

注意

一般而言,您将希望使用该email包的功能来构建电子邮件消息,然后您可以将其转换为字符串并通过发送sendmail(); 看电子邮件:例子。

扫码关注云+社区

领取腾讯云代金券