class smtpd.SMTPChannel(server, conn, addr, data_size_limit=33554432, map=None, enable_SMTPUTF8=False, decode_data=True)
Create a new SMTPChannel object which manages the communication between the server and a single SMTP client.
conn and addr are as per the instance variables described below.
data_size_limit specifies the maximum number of bytes that will be accepted in a DATA command. A value of None or 0 means no limit.
enable_SMTPUTF8 determins whether the SMTPUTF8 extension (as defined in RFC 6531) should be enabled. The default is False. A ValueError is raised if both enable_SMTPUTF8 and decode_data are set to True at the same time.
A dictionary can be specified in map to avoid using a global socket map.
decode_data specifies whether the data portion of the SMTP transaction should be decoded using UTF-8. The default is True for backward compatibility reasons, but will change to False in Python 3.6. Specify the keyword value explicitly to avoid the DeprecationWarning.
To use a custom SMTPChannel implementation you need to override the SMTPServer.channel_class of your SMTPServer.
Changed in version 3.5: the decode_data and enable_SMTPUTF8 arguments were added.
The SMTPChannel has the following instance variables:
-
smtp_server -
Holds the
SMTPServerthat spawned this channel.
-
conn -
Holds the socket object connecting to the client.
-
addr -
Holds the address of the client, the second value returned by
socket.accept
-
received_lines -
Holds a list of the line strings (decoded using UTF-8) received from the client. The lines have their
"\r\n"line ending translated to"\n".
-
smtp_state -
Holds the current state of the channel. This will be either
COMMANDinitially and thenDATAafter the client sends a “DATA” line.
-
seen_greeting -
Holds a string containing the greeting sent by the client in its “HELO”.
-
mailfrom -
Holds a string containing the address identified in the “MAIL FROM:” line from the client.
-
rcpttos -
Holds a list of strings containing the addresses identified in the “RCPT TO:” lines from the client.
-
received_data -
Holds a string containing all of the data sent by the client during the DATA state, up to but not including the terminating
"\r\n.\r\n".
-
fqdn -
Holds the fully-qualified domain name of the server as returned by
socket.getfqdn().
-
peer -
Holds the name of the client peer as returned by
conn.getpeername()whereconnisconn.
The SMTPChannel operates by invoking methods named smtp_<command> upon reception of a command line from the client. Built into the base SMTPChannel class are methods for handling the following commands (and responding to them appropriately):
| Command | Action taken |
|---|---|
| HELO | Accepts the greeting from the client and stores it in seen_greeting. Sets server to base command mode. |
| EHLO | Accepts the greeting from the client and stores it in seen_greeting. Sets server to extended command mode. |
| NOOP | Takes no action. |
| QUIT | Closes the connection cleanly. |
Accepts the “MAIL FROM:” syntax and stores the supplied address as mailfrom. In extended command mode, accepts the RFC 1870 SIZE attribute and responds appropriately based on the value of data_size_limit. | |
| RCPT | Accepts the “RCPT TO:” syntax and stores the supplied addresses in the rcpttos list. |
| RSET | Resets the mailfrom, rcpttos, and received_data, but not the greeting. |
| DATA | Sets the internal state to DATA and stores remaining lines from the client in received_data until the terminator "\r\n.\r\n" is received. |
| HELP | Returns minimal information on command syntax |
| VRFY | Returns code 252 (the server doesn’t know if the address is valid) |
| EXPN | Reports that the command is not implemented. |
Please login to continue.