how to retrieve attachment in a mail ?

D

Didier FRAISSE

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
 
M

Michael A. Josephson

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
 
J

John Roth

Didier FRAISSE said:
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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,995
Messages
2,570,230
Members
46,819
Latest member
masterdaster

Latest Threads

Top