skip to navigation
skip to content

lovely.mail 0.3.1

sending emails via remotetask

Downloads ↓

==============================
 Lovely.Mail and Mail Testing
==============================

This package mainly provides a simple way to test the mail delivery using the
current configuration. There is no need to change the mailing configuration
for the functional tests.

  >>> from lovely.mail import testing

Before we can set up the mail testing we need to register the mailer
utilities.

  >>> from zope import component
  >>> from zope.sendmail.mailer import SMTPMailer
  >>> component.provideUtility(SMTPMailer(),
  ...                          name='lovely-mailer')

  >>> from zope.sendmail.delivery import QueuedMailDelivery
  >>> component.provideUtility(QueuedMailDelivery('some_path'),
  ...                          name='lovely-mail-delivery')

Now we set up testing. This is the code which should go into you
setUp-function for your tests.

  >>> testing.setUpSMTPTesting('lovely-mailer', 'lovely-mail-delivery', unit_test=True)

Testing simply replaces the smtp mailer of the utility to a test smtp mailer.

  >>> from zope.sendmail.interfaces import IMailer, IMailDelivery
  >>> mailer = component.getUtility(IMailer, 'lovely-mailer')
  >>> mailer.smtp
  

And the mail delivery gets a temporary directory.

  >>> delivery = component.getUtility(IMailDelivery, 'lovely-mail-delivery')
  >>> delivery._queuePath != 'some_path'
  True

Testing provides a list with already sent mails.

  >>> testing.sentMails
  []

Now we send a mail.

  >>> messageId = delivery.send('README', ['MAILQUEUE',], 'I am a testing mail')
  >>> testing.sentMails
  []

The mail is not sent yet because we need to trigger mail delivery.

  >>> testing.triggerMail()
  >>> from pprint import pprint
  >>> pprint(testing.sentMails)
  [('README',
   ('MAILQUEUE',),
   'Message-Id: <...>\nI am a testing mail')]


We also provide a simple function to send mails.

  >>> from lovely.mail import sendmail
  >>> sendmail('subject', 'me@gmail.org', ['you@gmail.org'], 'my mail body')
  >>> testing.sentMails = []
  >>> testing.triggerMail()
  >>> pprint(testing.sentMails)
  [('me@gmail.org',
    ('you@gmail.org',),
    'Message-Id: ...\nFrom: me@gmail.org\nTo: you@gmail.org\n...\nmy mail body')]

If we provide tuples for the addresses we get this :

  >>> sendmail('subject', ('ich', 'me@gmail.org'), [('du','you@gmail.org',)], 'my mail body')
  >>> testing.sentMails = []
  >>> testing.triggerMail()
  >>> pprint(testing.sentMails)
  [('ich ',
    ('du ',),
    'Message-Id: ...\nFrom: ich \nTo: du \n...\nmy mail body')]


Attachments
-----------

Attachments must be provided as a list of tuples containing a file like object
providing "read", the filename and the mime type of the attachment (if known).

  >>> from StringIO import StringIO
  >>> f1 = StringIO("I am the content of file 1")
  >>> sendmail('subject', ('ich', 'me@gmail.org'), [('du','you@gmail.org',)],
  ...          'my mail body', attachments=[(f1, 'f1.txt', None)])
  >>> testing.sentMails = []
  >>> testing.triggerMail()
  >>> pprint(testing.sentMails)
  [('ich ',
    ('du ',),
    'Message-Id: ...')]
  >>> pprint(testing.sentMails[0][2].split('\n'))
  ['Message-Id: <...>',
   'Content-Type: multipart/mixed; boundary="===============...=="',
   'MIME-Version: 1.0',
   'Subject: subject',
   'From: ich ',
   'To: du ',
   'Date: ...',
   '',
   '--===============...==',
   'Content-Type: text/plain; charset="utf-8"',
   'MIME-Version: 1.0',
   'Content-Transfer-Encoding: 7bit',
   '',
   'my mail body',
   '--===============...==',
   'Content-Type: application/octet-stream',
   'MIME-Version: 1.0',
   'Content-Transfer-Encoding: base64',
   'Content-Disposition: attachment; filename="f1.txt"',
   '',
   'SS...',
   '--===============...==--']


  >>> f1.seek(0)
  >>> sendmail('subject', ('ich', 'me@gmail.org'), [('du','you@gmail.org',)],
  ...          'my mail body', attachments=[(f1, 'f1.txt', ('text','plain'))])
  >>> testing.sentMails = []
  >>> testing.triggerMail()
  >>> pprint(testing.sentMails)
  [('ich ',
    ('du ',),
    'Message-Id: ...')]
  >>> pprint(testing.sentMails[0][2].split('\n'))
  ['Message-Id: <...>',
   'Content-Type: multipart/mixed; boundary="===============...=="',
   'MIME-Version: 1.0',
   'Subject: subject',
   'From: ich ',
   'To: du ',
   'Date: ...',
   '',
   '--===============...==',
   'Content-Type: text/plain; charset="utf-8"',
   'MIME-Version: 1.0',
   'Content-Transfer-Encoding: 7bit',
   '',
   'my mail body',
   '--===============...==',
   'Content-Type: text/plain; charset="us-ascii"',
   'MIME-Version: 1.0',
   'Content-Transfer-Encoding: 7bit',
   'Content-Disposition: attachment; filename="f1.txt"',
   '',
   'I am the content of file 1',
   '--===============...==--']

And clean up.

  >>> testing.tearDownSMTPTesting()
  >>> mailer.smtp
  
  >>> delivery._queuePath == 'some_path'
  True
  >>> testing.sentMails
  []


=======================
Changes for lovely.mail
=======================

After
=====

2009/09/08 0.3.1
================

 - allow the use of directMailDelivery for testing
 - handle attachments according to their type

2009/07/30 0.3.0
================

 - added attachments

2009/04/22 0.2.0
================

 - stop remaining QueueProcessThread on tearDown because python 2.5 doesn't
   terminate.

2008/04/22 0.1.3
================

- make the testmailer compatible to the latest zope.sendmail package

2007/12/10 0.1.2
================

- move stuff to zope.org and pypi

2007/08/23 0.1.1
================

- added remotemail.py for remote sendmail tasks

2007/06/20 0.1.0a1
==================

- added TestMailDelivery utility implementation

- changed to current bootstrap.py

- added this file

- cleaned imports


Download
========
 
File Type Py Version Uploaded on Size # downloads
lovely.mail-0.3.1.tar.gz (md5) Source 2009-09-08 9KB 481