[Tutor] Decoding MIME Attachments

jneiss at neisskids.org jneiss at neisskids.org
Fri Apr 2 00:47:42 CEST 2010


 Hi, all;

 I am a longtime linux sysadmin that is fairly new to Python. I've got a
project for which Python seems to be perfect (or, at least, I've found a
way to integrate my learning :-)

 I receive log files via email from an outside vendor. We use Splunk to
generate reports based on these and other logs. At the moment, pulling
the emailed logs into Splunk is done by hand--open the email, save the
attachment, read the file in. I'd like to automate it, and procmail + a
script is the easiest way. I've found perl scripts that supposedly pull
MIME-encoded attachments, but not being a perl guy, I'm trying to use
Python instead.

 I have the following script--cobbled together from Internet searches, the
Python cookbook, and hand-written lines:

#! /usr/bin/env python

import email.Parser
import os, sys
def main(argv = sys.argv):
      if not sys.stdin.isatty():
              for m in sys.stdin.readlines():
                p = email.Parser.Parser()
                msg = p.parse(m)
                mailfile.close()
                partcounter = 1
                for part in msg.walk():
                        if part.get_content_maintype() == "multipart":
                                continue
                        name = part.get_param("name")
                        if name == None:
                                name = "part-%i" % partcounter
                        partcounter += 1
                        print "partcounter = %s" % partcounter
                        if name != "part-1":
                                outfile = open(name, "wb")
                                outfile.write(part.get_payload(decode=1))
                                outfile.close()
if __name__=="__main__":
        try:
                main(sys.argv)
        except KeyboardInterrupt:
                pass

 The gist is: read whatever's piped to the script (from procmail or on the
command line), walk through the data looking for the second MIME header,
and write that part (the file attachment) to disk.

 What actually happens is this:

[user at server scripts]# cat /tmp/mail.txt | ./mail_extract.py
Traceback (most recent call last):
  File "./mail_extract.py", line 32, in ?
    main(sys.argv)
  File "./mail_extract.py", line 12, in main
    msg = p.parse(mailfile)
  File "/usr/lib64/python2.4/email/Parser.py", line 65, in parse
    data = fp.read(8192)
AttributeError: 'str' object has no attribute 'read'
[user at server scripts]#

f I change the three lines starting with "def main" to:

def main():
     if len(sys.argv) != 2:
             print "Usage: %s filename" % os.path.basename(sys.argv[0])
             sys.exit(1)

and remove the last five lines (if...pass), changing the command line to
"./mail_extract.py /tmp/mail.txt", it works like a champ. As is, it errors
whether through procmail or directly from the command line.

 Any ideas? What am I doing wrong?

 I'm using Python 2.4.3 on Red Hat ES 5.3, if it matters.

 Thanks;
 Jason

--
 jason at neisskids.org
 gentoo linux, as if you cared
 nac mac feegle!




More information about the Tutor mailing list