smtpd --SMTP服务器

源代码: Lib/smtpd.py


此模块提供了几个类来实现SMTP(电子邮件)服务器。

参见

这个 aiosmtpd 建议更换此模块的软件包。它是建立在 asyncio 并提供更简单的API。 smtpd 应视为已弃用。

存在多个服务器实现;一个是通用的不做任何事情的实现,可以覆盖它,而另两个提供特定的邮件发送策略。

此外,可以扩展smtpchannel以实现与SMTP客户机的非常具体的交互行为。

代码支持 RFC 5321 加上 RFC 1870 尺寸和 RFC 6531 smtputf8扩展。

smtpserver对象

class smtpd.SMTPServer(localaddr, remoteaddr, data_size_limit=33554432, map=None, enable_SMTPUTF8=False, decode_data=False)

创建新的 SMTPServer 对象,它绑定到本地地址 本地地址寄存器 . 它会治疗 遥控器 作为上游SMTP中继。两个 本地地址寄存器遥控器 应该是 (host, port) 元组。对象继承自 asyncore.dispatcher ,因此将插入到 asyncore 实例化时的事件循环。

data_size_limit 指定将在 DATA 命令。值 None0 意味着没有限制。

map 是用于连接的套接字映射(最初为空的字典是合适的值)。如果未指定 asyncore 使用全局套接字映射。

enable_SMTPUTF8 确定 SMTPUTF8 扩展(定义见 RFC 6531 )应该启用。默认值为 False . 什么时候? TrueSMTPUTF8 被接受为 MAIL 命令,当存在被传递给 process_message()kwargs['mail_options'] 名单。 decode_dataenable_SMTPUTF8 不能设置为 True 同时。

decode_data 指定是否应使用UTF-8解码SMTP事务的数据部分。什么时候? decode_dataFalse (默认),服务器将 8BITMIME 延伸 (RFC 6152 )接受 BODY=8BITMIME 参数 MAIL 命令,当存在时传递给 process_message()kwargs['mail_options'] 名单。 decode_dataenable_SMTPUTF8 不能设置为 True 同时。

process_message(peer, mailfrom, rcpttos, data, **kwargs)

举起一个 NotImplementedError 例外。在子类中重写它,以便对该消息执行一些有用的操作。在构造函数中作为 遥控器 将作为 _remoteaddr 属性。 peer 是远程主机的地址, 邮件发件人 是信封的创建者, RCTPTOS 是信封收件人和 data 是包含电子邮件内容的字符串(应位于 RFC 5321 格式)。

如果 decode_data 构造函数关键字设置为 True , the data 参数将是Unicode字符串。如果设置为 False ,它将是一个字节对象。

关键字参数 是包含附加信息的字典。如果是空的 decode_data=True 作为init参数提供,否则它包含以下键:

mail_options

