smtpd
--- SMTP 服務(wù)器?
源代碼: Lib/smtpd.py
該模塊提供了幾個(gè)類(lèi)來(lái)實(shí)現 SMTP (電子郵件)服務(wù)器。
Deprecated since version 3.6, removed in version 3.12: The smtpd
module is deprecated
(see PEP 594 for details).
The aiosmtpd package is a recommended
replacement for this module. It is based on asyncio
and provides a
more straightforward API.
有幾個(gè)服務(wù)器的實(shí)現;一個(gè)是通用的無(wú)為實(shí)現,可以被重寫(xiě),而另外兩個(gè)則提供特定的郵件發(fā)送策略。
此外, SMTPChannel 可以被擴展以實(shí)現與 SMTP 客戶(hù)端非常具體的交互行為。
該代碼支持 RFC 5321 ,加上 RFC 1870 SIZE和 RFC 6531 SMTPUTF8 擴展。
SMTPServer 對象?
- class smtpd.SMTPServer(localaddr, remoteaddr, data_size_limit=33554432, map=None, enable_SMTPUTF8=False, decode_data=False)?
新建一個(gè)
SMTPServer
對象,它會(huì )綁定到本機地址 localaddr。 它將把 remoteaddr 當作上游 SMTP 中繼器。 localaddr 和 remoteaddr 都應當是 (host, port) 元組。 該對象繼承自asyncore.dispatcher
,因而會(huì )在實(shí)例化時(shí)將自己插入到asyncore
的事件循環(huán)。data_size_limit 指定將在
DATA
命令中被接受的最大字節數。 值為None
或0
表示無(wú)限制。map 是用于連接的套接字映射(初始為空的字典是適當的值)。 如果未指定則會(huì )使用
asyncore
全局套接字映射。enable_SMTPUTF8 決定是否應當啟用
SMTPUTF8
擴展(如 RFC 6531 所定義的。 默認值為False
。 當設為True
時(shí),會(huì )接受SMTPUTF8
作為MAIL
命令的形參并在被提供時(shí)將其傳給kwargs['mail_options']
列表中的process_message()
。 decode_data 和 enable_SMTPUTF8 不可同時(shí)被設為True
。decode_data 指明 SMTP 事務(wù)的數據部分是否應當使用 UTF-8 來(lái)解碼。 當 decode_data 為
False
時(shí)(默認值),服務(wù)器會(huì )聲明8BITMIME
擴展 (RFC 6152),接受來(lái)自MAIL
命令的BODY=8BITMIME
形參,并在該形參存在時(shí)將其傳給kwargs['mail_options']
列表中的process_message()
方法。 decode_data 和 enable_SMTPUTF8 不可同時(shí)被設為True
。- process_message(peer, mailfrom, rcpttos, data, **kwargs)?
引發(fā)
NotImplementedError
異常。 請在子類(lèi)中重載此方法以實(shí)際運用此消息。 在構造器中作為 remoteaddr 傳入的任何東西都可以_remoteaddr
屬性的形式來(lái)訪(fǎng)問(wèn)。 peer 是遠程主機的地址,mailfrom 是封包的發(fā)送方,rcpttos 是封包的接收方而 data 是包含電子郵件內容的字符串(應該為 RFC 5321 格式)。如果構造器關(guān)鍵字參數 decode_data 被設為
True
,則 data 參數將為 Unicode 字符串。 如果被設為False
,則將為字節串對象。kwargs 是包含附加信息的字典。 如果給出
decode_data=True
作為初始參數則該字典為空,否則它會(huì )包含以下的鍵:- mail_options:
由
MAIL
命令所接收的所有參數組成的列表 (其元素為大寫(xiě)形式的字符串;例如:['BODY=8BITMIME', 'SMTPUTF8']
)。- rcpt_options:
與 mail_options 類(lèi)似但是針對
RCPT
命令。 目前不支持任何RCPT TO
選項,因此其值將總是為空列表。
process_message
的實(shí)現應當使用**kwargs
簽名來(lái)接收任意關(guān)鍵字參數,因為未來(lái)的增強特性可能會(huì )向 kwargs 字典添加新鍵。返回
None
以請求一個(gè)正常的250 Ok
響應;在其他情況下則以 RFC 5321 格式返回所需的響應字符串。
- channel_class?
重載這個(gè)子類(lèi)以使用自定義的
SMTPChannel
來(lái)管理 SMTP 客戶(hù)端。
3.4 新版功能: map 構造器參數。
在 3.5 版更改: localaddr 和 remoteaddr 現在可以包含 IPv6 地址。
3.5 新版功能: decode_data 和 enable_SMTPUTF8 構造器形參,以及當 decode_data 為
False
時(shí)傳給process_message()
的 kwargs 形參。在 3.6 版更改: decode_data 現在默認為
False
。
DebuggingServer 對象?
- class smtpd.DebuggingServer(localaddr, remoteaddr)?
創(chuàng )建一個(gè)新的調試服務(wù)器。 參數是針對每個(gè)
SMTPServer
。 消息將被丟棄,并在 stdout 上打印出來(lái)。
PureProxy 對象?
- class smtpd.PureProxy(localaddr, remoteaddr)?
創(chuàng )建一個(gè)新的純代理服務(wù)器。 參數是針對每個(gè)
SMTPServer
。 一切都將被轉發(fā)到 remoteaddr。 請注意運行此對象有很大的機會(huì )令你成為一個(gè)開(kāi)放的中繼站,所以需要小心。
SMTPChannel 對象?
- class smtpd.SMTPChannel(server, conn, addr, data_size_limit=33554432, map=None, enable_SMTPUTF8=False, decode_data=False)?
創(chuàng )建一個(gè)新的
SMTPChannel
對象,該對象會(huì )管理服務(wù)器和單個(gè) SMTP 客戶(hù)端之間的通信。conn 和 addr 是針對下述的每個(gè)實(shí)例變量。
data_size_limit 指定將在
DATA
命令中被接受的最大字節數。 值為None
或0
表示無(wú)限制。enable_SMTPUTF8 確定
SMTPUTF8
擴展 (如 RFC 6531 所定義的) 是否應當被啟用。 默認值為False
。 decode_data 和 enable_SMTPUTF8 不能被同時(shí)設為True
。可以在 map 中指定一個(gè)字典以避免使用全局套接字映射。
decode_data 指明 SMTP 事務(wù)的數據部分是否應當使用 UTF-8 來(lái)解碼。 默認值為
False
。 decode_data 和 enable_SMTPUTF8 不能被同時(shí)設為True
。要使用自定義的 SMTPChannel 實(shí)現你必須重載你的
SMTPServer
的SMTPServer.channel_class
。在 3.5 版更改: 添加了 decode_data 和 enable_SMTPUTF8 形參。
在 3.6 版更改: decode_data 現在默認為
False
。SMTPChannel
具有下列實(shí)例變量:- smtp_server?
存放生成此通道的
SMTPServer
。
- conn?
存放連接到客戶(hù)端的套接字對象。
- addr?
存放客戶(hù)端的地址,
socket.accept
所返回的第二個(gè)值。
- received_lines?
存放從客戶(hù)端接收的行字符串列表 (使用 UTF-8 解碼)。 所有行的
"\r\n"
行結束符都會(huì )被轉寫(xiě)為"\n"
。
- smtp_state?
存放通道的當前狀態(tài)。 其初始值將為
COMMAND
而在客戶(hù)端發(fā)送 "DATA" 行后將為DATA
。
- seen_greeting?
存放包含客戶(hù)端在其 "HELO" 中發(fā)送的問(wèn)候信息的字符串。
- mailfrom?
存放包含客戶(hù)端在 "MAIL FROM:" 行中標識的地址的字符串。
- rcpttos?
存放包含客戶(hù)端在 "RCPT TO:" 行中標識的地址的字符串。
- received_data?
存放客戶(hù)端在 DATA 狀態(tài)期間發(fā)送的所有數據的字符串,直至但不包括末尾的
"\r\n.\r\n"
。
- fqdn?
存放由
socket.getfqdn()
所返回的服務(wù)器完整限定域名。
SMTPChannel
在接收到來(lái)自客戶(hù)端的命令行時(shí)會(huì )通過(guò)發(fā)起調用名為smtp_<command>
的方法來(lái)進(jìn)行操作。 在基類(lèi)SMTPChannel
中具有用于處理下列命令(并對他們作出適當反應)的方法:命令
所采取的行動(dòng)
HELO
接受來(lái)自客戶(hù)端的問(wèn)候語(yǔ),并將其存儲在
seen_greeting
中。將服務(wù)器設置為基本命令模式。EHLO
接受來(lái)自客戶(hù)的問(wèn)候并將其存儲在
seen_greeting
中。將服務(wù)器設置為擴展命令模式。NOOP
不采取任何行動(dòng)。
QUIT
干凈地關(guān)閉連接。
MAIL
接受 "MAIL FROM:" 句法并將所提供的地址保存為
mailfrom
。 在擴展命令模式下,還接受 RFC 1870 SIZE 屬性并根據 data_size_limit 的值作出適當返應。RCPT
接受 "RCPT TO:" 句法并將所提供的地址保存在
rcpttos
列表中。RSET
重置
mailfrom
,rcpttos
, 和received_data
,但不重置問(wèn)候語(yǔ)。DATA
將內部狀態(tài)設為
DATA
并將來(lái)自客戶(hù)端的剩余行保存在received_data
中直至接收到終止符"\r\n.\r\n"
。HELP
返回有關(guān)命令語(yǔ)法的最少信息
VRFY
返回代碼252(服務(wù)器不知道該地址是否有效)
EXPN
報告該命令未實(shí)現。