<div class="markdown">
<p dir="auto">Hi,</p>

<p dir="auto">This message contains documentation by example for an experimental 2.0 feature. It may or may not work in future revisions of MailMate, but it's a good example of the flexibility of combining smart mailboxes, rules, and commands. It's like playing with Legos.</p>

<p dir="auto">It also happens to be a rare example of how the default mailbox named “All Messages ▸ All Body Parts” can be used.</p>

<p dir="auto">On 29 Nov 2013, at 21:05, Thomas Koch wrote:</p>

<blockquote>
<p dir="auto">I have the wish to handle some mail attachments automatically, at least save them at a certain directory. The the processing of the resulting file can be performed by Hazel, so no problem here.</p>
</blockquote>

<p dir="auto">Interesting problem (and a challenge).</p>

<blockquote>
<p dir="auto">But I did not find a combination to set up a rule, a mailbox, an action or whatever concept would be the right one (I am new to MailMate, but love it) to get some mails selected based on the usual filter inputs and get the attachments stored in a directory which is monitored by Hazel. I was not able to dig up something from the manual, mailing list history or tracker that gives me a hint.</p>
</blockquote>

<p dir="auto">I didn't even think this was possible myself at first since there is no “save” action for rules yet.</p>

<blockquote>
<p dir="auto">Or is there a directory that would be save to be monitored by Hazel in the MailMate directory trees? I imagine then a script taking a copy of the attachment and perform other actions, but only once per attachment/file that apply to the filter rules.</p>
</blockquote>

<p dir="auto">No, such a location does not exist.</p>

<p dir="auto">You are at the frontier of what has been done with MailMate here, but the following should work. None of this has been documented before.</p>

<p dir="auto">First, I assume you have a mailbox of incoming messages. We'll name it Incoming. Now, create a smart mailbox as follows:</p>

<pre><code>Mailboxes: “All Messages” ▸ “All Body Parts”

Condition: “Root Body Part” is in “Incoming” “Body Part Id” 
</code></pre>

<p dir="auto">This smart mailbox is going to contain any body parts in any messages in the “Incoming” mailbox. Next you can create rules for this smart mailbox. For example:</p>

<pre><code>Condition: “Content-Type ▸ Type” is “image”
Action: “Run Script” “My Saver”
</code></pre>

<p dir="auto">The last piece of the puzzle is the script. You need a bundle for that and those are currently non-trivial to create. You should find an existing one and replace all the UUID values with new values. All you need is a single file in the “Commands” folder which should have content similar to this:</p>

<pre><code>{
    name    = 'My Saver';
    input   = 'decoded';
    script  = '#!/bin/bash\ncat >> /tmp/image.png\n';
    uuid = '88A186D7-1452-4857-941D-DA96E612F835';
}
</code></pre>

<p dir="auto">This command tells MailMate to provide a decoded body part (binary image data in this case) to the script. The script simply pipes the input to a temporary file.</p>

<p dir="auto">This should be improved to use a non-hardcoded filename. It could be based on message headers, but this can be non-trivial and I think it would be better if MailMate provided a useful filename (based on the headers). I'll put that on the ToDo. Even better, MailMate should (also) provide a simple “Save” action with a folder location argument to avoid creating a command (and bundle) at all. This could also ensure a unique filename. Until that is available then you could do the following in the command given above:</p>

<pre><code>environment   = 'MY_FILENAME=${content-disposition.parameter.split.filename:${content-type.parameter.split.name}}\n';
script  = '#!/bin/bash\ncat >> "/tmp/${MY_FILENAME}"\n';
</code></pre>

<p dir="auto">That'll probably work well most of the time.</p>

<p dir="auto">You can test it by dragging a message with an image attachment to the “Incoming” mailbox. You can also apply the command to any message by selecting it in the Command menu.</p>

<p dir="auto">Have a nice weekend everybody. I have little time until Monday morning. Be patient if you have any questions.</p>

<p dir="auto">-- <br>
Benny</p>

</div>