[New-bugs-announce] [issue10321] Add support for Message objects and binary data to smtplib.sendmail

R. David Murray report at bugs.python.org
Fri Nov 5 10:07:41 CET 2010

New submission from R. David Murray <rdmurray at bitdance.com>:

The attached patch adds support to smtplib.SMTP.sendmail for the 'msg' argument to be, in addition to the currently accepted ASCII-only string, either a bytes string or a Message object.  It also adds support for byte strings to smtplib.SMPT.data.

Binary support is straightforward: if a byte string is passed, it is subject to leading '.' quoting but otherwise transmitted as is (that is, no \r\n transformation is done, unlike the string case).

For Message object support, the Message is serialized via BytesGenerator, meaning that a message parsed from a bytes source can be successfully re-transmitted via smtplib.  In addition to_addrs and from_addr can be set to None, in which case the addresses are obtained from the appropriate Message object headers (and, for safety, any Bcc header is deleted).

Although this patch is complete with docs, I'm not convinced this is the correct API.

First is the question of whether or not Message object support should be added.  It is in the patch because I started the work with the idea that serializing a Message via BytesGenerator was the "right way" to get binary data into smtplib, but as the implementation fell out I in fact ended up adding support for arbitrary binary data to sendmail (and data).  So in fact the Message object handling is not required in smtplib.

The feature is, however, clearly useful.  Perhaps, however, it should live in email as one or more helper methods instead.  I prefer having it in smtplib, but would like the opinions of others.

The second question is whether or not either functionality should be added to the existing sendmail method, or whether new methods should be created instead.  The alternative API might be:

    send_bytes(from_addr, to_addrs, msg, mail_options, rcpt_options)
    send_message(msg, mail_options, rcpt_options, from_addr=None, to_addrs=None)

Having completed the patch I'm neutral on this API refactoring, and again welcome other opinions.  'send_bytes' doesn't really seem like the right name, since it implies sending arbitrary bytes when in fact what is happening is a complete message transaction.  'send_bytesmail'?  Ugly :(

(See also issue 8050 and issue 4403.)

Note that I'd like to get some variation of this in (that at a minimum at least supports passing binary data to sendmail) before beta1, since it is the logical compliment to the new bytes support in the email package.

assignee: r.david.murray
components: Library (Lib)
files: sendmail_message.patch
keywords: patch
messages: 120475
nosy: Allison.Vollmann, barry, ccgus, exarkun, giampaolo.rodola, pitrou, r.david.murray
priority: normal
severity: normal
stage: patch review
status: open
title: Add support for Message objects and binary data to smtplib.sendmail
type: feature request
versions: Python 3.2
Added file: http://bugs.python.org/file19502/sendmail_message.patch

Python tracker <report at bugs.python.org>

More information about the New-bugs-announce mailing list