* On 14 Sep 2016, Cameron Simpson wrote: 
> 
> Mutt is probably a poor match for the task because although it will decode
> messages etc, all the saving is interactive. In particular, there's no API
> for "iterating" over attachments, let along recursively.

Agree. It's entirely doable, but not worth the trouble and the
maintenance when there are other fine options.

> I'd be going for the Python stuff, lacking your context.

See attached.

You can pipe a message into this program (within mutt or elsewhere):

| mutt-savefiles /tmp/foo

It will create a directory under /tmp/foo named for the message's
message-id, and store each attachment inside. Filenames are taken
from the MIME or generated sequentially if there is no filename.

-- 
David Champion • d...@bikeshed.us
#!/usr/bin/env python
#
# TODO: merge into sympafile
#

import os
import sys
import email
import mimetypes

m = email.message_from_file(sys.stdin)

# mimetypes very unfortunately maps text/plain to .ksh, so
# we'll favor this internal list in type lookups.
localtypes = {
        'text/plain': '.txt',
}

if 'message-id' in m:
        msgid = m['message-id'].strip('<>')
else:
        msgid = str(time.time()).replace('.', '_')

if len(sys.argv) > 1:
        dirname = sys.argv[1]
else:
        dirname = '.'

dirname = os.path.join(dirname, msgid)
try:
        os.makedirs(dirname)
except:
        pass

n = 0
for p in m.walk():
        n += 1
        mtype = p.get_content_type()
        if mtype.startswith('multipart/'):
                # container
                continue

        ext = localtypes.get(mtype.lower()) or \
              mimetypes.guess_extension(mtype) or \
              '.bin'
        filename = p.get_filename() or ('%02d%s' % (n, ext))
        filename = os.path.join(dirname, filename)
        data = p.get_payload()
        print filename, len(data)
        fp = open(filename, 'w')
        fp.write(data)
        fp.close()

Attachment: signature.asc
Description: PGP signature

Reply via email to