* 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()
signature.asc
Description: PGP signature