[MlMt] Bundle input types other than canonical

Brett Terpstra me at brettterpstra.com
Tue Apr 22 11:20:10 EDT 2014


Great! Thanks for all the info.

-Brett



On 22 Apr 2014, at 6:20, Benny Kjær Nielsen wrote:

> On 18 Apr 2014, at 18:28, Brett Terpstra wrote:
>
>> On 18 Apr 2014, at 9:41, Benny Kjær Nielsen wrote:
>>
>>> […]
>>> I guess that makes part of commands semi-documented. You might want 
>>> to ask about `output` types as well ;-)
>>
>> Consider it asked.
>
> Ok. As already indicated, `html` and `canonical` are going to be 
> output types for filtering commands, but this is not yet functional 
> for bundles. The default output type is `discard` and this leaves us 
> with the only interesting output for now: `actions`.
>
> The `actions` output type expects a property list to be returned from 
> the command. Here is a simple example:
>
> ~~~
> {
> 	actions = (
> 		{
> 			type = "moveMessage";
> 			mailbox = "archive";
> 		}
> 	);
> }
> ~~~
>
> Each action must have a type. Additional keys may be allowed/required 
> depending on the type. The currently available types are:
>
> * `playSound`
> 	
> 	`path`: Full path or a sound name if the sound can be found in a 
> standard sound path.
>
> * `notify`
>
> 	`formatString`: A format string (default is `"“${subject}” from 
> “${from.name:${from.address}}”"`).
> 	`mailbox`: Mailbox identifier (click on a mailbox and do ⌘C to get 
> this value).
>
> * `moveMessage`
>
> 	`mailbox`: Mailbox identifier (must be an IMAP mailbox).
>
> * `copyMessage`
>
> 	`mailbox`: Mailbox identifier (must be an IMAP mailbox).
> 	`variables`: More about this further below.
>
> * `changeFlags`
>
> 	`enable`: Array of IMAP flags/keywords, e.g., `( "\\Flagged", 
> "\\Send")`.
> 	`disable`: Array of IMAP flags/keywords.
>
> * `exportMessage`
>
> 	`folderPath`: Simple disk path (it can also be a `file:` URL).
>
> * `redirectMessage`
>
> 	`recipient`: Redirect message to the recipient (this includes sending 
> the message).
>
> * `createMessage`
>
> 	`headers`: Dictionary with headers for the message.
> 	`body`: Entire message body.
>
> * `replyMessage` (currently always “Reply All”)
>
> 	`headers`: Dictionary with headers for the message.
> 	`body`: Reply part of message body.
>
> * `runScript`
>
> 	`scriptUUID`: The UUID of a bundle command. Note that this script can 
> return actions itself.
>
> Note that commands also support an `executionMode` which can be 
> `singleMessage` or `multipleMessages` (default is `singleMessage`). 
> This determines whether the script should be executed once for each 
> message or once for all selected messages. (In `singleMessage` mode 
> MailMate tries to handle any resulting actions efficiently by merging 
> them if they are identical for subsets of messages. This is important 
> for large message selections.)
>
> All actions allow an `ids` key which is an array of internal message 
> ids (integers). If needed, these can be provided to a script using the 
> virtual header named `#body-part-id`. This is only used internally by 
> MailMate now, but it might be useful for external purposes which I 
> have not realized yet.
>
> The `copyMessage` action is special since it has two different 
> behaviors. If `variables` are *not* defined then it's a simple copy 
> action equivalent to ⌥-dragging a message. If `variables` are 
> defined then all headers and the body of the copied message are 
> interpreted as being format strings for which the `variables` should 
> be used. This can be used to create a draft message in MailMate with 
> the purpose of using it as a template for an external script. The 
> external script could, for example, handle a list of recipients for 
> the draft message. An example is probably needed to understand how 
> this works. Imagine creating a draft with values like this:
>
> 	To: ${to}
> 	Subject: A personal message to you.
> 	
> 	Hi ${firstname},
> 	I wanted to tell you about an extraordinary email client named 
> MailMate. I used it to create this very personal message.
> 	Regards, Benny
>
> The `actions` could then be generated by a script with output like 
> this:
>
> 	{ actions = (
> 			{
> 				type = copyMessage;
> 				variables = {
> 					to = 'Foo Bar <foobar at example.com>';
> 					firstname = 'Foo';
> 				};
> 			},
> 			{
> 				type = copyMessage;
> 				...
> 			}
> 		);
> 	}
>
> A practical example is the emails I sent to existing license owners 
> when doing the crowd funding campaign. Those emails were create by 
> letting a Ruby script generate the actions. It also used the variables 
> to include the existing license key of each user to make sure they did 
> not have to search for it if they were no longer actively using 
> MailMate. I could create the draft in MailMate using any feature of 
> MailMate I'd like (Markdown, Send Later, ...). The script generated a 
> huge number of emails in my drafts folder, but I could then review the 
> result and add (really) personal messages to some of them. 
> Furthermore, it made it easy to send out the emails in smaller 
> batches. (This wouldn't work well for 100.000 emails, but in my case 
> it was fine.)
>
> Caveat: When I used some of the message-generating features myself 
> (and no-one else has I believe) I had some crashes which I'm not sure 
> have been fixed yet. Reports are naturally welcome.
>
>> What I want to do is run my own custom html2text on the output and 
>> save it to a text file (for nvALT import purposes). The output I was 
>> getting from canonical was already "markdownified" in most cases, and 
>> it seemed that with html, there were cases where it would send 
>> nothing at all (assumed it was because there was no html section). If 
>> decoded provides the Content-Type boundaries, I can parse that...
>
> No, `decoded` does not provide `Content-Type` directly, but you could 
> use environment variables to do that. For example,
>
> 	environment   = 
> 'MM_CONTENT_TYPE=${content-type.type:text}\nMM_CONTENT_SUBTYPE=${content-type.subtype:plain}\n';
>
> But as noted, the real problem is probably to tell MailMate which body 
> part to provide to the script.
>
> With respect to `canonical` not being the desired data (or the 
> Markdown conversion being inadequate) then I'd like to fix that by 
> extending the set of input types or by improving the HTML to Markdown 
> conversion (maybe we should discuss your version of `html2text` off 
> list).
>
> On a more general note, my goal is to provide input which takes care 
> of as many of the email intricacies as possible before handing over 
> data to commands or other parts of the interface. The many(!) problems 
> concerning the conversion of headers and bodies to any kind of 
> canonical data should be handled by MailMate to keep everything else 
> as simple as possible. In other words, canonicalization should be my 
> side of the fence.
>
>>>> Also, how does MM_SELECTED_RANGE work when the input to the command 
>>>> isn't the same format as what was selected in the viewer?
>>>
>>> In a sense it's never the same format since even a plain text 
>>> message is displayed as HTML. To provide `MM_SELECTED_RANGE`, 
>>> MailMate heuristically re-locates the selected text in the canonical 
>>> text when a command is executed. This currently does not happen for 
>>> the `html` input type.
>>
>> Any chance that when there's a selection and the current view type is 
>> HTML, it could send the raw selected HTML to the output? As in, 
>> MM_SELECTED_TEXT instead of just a range?
>
> To be consistent I think it should be a new input type: 
> `html_selection`. And for the `html` input type `MM_SELECTED_RANGE` 
> should be made available as it is for `canonical` (I'm not sure how 
> easy the latter would be).
>
> -- 
> Benny
> _______________________________________________
> mailmate mailing list
> mailmate at lists.freron.com
> http://lists.freron.com/listinfo/mailmate
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freron.com/pipermail/mailmate/attachments/20140422/a65fd420/attachment.html>


More information about the mailmate mailing list