# 20.13. `smtpd` — SMTP Server

Source code: Lib/smtpd.py

This module offers several classes to implement SMTP servers. One is a generic do-nothing implementation, which can be overridden, while the other two offer specific mail-sending strategies.

## 20.13.1. SMTPServer Objects

class `smtpd.``SMTPServer`(localaddr, remoteaddr)

  Create a new `SMTPServer` object, which binds to local address localaddr. It will treat remoteaddr as an upstream SMTP relayer. Both localaddr and remoteaddr should be a (host, port) tuple. The object inherits from `asyncore.dispatcher`, and so will insert itself into `asyncore`‘s event loop on instantiation.

  `process_message`(peer, mailfrom, rcpttos, data)

    Raise `NotImplementedError` exception. Override this in subclasses to do something useful with this message. Whatever was passed in the constructor as remoteaddr will be available as the `_remoteaddr` attribute. peer is the remote host’s address, mailfrom is the envelope originator, rcpttos are the envelope recipients and data is a string containing the contents of the e-mail (which should be in RFC 2822 format).

## 20.13.2. DebuggingServer Objects

class `smtpd.``DebuggingServer`(localaddr, remoteaddr)

  Create a new debugging server. Arguments are as per `SMTPServer`. Messages will be discarded, and printed on stdout.

## 20.13.3. PureProxy Objects

class `smtpd.``PureProxy`(localaddr, remoteaddr)

  Create a new pure proxy server. Arguments are as per `SMTPServer`. Everything will be relayed to remoteaddr. Note that running this has a good chance to make you into an open relay, so please be careful.

## 20.13.4. MailmanProxy Objects

class `smtpd.``MailmanProxy`(localaddr, remoteaddr)

  Create a new pure proxy server. Arguments are as per `SMTPServer`. Everything will be relayed to remoteaddr, unless local mailman configurations knows about an address, in which case it will be handled via mailman. Note that running this has a good chance to make you into an open relay, so please be careful.