[Tutor] Attaching an uploaded file to an email
Martin Walsh
mwalsh at groktech.org
Sun Feb 20 21:32:13 CET 2005
Tim Wilson wrote:
>Hi everyone,
>
>
Hi Tim,
I'm a newb, first time posting, so please take any of the following
advice at face value....
># Collect form information
>form = cgi.FieldStorage()
>requestername = form["requestername"].value
>fromaddr = form["email"].value
>itemname = form["itemname"].value
>description = form["description"].value
>buildings = form.getlist("building")
>room = form["room"].value
>dateneeded = form["dateneeded"].value
>po = form["po"].value
>budgetcode = form["budgetcode"].value
>attachment = form["attachment"].value
>
>
based on this cookbook recipe
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/273844, it looks
like cgi.FieldStorage() returns a file-like object for file input
fields, having .filename and .file attributes. the file attribute has a
read() method which may be useful. having never used cgi I'm not sure
what .value returns for file input fields, don't know if this is of any
consequence.
>buildinglist = ", ".join(buildings)
>
>**[ misc code snipped ]**
>
># Set some email headers
>#msg = MIMEText(msgtext)
>msg = MIMEMultipart()
>msg['Subject'] = itemname
>msg['From'] = "%s <%s>" % (requestername, fromaddr)
>msg['To'] = toaddr
>if len(buildings) != 0:
> for building in buildings:
> msg['X-HRT-Building'] = building
>if po != "": msg['X-HRT-PO'] = po
>if dateneeded != "":
> try:
> duedate = time.asctime(time.strptime(dateneeded, "%m/%d/%Y"))
> msg['X-HRT-Due-Date'] = duedate
> except ValueError:
> pass
>msg.preamble = "Tech order request"
>msg.epilogue = ""
>
>
if you know that the attachment will always be a text file and your
assignment of 'attachment' looks like this:
attachment = form["attachment"]
then you might try the following (untested):
part = MIMEText(attachment.file.read())
# if I understand correctly, the 'Content-Disposition' header is
necessary to make the file
# appear in the message as an attachment, otherwise it may occupy
the msg body.
part.add_header('Content-Disposition', 'attachment',
filename=attachment.filename)
msg.attach(part)
># Send the message
>server = smtplib.SMTP('localhost')
>server.sendmail(fromaddr, toaddr, msg.as_string(0))
>server.quit()
>
>
there's a great example in the email module docs if you're dealing with
more than just text files :
http://docs.python.org/lib/node578.html (3rd example, using the
mimetypes module)
I have collected code snippets from various sources (python docs, ASPNs
python cookbook) into a basic MIMEMailer class, that I use fairly
regularly in hobby projects. If anyone is interested, I'd be happy to
share, or post it here.
HTH,
Marty
More information about the Tutor
mailing list