所有接收到的参数的列表 MAIL 命令(元素为大写字符串;示例: ['BODY=8BITMIME', 'SMTPUTF8']

rcpt_options

等同于 mail_options 但是为了 RCPT 命令。目前没有 RCPT TO 支持选项,因此目前这将始终是一个空列表。

的实现 process_message 应该使用 **kwargs 接受任意关键字参数的签名,因为将来的功能增强可能会向Kwargs字典添加键。

返回 None 请求正常 250 Ok 响应;否则返回所需的响应字符串 RFC 5321 格式。

channel_class

在子类中重写此项以使用自定义 SMTPChannel 用于管理SMTP客户端。

3.4 新版功能: 这个 map 构造函数参数。

在 3.5 版更改: 本地地址寄存器遥控器 现在可以包含IPv6地址。

3.5 新版功能: 这个 decode_dataenable_SMTPUTF8 构造函数参数,以及 关键字参数 参数到 process_message() 什么时候? decode_dataFalse .

在 3.6 版更改: decode_data 现在是 False 默认情况下。

调试服务器对象

class smtpd.DebuggingServer(localaddr, remoteaddr)

创建新的调试服务器。参数符合 SMTPServer .消息将被丢弃,并在stdout上打印。

pureProxy对象

class smtpd.PureProxy(localaddr, remoteaddr)

创建新的纯代理服务器。参数符合 SMTPServer .一切都会转送给 遥控器 . 请注意,运行这是一个很好的机会,使你成为一个开放式继电器,所以请小心。

mailmanproxy对象

class smtpd.MailmanProxy(localaddr, remoteaddr)

Deprecated since version 3.9, will be removed in version 3.11: MailmanProxy 已弃用,这取决于 Mailman 模块已不存在,因此已损坏。

创建新的纯代理服务器。参数符合 SMTPServer .一切都会转送给 遥控器 ,除非本地mailman配置知道地址,在这种情况下,它将通过mailman处理。请注意,运行这是一个很好的机会,使你成为一个开放式继电器,所以请小心。

smtpchannel对象

class smtpd.SMTPChannel(server, conn, addr, data_size_limit=33554432, map=None, enable_SMTPUTF8=False, decode_data=False)

创建新的 SMTPChannel 对象,用于管理服务器和单个SMTP客户端之间的通信。

connaddr 根据下面描述的实例变量。

data_size_limit 指定将在 DATA 命令。值 None0 意味着没有限制。

enable_SMTPUTF8 确定 SMTPUTF8 扩展(定义见 RFC 6531 )应该启用。默认值为 False . decode_dataenable_SMTPUTF8 不能设置为 True 同时。

可以在中指定字典 map 避免使用全局套接字映射。

decode_data 指定是否应使用UTF-8解码SMTP事务的数据部分。默认值为 False . decode_dataenable_SMTPUTF8 不能设置为 True 同时。

要使用自定义smtpchannel实现,需要重写 SMTPServer.channel_class 你的 SMTPServer .

在 3.5 版更改: 这个 decode_dataenable_SMTPUTF8 已添加参数。

在 3.6 版更改: decode_data 现在是 False 默认情况下。

这个 SMTPChannel 具有以下实例变量:

smtp_server

持有 SMTPServer 产生了这个通道。

conn

保留连接到客户端的套接字对象。

addr

保留客户端地址,由返回的第二个值 socket.accept

received_lines

保存从客户机接收的行字符串列表(使用UTF-8解码)。这些线条有 "\r\n" 行尾转换为 "\n" .

smtp_state

保持通道的当前状态。这也可以是 COMMAND 最初,然后 DATA 在客户端发送“数据”行之后。

seen_greeting

保存一个字符串,其中包含客户端在其“helo”中发送的问候语。

mailfrom

保存一个字符串,该字符串包含来自客户机的“mail from:”行中标识的地址。

rcpttos

保存一个字符串列表,其中包含来自客户机的“rcpt to:”行中标识的地址。

received_data

保留一个字符串,该字符串包含在数据状态期间客户端发送的所有数据,最多不包括终止 "\r\n.\r\n" .

fqdn

保留由返回的服务器的完全限定域名 socket.getfqdn() .

peer

保留由返回的客户端对等方的名称 conn.getpeername() 在哪里? connconn .

这个 SMTPChannel 通过调用名为 smtp_<command> 从客户机接收命令行时。嵌入底座 SMTPChannel 类是处理以下命令(并适当地响应这些命令)的方法:

命令

采取的行动

HELO

接受客户端的问候并将其存储在 seen_greeting . 将服务器设置为基本命令模式。

EHLO

接受客户端的问候并将其存储在 seen_greeting . 将服务器设置为扩展命令模式。

NOOP

不采取任何行动。

QUIT

完全关闭连接。

MAIL

接受“mail-from:”语法并将提供的地址存储为 mailfrom . 在扩展命令模式下,接受 RFC 1870 大小属性,并根据 data_size_limit .

RCPT

接受“rcpt to:”语法并将提供的地址存储在 rcpttos 名单。

RSET

重置 mailfromrcpttosreceived_data 但不是问候。

DATA

将内部状态设置为 DATA 并将客户机的剩余行存储在 received_data 直到终结者 "\r\n.\r\n" 收到。

HELP

返回有关命令语法的最小信息

VRFY

返回代码252(服务器不知道地址是否有效)

EXPN

报告命令未实现。