By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
457,955 Members | 1,363 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 457,955 IT Pros & Developers. It's quick & easy.

how to retrieve attachment in a mail ?

P: n/a
i need to retrieve every day an email and to save his attachments for later
processing.
i found some piece of code in the documentation like

import poplib
pop = poplib.POP3(Host)
pop.user(User)
pop.pass(Pwd)
nbMsg, nbOctet = pop.stat()
for n in range(nbMsg):
response, lines, bytes = pop.retr(n+1)

which retrieve email from a pop3 account and

import email.Parser
import os
import sys

mailFile=open(File,"rb")
p=email.Parser.Parser()
msg=p.parse(mailFile)
mailFile.close()

partCounter=1
for part in msg.walk():
if part.get_main_type()=="multipart":
continue
name=part.get_param("name")
if name==None:
name="part-%i" % partCounter
partCounter+=1
# In real life, make sure that name is a reasonable
# filename on your OS.
f=open(name,"wb")
f.write(part.get_payload(decode=1))
f.close()
print name
wich extract every part of a mailFile

BUT i don't understand how to migrate from
response, lines, bytes = pop.retr(n+1)
where lines is a list to a msg object
for part in msg.walk():

thanks to help me and many pologize for my poor english
Didier

Jul 18 '05 #1
Share this Question
Share on Google+
2 Replies


P: n/a
On Wed, 29 Oct 2003 09:35:03 +0100, "Didier FRAISSE"
<df******@free.fr> wrote:

BUT i don't understand how to migrate from
response, lines, bytes = pop.retr(n+1)
where lines is a list to a msg object
for part in msg.walk():


The example code you've posted for parsing the message:

msg=p.parse(mailFile)

assumes that the message is coming from a file-like object (e.g. if
you're reading the message from a file on disk.)

Because you're reading the message from a POP server what you probably
want to do is join the lines together into a single string:

messagetext = string.join(lines, "\n")

and then use parsestr rather than parse to get your message object:

msg = p.parsestr(messagetext)

-Michael
Jul 18 '05 #2

P: n/a

"Didier FRAISSE" <df******@free.fr> wrote in message
news:3f*********************@news.free.fr...
i need to retrieve every day an email and to save his attachments for later processing.
i found some piece of code in the documentation like

import poplib
pop = poplib.POP3(Host)
pop.user(User)
pop.pass(Pwd)
nbMsg, nbOctet = pop.stat()
for n in range(nbMsg):
response, lines, bytes = pop.retr(n+1)

which retrieve email from a pop3 account and

import email.Parser
import os
import sys

mailFile=open(File,"rb")
p=email.Parser.Parser()
msg=p.parse(mailFile)
mailFile.close()

partCounter=1
for part in msg.walk():
if part.get_main_type()=="multipart":
continue
name=part.get_param("name")
if name==None:
name="part-%i" % partCounter
partCounter+=1
# In real life, make sure that name is a reasonable
# filename on your OS.
f=open(name,"wb")
f.write(part.get_payload(decode=1))
f.close()
print name
wich extract every part of a mailFile

BUT i don't understand how to migrate from
response, lines, bytes = pop.retr(n+1)
where lines is a list to a msg object
for part in msg.walk():

thanks to help me and many pologize for my poor english
Didier
I found that the last example in the documentation for the email
module (12.2.13 in the Python 2.2.3 Library doc) did exactly
what I wanted. I think I've got slightly different requirements:
I keep the antivirus settings on Outlook Express set high enough
that I can't save attachements directly, so I save the entire
e-mail to a processing directory, and then use the code in the
example to unpack it. After it's unpacked, I do whatever I need to
with it.

This is the code; I don't remember if I modified the example
or not...

-------------------------------------------------------------

#!/usr/bin/env python

"""Unpack a MIME message into a directory of files.

Usage: unpackmail [options] msgfile

Options:
-h / --help
Print this message and exit.

-d directory
--directory=directory
Unpack the MIME message into the named directory, which will be
created if it doesn't already exist.

msgfile is the path to the file containing the MIME message.
"""

import sys
import os
import getopt
import errno
import mimetypes
import email
def usage(code, msg=''):
print >> sys.stderr, __doc__
if msg:
print >> sys.stderr, msg
sys.exit(code)
def main():
try:
opts, args = getopt.getopt(sys.argv[1:], 'hd:', ['help',
'directory='])
except getopt.error, msg:
usage(1, msg)

dir = os.curdir
for opt, arg in opts:
if opt in ('-h', '--help'):
usage(0)
elif opt in ('-d', '--directory'):
dir = arg

try:
msgfile = args[0]
except IndexError:
usage(1)

try:
os.mkdir(dir)
except OSError, e:
# Ignore directory exists error
if e.errno <> errno.EEXIST: raise

fp = open(msgfile)
msg = email.message_from_file(fp)
fp.close()

counter = 1
for part in msg.walk():
# multipart/* are just containers
if part.get_content_maintype() == 'multipart':
continue
# Applications should really sanitize the given filename so that an
# email message can't be used to overwrite important files
filename = part.get_filename()
if not filename:
ext = mimetypes.guess_extension(part.get_type())
if not ext:
# Use a generic bag-of-bits extension
ext = '.bin'
filename = 'part-%03d%s' % (counter, ext)
counter += 1
fp = open(os.path.join(dir, filename), 'wb')
fp.write(part.get_payload(decode=1))
fp.close()
if __name__ == '__main__':
main()

-------------------------------------------------------------

I also use the following command to process each email
I want to unpack:

----------------------------

python unpackmail.py -d outdir %1

---------------------------------

There are obviously lots of ways this could be improved, but
it suits my needs.

John Roth

Jul 18 '05 #3

This discussion thread is closed

Replies have been disabled for this discussion.