I l@ve RuBoard Previous Section Next Section

10.10 Sending Multipart MIME Email

Credit: Richard Jones, Michael Strasser

10.10.1 Problem

You need to put together a multipart MIME email message to be sent with smtplib (or by other means).

10.10.2 Solution

Multipart messages can be composed with the MimeWriter module:

import sys, smtplib, MimeWriter, base64, StringIO

message = StringIO.StringIO(  )
writer = MimeWriter.MimeWriter(message)
writer.addheader('Subject', 'The kitten picture')
writer.startmultipartbody('mixed')

# Start off with a text/plain part
part = writer.nextpart(  )
body = part.startbody('text/plain')
body.write('This is a picture of a kitten, enjoy :)')

# Now add an image part
part = writer.nextpart(  )
part.addheader('Content-Transfer-Encoding', 'base64')
body = part.startbody('image/jpeg; name=kitten.jpg')
base64.encode(open('kitten.jpg', 'rb'), body)

# Finish it off
writer.lastpart(  )

Once you have composed a suitable message, you can send it with the smtplib module:

smtp = smtplib.SMTP('smtp.server.address')
smtp.sendmail('[email protected]', '[email protected]', message.getvalue(  ))
smtp.quit(  )

10.10.3 Discussion

The order of the calls to the writer is important. Note that headers are always added before body content. The top-level body is added with a subtype of 'mixed', which is appropriate for mixed content, such as that of this recipe. Other subtypes can be found in RFC 1521 (e.g., 'mixed', 'alternative', 'digest', and 'parallel'), RFC 1847 (e.g., 'signed' and 'encrypted'), and RFC 2387 ('related'). Each RFC is available at http://www.ietf.org/rfc.

Of course, you could wrap this kind of functionality up in a class, which is what Dirk Holtwick has done. (See his solution at http://sourceforge.net/snippet/detail.php?type=snippet&id=100444.) In Python 2.2, the new email package in the standard library offers an excellent alternative for handling email messages, such as documents compatible with RFC 2822 (which superseded the earlier RFC 822) that include MIME functionality. Recipe 10.11 shows how the email package can be used to compose a MIME multipart message.

10.10.4 See Also

Recipe 10.9 and Recipe 10.11; documentation for the standard library modules email, smtplib, MimeWriter, base64, and StringIO in the Library Reference; the IETF RFC archive (http://www.ietf.org/rfc.html); the MimeMail snippet (http://sourceforge.net/snippet/detail.php?type=snippet&id=100444).

    I l@ve RuBoard Previous Section Next Section