– SMTP服务器 – Internet协议和支持(Python教程)(参考资料)
smtpd– SMTP服务器
源代码:LIB / smtpd.py
也可以看看
aiosmtpd软件包是此模块的推荐替代品。它基于asyncio并提供了更直接的API。smtpd应该被认为是弃用的
存在多个服务器实现;一个是genericdo-nothing实现,可以被覆盖,而另外两个提供特定的邮件发送策略.
此外,SMTPChannel可以扩展为使用SMTP客户端实现非常具体的交互行为.
代码支持 RFC 5321 ,加上 RFC 1870 SIZE和RFC 6531 SMTPUTF8 extensions.
SMTPServer Objects
- class
smtpd.SMTPServer(localaddr, remoteaddr, data_size_limit=33554432, map=None, enable_SMTPUTF8=False, decode_data=False) -
创建一个新的
SMTPServer对象,哪个绑定到本地地址localaddr。它将remoteaddr视为上游SMTP中继者。都localaddr和remoteaddr应该是(主持人,端口)元组。该对象继承自asyncore.dispatcher,因此将自己插入到asyncore的实例化事件循环中.data_size_limit指定
DATA命令中将接收的最大字节数。值None或0表示nolimit.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将作为_remoteaddr属性提供。peer是远程主持人的地址,mailfrom是信封主持人,rcpttos是信封收件人和data是一个包含电子邮件内容的字符串(应该是 RFC 5321 格式).如果设置了decode_data constructor关键字到
True,data参数将是一个unicode字符串。如果设置为False,则它将是一个字节对象.kwargs是包含附加信息的字典。如果
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 format.
channel_class-
中的所需响应字符串在子类中使用自定义
SMTPChannel来管理SMTP客户端.
版本3.4中新增: map构造函数参数
更改版本3.5:localaddr和remoteaddr现在可能包含IPv6地址
新版本3.5: decode_data和enable_SMTPUTF8构造函数参数,kwargs参数
process_message()当decode_data是False.在版本3.6中更改:decode_data现在是
False默认情况下
DebuggingServer Objects
- class
smtpd.DebuggingServer(localaddr, remoteaddr) -
创建一个新的调试服务器。参数按
SMTPServer.Messages将被丢弃,并打印在stdout上.
PureProxy Objects
- class
smtpd.PureProxy(localaddr, remoteaddr) -
创建一个新的纯代理服务器。参数是按
SMTPServer。所有内容都会被转发到remoteaddr。请注意,运行它有一个很好的机会让你成为一个开放的继电器,所以请小心.
MailmanProxy Objects
- class
smtpd.MailmanProxy(localaddr, remoteaddr) -
创建一个新的纯代理服务器。参数是按
SMTPServer。除非本地邮递员配置关于地址,否则所有内容都将被转发到remoteaddr,在这种情况下,它将通过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表示nolimit.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在客户端发送“DATA”行后
seen_greeting-
包含一个包含发送的问候语的字符串客户在其“HELO”.
mailfrom-
保存一个字符串,其中包含客户端“MAIL FROM:”行中标识的地址.
rcpttos-
包含一个字符串列表,其中包含客户端“RCPT TO:”行中标识的地址.
received_data-
保存包含客户端在DATA状态期间发送的所有数据的字符串,最多但不包括终止
"\r\n.\r\n".
fqdn-
保存由
socket.getfqdn().
peer-
保存
conn.getpeername()返回的客户端对等体的名称conn是conn.
SMTPChannel通过在接收时调用名为smtp_<command>的方法来操作来自客户端的命令行内置于底座SMTPChannelclass是处理以下命令的方法(并适当地响应它们):命令 采取的行动 HELO 接受来自客户的问候并将其存放在 seen_greeting。将服务器设置为基本命令模式.EHLO 接受来自客户端的问候并将其存储在 seen_greeting中。将服务器设置为扩展命令模式.NOOP 不采取行动. QUIT 干净地关闭连接. MAIL 接受“MAIL FROM:”语法并将提供的地址存储为 mailfrom。在扩展命令模式下,接受 RFC 1870 SIZE属性并根据data_size_limit.RCPT 的值适当响应接受“RCPT TO:”语法并将提供的地址存储在 rcpttoslist.中RSET 重置 mailfrom,rcpttos和received_data但不是问候//DATA 将内部状态设置为 DATA并将来自客户端的剩余行存储在received_data中,直到终止符"\r\n.\r\n"收到了HELP 返回命令语法的最小信息 VRFY 返回代码252(服务器不知道地址是否有效) EXPN 报告命令没有实现.
评论被关闭。