Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
assignee='https://github.com/bitdancer'closed_at=<Date2010-11-08.17:18:43.998>created_at=<Date2010-11-05.09:07:40.428>labels= ['type-feature', 'library']
title='Add support for Message objects and binary data to smtplib.sendmail'updated_at=<Date2010-11-08.17:18:43.996>user='https://github.com/bitdancer'
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:
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 :(
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.
New patch that takes a middle ground on the API: sendmail accepts string and bytes, and a new method send_message accepts a Message object with a more convenient signature. I think send_message does belong in smtplib since it would be awkward and unintuitive to put the helper function in email, since one needs to create an SMTP server to call sendmail.
I am satisfied with this version; the delta against the existing code and docs is smaller and the API feels clean.
The new patch also updates a couple of the email package examples that use sendmail to use send_message (one of the sendmail examples is left untouched).
If there are no objections I'll commit this this weekend sometime.