From: Alan Harris-Reid on
Hi there,

I want to send an email with an attachment using the following code
(running under Python 3.1, greatly simplified to show example)

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

msg = MIMEMultipart()
msg['From'] = from_addr
msg['To'] = to_addr
msg['Subject'] = subject
msg.attach(MIMEText(body))

fp = open(att_file)
att_msg = MIMEText(fp.read())
attachment = att_msg.add_header('Content-Disposition', 'attachment',
filename=att_file)
msg.attach(attachment)

# set string to be sent as 3rd parameter to smptlib.SMTP.sendmail()
send_string = msg.as_string()


The attachment object msg1 returns 'email.mime.text.MIMEText' object at
<address>', but when the att_msg.add_header(...) line runs the result is
None, hence the program falls-over in msg.as_string() because no part of
the attachment can have a None value. (Traceback shows "'NoneType'
object has no attribute 'get_content_maintype'" in line 118 of _dispatch
in generator.py, many levels down from msg.as_string())

Has anyone any idea what the cause of the problem might be? Any help
would be appreciated.

Alan Harris-Reid
From: Chris Rebert on
On Thu, Apr 29, 2010 at 1:06 PM, Alan Harris-Reid
<aharrisreid(a)googlemail.com> wrote:
> Hi there,
>
> I want to send an email with an attachment using the following code (running
> under Python 3.1, greatly simplified to show example)
>
>   from email.mime.multipart import MIMEMultipart
>   from email.mime.text import MIMEText
>
>   msg = MIMEMultipart()
>   msg['From'] = from_addr
>   msg['To'] = to_addr
>   msg['Subject'] = subject
>   msg.attach(MIMEText(body))
>
>   fp = open(att_file)
>   att_msg = MIMEText(fp.read())
>   attachment = att_msg.add_header('Content-Disposition', 'attachment',
> filename=att_file)
>   msg.attach(attachment)
>
>   # set string to be sent as 3rd parameter to smptlib.SMTP.sendmail()
>   send_string = msg.as_string()
>
>
> The attachment object msg1 returns 'email.mime.text.MIMEText' object at
> <address>', but when the att_msg.add_header(...) line runs the result is
> None, hence the program falls-over in msg.as_string() because no part of the
> attachment can have a None value.  (Traceback shows "'NoneType' object has
> no attribute 'get_content_maintype'" in line 118 of _dispatch in
> generator.py, many levels down from msg.as_string())
>
> Has anyone any idea what the cause of the problem might be?  Any help would
> be appreciated.

..add_header() modifies the MIMEText object *in-place*; per Python
conventions, mutator methods return None; hence, attachment = None.

Try instead (untested):
att_msg.add_header('Content-Disposition', 'attachment', filename=att_file)
msg.attach(att_msg)

Cheers,
Chris
--
http://blog.rebertia.com