#!/bin/sh # # mailto-mutt -- wrapper to be able to use mutt as mailto handler from firefox # # To use, surf to Firefox's about:config page and configure the following # three values: # network.protocol-handler.external.mailto boolean true # network.protocol-handler.app.mailto string '/path/to/handler' # network.protocol-handler.warn-external.mailto boolean false # # Copyright © martin f. krafft # Released under the terms of the Artistic Licence 2.0 # # Revision: $Id: mailto-mutt 498 2007-05-12 12:02:10Z madduck $ # set -eu case "${1:-}" in -d) debug=1; shift;; '') exit 0;; *) :;; esac url_unescape() { perl -e 'use URI::Escape; while(<>) { print uri_unescape($_); }' } MAILTO="${@%%\?*}" ARGS="${@#*\?}" [ "$ARGS" = "$MAILTO" ] && unset ARGS MAILTO="$(echo "${MAILTO#mailto:}" | url_unescape)" subject= cc= bcc= body= mutt_commands= IFS_store="$IFS" IFS='&' for arg in ${ARGS:-}; do value="$(echo "${arg#*=}" | url_unescape | sed -e "s,',\',")" case "${arg%%=*}" in subject|Subject|SUBJECT) subject="$value";; cc|Cc|CC) cc="$value";; bcc|Bcc|BCC) bcc="$value";; body|Body|BODY) body="$value";; *) mutt_commands="${mutt_commands:+${mutt_commands} }-e\"my_hdr ${arg%%=*}: $value\"" ;; esac done IFS="$IFS_store" break_at_commas() { local atom for i; do atom="${atom:+$atom }$i" case "${atom:-}" in *,) echo "${atom%,}"; unset atom;; esac done [ -n "${atom:-}" ] && echo "${atom%,}" } get_addr_args() { local type case "$1" in -*) type="$1"; shift;; *) unset type;; esac break_at_commas "$@" | while read addr; do echo -n "${type:-}\"$addr\" " done } if [ -n "$mutt_commands" ]; then mutt_args="${mutt_args:+$mutt_args }$mutt_commands" fi if [ -n "$subject" ]; then mutt_args="${mutt_args:+$mutt_args }-s\"$subject\"" fi mutt_args="${mutt_args:+$mutt_args }$(get_addr_args -c $cc)" mutt_args="${mutt_args:+$mutt_args }$(get_addr_args -b $bcc)" mutt_args="${mutt_args:+$mutt_args }$(get_addr_args $MAILTO)" run() { if [ ${debug:-0} -eq 1 ]; then echo "$@" else eval "$@" fi } if [ -n "$body" ]; then TMPFILE="$(tempfile -p mailto -d /tmp)" echo "$body" > $TMPFILE trap "rm -f $TMPFILE" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 run x-terminal-emulator -e mutt${mutt_args:+ $mutt_args} -i $TMPFILE ret=$? rm -f $TMPFILE trap - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 exit $ret else run exec x-terminal-emulator -e mutt${mutt_args:+ $mutt_args} fi