smtpd
--SMTP服务器¶
源代码: Lib/smtpd.py
此模块提供了几个类来实现SMTP(电子邮件)服务器。
存在多个服务器实现;一个是通用的不做任何事情的实现,可以覆盖它,而另两个提供特定的邮件发送策略。
此外,可以扩展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
命令。值None
或0
意味着没有限制。map 是用于连接的套接字映射(最初为空的字典是合适的值)。如果未指定
asyncore
使用全局套接字映射。enable_SMTPUTF8 确定
SMTPUTF8
扩展(定义见 RFC 6531 )应该启用。默认值为False
. 什么时候?True
,SMTPUTF8
被接受为MAIL
命令,当存在被传递给process_message()
在kwargs['mail_options']
名单。 decode_data 和 enable_SMTPUTF8 不能设置为True
同时。decode_data 指定是否应使用UTF-8解码SMTP事务的数据部分。什么时候? decode_data 是
False
(默认),服务器将8BITMIME
延伸 (RFC 6152 )接受BODY=8BITMIME
参数MAIL
命令,当存在时传递给process_message()
在kwargs['mail_options']
名单。 decode_data 和 enable_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_data 和 enable_SMTPUTF8 构造函数参数,以及 关键字参数 参数到
process_message()
什么时候? decode_data 是False
.在 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客户端之间的通信。conn 和 addr 根据下面描述的实例变量。
data_size_limit 指定将在
DATA
命令。值None
或0
意味着没有限制。enable_SMTPUTF8 确定
SMTPUTF8
扩展(定义见 RFC 6531 )应该启用。默认值为False
. decode_data 和 enable_SMTPUTF8 不能设置为True
同时。可以在中指定字典 map 避免使用全局套接字映射。
decode_data 指定是否应使用UTF-8解码SMTP事务的数据部分。默认值为
False
. decode_data 和 enable_SMTPUTF8 不能设置为True
同时。要使用自定义smtpchannel实现,需要重写
SMTPServer.channel_class
你的SMTPServer
.在 3.5 版更改: 这个 decode_data 和 enable_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()
.
这个
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
重置
mailfrom
,rcpttos
和received_data
但不是问候。DATA
将内部状态设置为
DATA
并将客户机的剩余行存储在received_data
直到终结者"\r\n.\r\n"
收到。HELP
返回有关命令语法的最小信息
VRFY
返回代码252(服务器不知道地址是否有效)
EXPN
报告命令未实现。