新聞中心
smtpd —- SMTP 服務(wù)器
源代碼: Lib/smtpd.py

該模塊提供了幾個(gè)類來(lái)實(shí)現(xiàn) SMTP (電子郵件)服務(wù)器。
從版本 3.6 開(kāi)始標(biāo)記為過(guò)時(shí),將在版本 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í)現(xiàn);一個(gè)是通用的無(wú)為實(shí)現(xiàn),可以被重寫,而另外兩個(gè)則提供特定的郵件發(fā)送策略。
此外, SMTPChannel 可以被擴(kuò)展以實(shí)現(xiàn)與 SMTP 客戶端非常具體的交互行為。
該代碼支持 RFC 5321 ,加上 RFC 1870 SIZE和 RFC 6531 SMTPUTF8 擴(kuò)展。
Availability: not Emscripten, not WASI.
This module does not work or is not available on WebAssembly platforms wasm32-emscripten and wasm32-wasi. See WebAssembly platforms for more information.
SMTPServer 對(duì)象
class smtpd.SMTPServer(localaddr, remoteaddr, data_size_limit=33554432, map=None, enable_SMTPUTF8=False, decode_data=False)
新建一個(gè) SMTPServer 對(duì)象,它會(huì)綁定到本機(jī)地址 localaddr。 它將把 remoteaddr 當(dāng)作上游 SMTP 中繼器。 localaddr 和 remoteaddr 都應(yīng)當(dāng)是 (host, port) 元組。 該對(duì)象繼承自 asyncore.dispatcher,因而會(huì)在實(shí)例化時(shí)將自己插入到 asyncore 的事件循環(huán)。
data_size_limit 指定將在 DATA 命令中被接受的最大字節(jié)數(shù)。 值為 None 或 0 表示無(wú)限制。
map 是用于連接的套接字映射(初始為空的字典是適當(dāng)?shù)闹担?如果未指定則會(huì)使用 asyncore 全局套接字映射。
enable_SMTPUTF8 決定是否應(yīng)當(dāng)啟用 SMTPUTF8 擴(kuò)展(如 RFC 6531 所定義的。 默認(rèn)值為 False。 當(dāng)設(shè)為 True 時(shí),會(huì)接受 SMTPUTF8 作為 MAIL 命令的形參并在被提供時(shí)將其傳給 kwargs['mail_options'] 列表中的 process_message()。 decode_data 和 enable_SMTPUTF8 不可同時(shí)被設(shè)為 True。
decode_data 指明 SMTP 事務(wù)的數(shù)據(jù)部分是否應(yīng)當(dāng)使用 UTF-8 來(lái)解碼。 當(dāng) decode_data 為 False 時(shí)(默認(rèn)值),服務(wù)器會(huì)聲明 8BITMIME 擴(kuò)展 (RFC 6152),接受來(lái)自 MAIL 命令的 BODY=8BITMIME 形參,并在該形參存在時(shí)將其傳給 kwargs['mail_options'] 列表中的 process_message() 方法。 decode_data 和 enable_SMTPUTF8 不可同時(shí)被設(shè)為 True。
-
process_message(peer, mailfrom, rcpttos, data, \*kwargs*)
引發(fā) NotImplementedError 異常。 請(qǐng)?jiān)谧宇愔兄剌d此方法以實(shí)際運(yùn)用此消息。 在構(gòu)造器中作為 remoteaddr 傳入的任何東西都可以
_remoteaddr屬性的形式來(lái)訪問(wèn)。 peer 是遠(yuǎn)程主機(jī)的地址,mailfrom 是封包的發(fā)送方,rcpttos 是封包的接收方而 data 是包含電子郵件內(nèi)容的字符串(應(yīng)該為 RFC 5321 格式)。如果構(gòu)造器關(guān)鍵字參數(shù) decode_data 被設(shè)為
True,則 data 參數(shù)將為 Unicode 字符串。 如果被設(shè)為False,則將為字節(jié)串對(duì)象。kwargs 是包含附加信息的字典。 如果給出
decode_data=True作為初始參數(shù)則該字典為空,否則它會(huì)包含以下的鍵:-
mail_options:
由
MAIL命令所接收的所有參數(shù)組成的列表 (其元素為大寫形式的字符串;例如:['BODY=8BITMIME', 'SMTPUTF8'])。rcpt_options:
與 mail_options 類似但是針對(duì)
RCPT命令。 目前不支持任何RCPT TO選項(xiàng),因此其值將總是為空列表。
process_message的實(shí)現(xiàn)應(yīng)當(dāng)使用**kwargs簽名來(lái)接收任意關(guān)鍵字參數(shù),因?yàn)槲磥?lái)的增強(qiáng)特性可能會(huì)向 kwargs 字典添加新鍵。返回
None以請(qǐng)求一個(gè)正常的250 Ok響應(yīng);在其他情況下則以 RFC 5321 格式返回所需的響應(yīng)字符串。 -
-
channel_class
重載這個(gè)子類以使用自定義的 SMTPChannel 來(lái)管理 SMTP 客戶端。
3.4 新版功能: map 構(gòu)造器參數(shù)。
在 3.5 版更改: localaddr 和 remoteaddr 現(xiàn)在可以包含 IPv6 地址。
3.5 新版功能: decode_data 和 enable_SMTPUTF8 構(gòu)造器形參,以及當(dāng) decode_data 為 False 時(shí)傳給 process_message() 的 kwargs 形參。
在 3.6 版更改: decode_data 現(xiàn)在默認(rèn)為 False。
DebuggingServer 對(duì)象
class smtpd.DebuggingServer(localaddr, remoteaddr)
創(chuàng)建一個(gè)新的調(diào)試服務(wù)器。 參數(shù)是針對(duì)每個(gè) SMTPServer。 消息將被丟棄,并在 stdout 上打印出來(lái)。
PureProxy 對(duì)象
class smtpd.PureProxy(localaddr, remoteaddr)
創(chuàng)建一個(gè)新的純代理服務(wù)器。 參數(shù)是針對(duì)每個(gè) SMTPServer。 一切都將被轉(zhuǎn)發(fā)到 remoteaddr。 請(qǐng)注意運(yùn)行此對(duì)象有很大的機(jī)會(huì)令你成為一個(gè)開(kāi)放的中繼站,所以需要小心。
SMTPChannel 對(duì)象
class smtpd.SMTPChannel(server, conn, addr, data_size_limit=33554432, map=None, enable_SMTPUTF8=False, decode_data=False)
創(chuàng)建一個(gè)新的 SMTPChannel 對(duì)象,該對(duì)象會(huì)管理服務(wù)器和單個(gè) SMTP 客戶端之間的通信。
conn 和 addr 是針對(duì)下述的每個(gè)實(shí)例變量。
data_size_limit 指定將在 DATA 命令中被接受的最大字節(jié)數(shù)。 值為 None 或 0 表示無(wú)限制。
enable_SMTPUTF8 確定 SMTPUTF8 擴(kuò)展 (如 RFC 6531 所定義的) 是否應(yīng)當(dāng)被啟用。 默認(rèn)值為 False。 decode_data 和 enable_SMTPUTF8 不能被同時(shí)設(shè)為 True。
可以在 map 中指定一個(gè)字典以避免使用全局套接字映射。
decode_data 指明 SMTP 事務(wù)的數(shù)據(jù)部分是否應(yīng)當(dāng)使用 UTF-8 來(lái)解碼。 默認(rèn)值為 False。 decode_data 和 enable_SMTPUTF8 不能被同時(shí)設(shè)為 True。
要使用自定義的 SMTPChannel 實(shí)現(xiàn)你必須重載你的 SMTPServer 的 SMTPServer.channel_class。
在 3.5 版更改: 添加了 decode_data 和 enable_SMTPUTF8 形參。
在 3.6 版更改: decode_data 現(xiàn)在默認(rèn)為 False。
SMTPChannel 具有下列實(shí)例變量:
-
smtp_server
存放生成此通道的 SMTPServer。
-
conn
存放連接到客戶端的套接字對(duì)象。
-
addr
存放客戶端的地址,socket.accept 所返回的第二個(gè)值。
-
received_lines
存放從客戶端接收的行字符串列表 (使用 UTF-8 解碼)。 所有行的
"\r\n"行結(jié)束符都會(huì)被轉(zhuǎn)寫為"\n"。 -
smtp_state
存放通道的當(dāng)前狀態(tài)。 其初始值將為
COMMAND而在客戶端發(fā)送 “DATA” 行后將為DATA。 -
seen_greeting
存放包含客戶端在其 “HELO” 中發(fā)送的問(wèn)候信息的字符串。
-
mailfrom
存放包含客戶端在 “MAIL FROM:” 行中標(biāo)識(shí)的地址的字符串。
-
rcpttos
存放包含客戶端在 “RCPT TO:” 行中標(biāo)識(shí)的地址的字符串。
-
received_data
存放客戶端在 DATA 狀態(tài)期間發(fā)送的所有數(shù)據(jù)的字符串,直至但不包括末尾的
"\r\n.\r\n"。 -
fqdn
Holds the fully qualified domain name of the server as returned by socket.getfqdn().
-
peer
存放由
conn.getpeername()所返回的客戶端對(duì)等方名稱,其中conn為 conn。
SMTPChannel 在接收到來(lái)自客戶端的命令行時(shí)會(huì)通過(guò)發(fā)起調(diào)用名為 smtp_ 的方法來(lái)進(jìn)行操作。 在基類 SMTPChannel 中具有用于處理下列命令(并對(duì)他們作出適當(dāng)反應(yīng))的方法:
|
命令 |
所采取的行動(dòng) |
|---|---|
HELO | 接受來(lái)自客戶端的問(wèn)候語(yǔ),并將其存儲(chǔ)在 seen_greeting 中。將服務(wù)器設(shè)置為基本命令模式。 |
EHLO | 接受來(lái)自客戶的問(wèn)候并將其存儲(chǔ)在 seen_greeting 中。將服務(wù)器設(shè)置為擴(kuò)展命令模式。 |
NOOP | 不采取任何行動(dòng)。 |
QUIT | 干凈地關(guān)閉連接。 |
接受 “MAIL FROM:” 句法并將所提供的地址保存為 mailfrom。 在擴(kuò)展命令模式下,還接受 RFC 1870 SIZE 屬性并根據(jù) data_size_limit 的值作出適當(dāng)返應(yīng)。 | |
RCPT | 接受 “RCPT TO:” 句法并將所提供的地址保存在 rcpttos 列表中。 |
RSET | 重置 mailfrom, rcpttos, 和 received_data ,但不重置問(wèn)候語(yǔ)。 |
DATA | 將內(nèi)部狀態(tài)設(shè)為 |
HELP | 返回有關(guān)命令語(yǔ)法的最少信息 |
VRFY | 返回代碼252(服務(wù)器不知道該地址是否有效) |
EXPN | 報(bào)告該命令未實(shí)現(xiàn)。 |
本文名稱:創(chuàng)新互聯(lián)Python教程:smtpd—-SMTP服務(wù)器
URL鏈接:http://www.5511xx.com/article/cdcsgpd.html


咨詢
建站咨詢
