smtpd-SMTP 服务器

源代码: Lib/smtpd.py


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

See also

推荐使用aiosmtpd软件包替代此模块。它基于asyncio,并提供了更简单的 API。 smtpd应该被视为已弃用。

存在几种服务器实施方式。一种是通用的什么都不做的实现,可以将其重写,而其他两种则提供特定的邮件发送策略。

另外,可以扩展 SMTPChannel 以实现与 SMTPClient 端的非常特定的交互行为。

该代码支持 RFC 5321,以及 RFC 1870 SIZE 和 RFC 6531 SMTPUTF8extensions。

SMTPServer Objects

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

Note

  • mail_options :

  • a list of all received parameters to the MAIL command (the elements are uppercase strings; example: ['BODY=8BITMIME', 'SMTPUTF8'] ).

  • rcpt_options :

  • 与* mail_options *相同,但适用于RCPT命令。当前不支持RCPT TO选项,因此,此列表始终为空。

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

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

3.4 版中的新Function:* map *构造函数参数。

在版本 3.5 中进行了更改:* localaddr remoteaddr *现在可能包含 IPv6 地址。

3.5 版中的新增Function:* decode_data enable_SMTPUTF8 构造函数参数,以及 decode_data False时对process_message() kwargs *参数。

在版本 3.6 中更改:默认情况下,* decode_data *现在为False

DebuggingServer Objects

PureProxy Objects

MailmanProxy Objects

SMTPChannel Objects

可以在* map *中指定字典,以避免使用全局套接字 Map。

要使用自定义 SMTPChannel 实现,您需要覆盖SMTPServerSMTPServer.channel_class

在版本 3.5 中进行了更改:添加了* decode_data enable_SMTPUTF8 *参数。

在版本 3.6 中更改:默认情况下,* decode_data *现在为False

SMTPChannel具有以下实例变量:

SMTPChannelpass从 Client 端接收到命令行来调用名为smtp_<command>的方法来进行操作。内置在SMTPChannel类中的是用于处理以下命令(并适当响应它们)的方法:

Command Action taken
HELO 接受来自 Client 的问候并将其存储在seen_greeting中。将服务器设置为基本命令模式。
EHLO 接受来自 Client 的问候并将其存储在seen_greeting中。将服务器设置为扩展命令模式。
NOOP 不采取任何措施。
QUIT 干净地关闭连接。
MAIL 接受“ MAIL FROM:”语法,并将提供的地址存储为mailfrom。在扩展命令模式下,接受 RFC 1870 SIZE 属性,并根据* data_size_limit *的值进行适当响应。
RCPT 接受“ RCPT TO:”语法,并将提供的地址存储在rcpttos列表中。
RSET 重置mailfromrcpttosreceived_data,但不重置问候语。
DATA 将内部状态设置为DATA,并将来自 Client 端的剩余行存储在received_data中,直到接收到终止符"\r\n.\r\n"
HELP 返回有关命令语法的最少信息
VRFY 返回代码 252(服务器不知道该地址是否有效)
EXPN 报告该命令未实现。
首页