Email/SMTP Test Layer

This layer starts and stops a smtp daemon on given port (default 1025):

>>> from lovely.testlayers import mail
>>> layer = mail.SMTPServerLayer(port=1025)

To setup the layer call setUp():

>>> layer.setUp()

Now the Server can receive emails:

>>> from email.mime.text import MIMEText
>>> from email.utils import formatdate
>>> from smtplib import SMTP
>>> msg = MIMEText('testmessage', _charset='utf-8')
>>> msg['Subject'] = 'first email'
>>> msg['From'] = 'from@example.org'
>>> msg['To'] = 'recipient@example.org'
>>> msg['Date'] = formatdate(localtime=True)

>>> s = SMTP()
>>> _ = s.connect('localhost:1025')
>>> _ = s.sendmail('from@example.org', 'recipient@example.com', msg.as_string())
>>> msg['Subject'] = 'second email'
>>> _ = s.sendmail('from@example.org', 'recipient@example.com', msg.as_string())

>>> s.quit()
(221, 'Bye')

The testlayer exposes a server property which can be used to access the received emails.

Use the mbox(recipient) method to get the correct Mailbox:

>>> mailbox = layer.server.mbox('recipient@example.com')

Use is_empty() to verify that the mailbox isn’t empty:

>>> mailbox.is_empty()
False

If the recipient didn’t receive an email, an empty Mailbox is returned:

>>> emptybox = layer.server.mbox('invalid@example.com')
>>> emptybox.is_empty()
True

And popleft() to get the email that was received at first:

>>> print(mailbox.popleft())
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: base64
Subject: first email
From: from@example.org
To: recipient@example.org
...

...

The layer can be shutdown using the tearDown method:

>>> layer.tearDown()

After tearDown() the server can’t receive any more emails:

>>> s = SMTP()
>>> _ = s.connect('localhost:1025')
Traceback (most recent call last):
...
error: [Errno ...] Connection refused

Verification that setUp() and tearDown() work for subsequent calls:

>>> layer.setUp()

>>> _ = s.connect('localhost:1025')
>>> _ = s.sendmail('from@example.org', 'recipient@example.com', msg.as_string())
>>> print(mailbox.popleft())
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: base64
Subject: first email
From: from@example.org
To: recipient@example.org
...

...

>>> _ = s.quit()
>>> layer.tearDown()
>>> _ = s.connect('localhost:1025')
Traceback (most recent call last):
...
error: [Errno ...] Connection refused

Before setUp() is called the server property is None:

>>> layer = mail.SMTPServerLayer(port=1025)
>>> layer.server is None
True