– 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>
的方法来操作来自客户端的命令行内置于底座SMTPChannel
class是处理以下命令的方法(并适当地响应它们):命令 采取的行动 HELO 接受来自客户的问候并将其存放在 seen_greeting
。将服务器设置为基本命令模式.EHLO 接受来自客户端的问候并将其存储在 seen_greeting
中。将服务器设置为扩展命令模式.NOOP 不采取行动. QUIT 干净地关闭连接. MAIL 接受“MAIL FROM:”语法并将提供的地址存储为 mailfrom
。在扩展命令模式下,接受 RFC 1870 SIZE属性并根据data_size_limit.RCPT 的值适当响应接受“RCPT TO:”语法并将提供的地址存储在 rcpttos
list.中RSET 重置 mailfrom
,rcpttos
和received_data
但不是问候//DATA 将内部状态设置为 DATA
并将来自客户端的剩余行存储在received_data
中,直到终止符"\r\n.\r\n"
收到了HELP 返回命令语法的最小信息 VRFY 返回代码252(服务器不知道地址是否有效) EXPN 报告命令没有实现.
评论被关闭。