[SPAM?] Re: [SPAM?] Can I use Mutt from Bash to extract attachments into an arbitrary directory?
On Wed, Sep 14, 2016 at 04:12:48PM -0700, Are Troi wrote: > Hi All, > > Last night at a technical talk I lamented the loss around 5 years ago > from Fedora of command-line tools to extract email attachments from a > BASH script and a colleague told me Mutt can do this. Mutt is a really nice tool, but for this I would probably reach first for 'reformime' from the maildrop package. (I'm a long-time maildrop fan.) -- Mark H. Wood Lead Technology Analyst University Library Indiana University - Purdue University Indianapolis 755 W. Michigan Street Indianapolis, IN 46202 317-274-0749 www.ulib.iupui.edu signature.asc Description: PGP signature
[SPAM?] Re: [SPAM?] Re: [SPAM?] Can I use Mutt from Bash to extract attachments into an arbitrary directory?
On Thu, Sep 15, 2016 at 11:33:41AM +0200, Richard Z wrote: > On Thu, Sep 15, 2016 at 10:53:02AM +1000, Cameron Simpson wrote: > > On 14Sep2016 16:12, Are Troiwrote: > > > Last night at a technical talk I lamented the loss around 5 years ago > ... > tried ripmime and munpak about a year ago to save all attachments from > a large MBOX and it was everything but a hasslefree experience. Various > attachments were missed or not processed, some segfaults. > Those tools are apparently not as robust as mutt is. I have used ripmime without problems but on individual messages from a Maildir, not on a large mbox. Luis
Re: [SPAM?] Re: [SPAM?] Can I use Mutt from Bash to extract attachments into an arbitrary directory?
On Thu, Sep 15, 2016 at 10:53:02AM +1000, Cameron Simpson wrote: > On 14Sep2016 16:12, Are Troiwrote: > >Last night at a technical talk I lamented the loss around 5 years ago > >from Fedora of command-line tools to extract email attachments from a > >BASH script and a colleague told me Mutt can do this. > > If you mean the MIME tools mpack and munpak, I still use them. (On a Mac, > where the Macports package is called mpack). > > Wouldn't you be better off just fetching and buiulding them? tried ripmime and munpak about a year ago to save all attachments from a large MBOX and it was everything but a hasslefree experience. Various attachments were missed or not processed, some segfaults. Those tools are apparently not as robust as mutt is. Ended up splitting the MBOX by formail cat MBOX | formail -ds sh -c 'cat > msg.$FILENO' and processing messages by ripmime -v --name-by-type --verbose-contenttype --verbose-defects -i "$f" .. and hoping not much was missed by this apporach. Richard -- Name and OpenPGP keys available from pgp key servers
[SPAM?] Re: [SPAM?] Re: [SPAM?] Can I use Mutt from Bash to extract attachments into an arbitrary directory?
* 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
[SPAM?] Re: [SPAM?] Can I use Mutt from Bash to extract attachments into an arbitrary directory?
On 14Sep2016 16:12, Are Troiwrote: Last night at a technical talk I lamented the loss around 5 years ago from Fedora of command-line tools to extract email attachments from a BASH script and a colleague told me Mutt can do this. If you mean the MIME tools mpack and munpak, I still use them. (On a Mac, where the Macports package is called mpack). Wouldn't you be better off just fetching and buiulding them? I installed Mutt, checked out the man pages, went through the documentation, spent an hour or more searching the archives and it is not at all readily apparent that Mutt can do this, or how. 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. I fired up mutt on an example file and it opens it up just fine, the problem is having a user drive the user interface defeats the whole purpose; it must be done programatically. So, I've been looking into the various libraries that handle MIME - I understand Perl and Python both have good libraries, though I've been more interested in the Java one because there are some synergies there - but nevermind all that. I'd be going for the Python stuff, lacking your context. My supposition is that if mutt can do it, the only way is to define a macro, as documented on this page: https://dev.mutt.org/trac/wiki/MuttFaq/Attachment (A brief but hopefully helpful digression is that I've spent a good bit of time in the documentation and other materials and apparently there's some tiny little assumption made about macros that is too obvious to the documentation writer to bother documenting but is unknwon to a newbie about how / where macros are defined. There's nothing in the man page, nothing on the on-screen help, and the documentation apparently assumes you already know how they're defined! The best help I found so far is the "(ab)use "macros" as variables" on the wiki under "ConfigTricks" - from that I can probably figure it out...) Macros get defined in your config file, with all the other mutt config. Mutt can be told to use a specific config file instead of the default on the command line if you wish. So.. that example was: macro attach W /home/gawron/attachments/ macro I think the lack of iteration kills the macro approach. I advocate getting the mpack tools and using them, or writing something using Python or Java that suits your needs. ...I'm guessing... And I'd launch it like this: $ cd /dir/where/email/is $ echo A | mutt -f mailfile.name ...Am I on the right track? What do I expect in the directory? Any other guidance, please? I have a macro for mutt bound to: mail-open-attachments but mail-open-attachments is just a shell script that uses the mpack tools: https://bitbucket.org/cameron_simpson/css/src/tip/bin/mail-open-attachments It just makes a scratch directory, unpacks the files, and opened the scratch directory in the Finder. It is my quick'n'dirty for grabbing what I've been sent. Cheers, Cameron Simpson