smtpdSMTP服务器

源代码:LIB / smtpd.py


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

也可以看看

aiosmtpd软件包是此模块的推荐替代品。它基于asyncio并提供了更直接的API。smtpd应该被认为是弃用的

存在多个服务器实现;一个是genericdo-nothing实现,可以被覆盖,而另外两个提供特定的邮件发送策略.

此外,SMTPChannel可以扩展为使用SMTP客户端实现非常具体的交互行为.

代码支持 RFC 5321 ,加上 RFC 1870 SIZE和RFC 6531 SMTPUTF8 extensions.

SMTPServer Objects

class smtpd.SMTPServerlocaladdr, remoteaddr, data_size_limit=33554432, map=None, enable_SMTPUTF8=False, decode_data=False

创建一个新的SMTPServer对象,哪个绑定到本地地址localaddr。它将remoteaddr视为上游SMTP中继者。都localaddrremoteaddr应该是(主持人,端口)元组。该对象继承自asyncore.dispatcher,因此将自己插入到asyncore的实例化事件循环中.

data_size_limit指定DATA命令中将接收的最大字节数。值None0表示nolimit.

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

enable_SMTPUTF8确定是否SMTPUTF8扩展(定义为RFC 6531 )应该启用。默认是False。什么时候 True, SMTPUTF8被接受作为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将作为_remoteaddr属性提供。peer是远程主持人的地址,mailfrom是信封主持人,rcpttos是信封收件人和data是一个包含电子邮件内容的字符串(应该是 RFC 5321 格式).

如果设置了decode_data constructor关键字到Truedata参数将是一个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:localaddrremoteaddr现在可能包含IPv6地址

新版本3.5: decode_dataenable_SMTPUTF8构造函数参数,kwargs参数process_message()decode_dataFalse.

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

DebuggingServer Objects

class smtpd.DebuggingServerlocaladdr, remoteaddr

创建一个新的调试服务器。参数按SMTPServer.Messages将被丢弃,并打印在stdout上.

PureProxy Objects

class smtpd.PureProxylocaladdr, remoteaddr

创建一个新的纯代理服务器。参数是按SMTPServer。所有内容都会被转发到remoteaddr。请注意,运行它有一个很好的机会让你成为一个开放的继电器,所以请小心.

MailmanProxy Objects

class smtpd.MailmanProxylocaladdr, remoteaddr

创建一个新的纯代理服务器。参数是按SMTPServer。除非本地邮递员配置关于地址,否则所有内容都将被转发到remoteaddr,在这种情况下,它将通过mailman处理。请注意,这很有可能让你成为一个开放的继电器,所以请尽快.

SMTPChannel对象

class smtpd.SMTPChannelserver, conn, addr, data_size_limit=33554432, map=None, enable_SMTPUTF8=False, decode_data=False

创建一个新的SMTPChannel管理服务器与单个SMTP客户端之间通信的对象.

connaddr按照下面描述的实例变量.

data_size_limit指定最大值DATA命令中将接收的字节数。值None0表示nolimit.

enable_SMTPUTF8决定是否SMTPUTF8扩展(定义为 RFC 6531 )应该启用。默认是False.decode_data并且enable_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在客户端发送“DATA”行后

seen_greeting

包含一个包含发送的问候语的字符串客户在其“HELO”.

mailfrom

保存一个字符串,其中包含客户端“MAIL FROM:”行中标识的地址.

rcpttos

包含一个字符串列表,其中包含客户端“RCPT TO:”行中标识的地址.

received_data

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

fqdn

保存由socket.getfqdn().

peer

保存conn.getpeername()返回的客户端对等体的名称connconn.

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:”语法并将提供的地址存储在rcpttos list.
中RSET 重置mailfrom, rcpttosreceived_data但不是问候
//DATA 将内部状态设置为DATA并将来自客户端的剩余行存储在received_data中,直到终止符"\r\n.\r\n"收到了
HELP 返回命令语法的最小信息
VRFY 返回代码252(服务器不知道地址是否有效)
EXPN 报告命令没有实现.

评论被关闭。