On 2009-07-14 14:41 (+0900), Byung-Hee HWANG wrote:

> Hi, i use Emacs on Gnome Desktop (FreeBSD 7.2-RELEASE). In Gnome,
> there is the config named "prefer application" in which we can decide
> the best application for us such as mailer, webbrowser. The default
> value in mailer is "Evolution". By the way i would like to switch to
> Gnus from Evolution. So how can i change without any errors?

I have written a Bash script which parses mailto URLs and email headers'
possible RFC2047 quotations and then launches emacsclient to compose
mail. I don't know if it works in FreeBSD but it works on GNU/Linux
systems. It uses Bash's printf features to decode URL's %xx codes and
GNU "recode" utility to decode RFC2047-quoted headers. It also uses
"sed" a lot but I have no idea know if it needs GNU sed's extensions.

It's meant to be an executable script and it takes one command-line
argument: a mailto URL string, like this:

    mailto-handler "mailto:tliko...@iki.fi&subject=This%20is%20subject";

I use the script with Firefox and it's my KDE's default mail client.
Works great at least in my system. Be free to edit it to suit your
purposes. The program is public domain; absolutely no warranty.

#!/bin/bash
# Mailto link handler script for Emacs.
#
# Written by Teemu Likonen <tliko...@iki.fi>
#
# This program is placed in the public domain.

url="$1"

echopf() {
        printf '%s' "$@"
        printf '\n'
}

unquote_url() {
        read -r string
        string=$(echopf "$string" | \
                sed -re 's/%([0-9a-fA-F]{2})/\\x\1/g')
        printf "%b\n" "$string"
}

convert_url_unix_lf() {
        sed -e 's/%0[Dd]%0[Aa]/%0A/g;s/%0[Dd]/%0A/g'
}

convert_url_lf_tab_to_space() {
        sed -e 's/%0[Aa]%09/%20/g'
}

elisp_string_escape() {
        sed -e 's/[\"]/\\&/g'
}

unquote_rfc2047() {
        local string
        local new_string
        local mime_regexp mime_string mime_charset mime_encoding
        local text_string text_string_unquoted 
        local mime_string_escaped text_string_unquoted_escaped
        
        read -r string
        
        mime_regexp='(=\?([^? ]+)\?([qQbB])\?([^? ]+)\?=)'
        
        # Remove whitespace between MIME strings.
        while true; do
                new_string=$(echopf "$string" | \
                        sed -re "s/(${mime_regexp})\s+(${mime_regexp})/\1\6/")
                if [ "$new_string" = "$string" ]; then
                        break
                else
                        string="$new_string"
                fi
        done
        
        mime_string=$(echopf "$string" | \
                sed -nre "s/.*${mime_regexp}.*/\1/p")
        
        # Decode MIME strings one by one
        while [ "$mime_string" ]; do
                mime_charset=$(echopf "$mime_string" | \
                        sed -re "s/.*${mime_regexp}.*/\2/")
                mime_encoding=$(echopf "$mime_string" | \
                        sed -re "s/.*${mime_regexp}.*/\3/")
                text_string=$(echopf "$mime_string" | \
                        sed -re "s/.*${mime_regexp}.*/\4/")

                case "$mime_encoding" in
                q|Q)
                        mime_encoding=Quoted-Printable
                        text_string=$(echopf "$text_string" | \
                                sed -e 's/_/=20/g')
                        ;;
                b|B)
                        mime_encoding=Base64
                        ;;
                esac

                text_string_unquoted=$(echopf "$text_string" | \
                        recode -- "$mime_charset/$mime_encoding")
                mime_string_escaped=$(echopf "$mime_string" | \
                        sed -re 's,[][()|\^$.?+/*{}],\\&,g')
                text_string_unquoted_escaped=$(echopf \
                        "$text_string_unquoted" | sed -re 's,[/&\],\\&,g')
                string=$(echopf "$string" | sed -re \
                        "s/$mime_string_escaped/$text_string_unquoted_escaped/")
                mime_string=$(echopf "$string" | \
                        sed -nre "s/.*${mime_regexp}.*/\1/p")
        done
        echopf "$string"
}

to1_address=$(echopf "$url" | \
        sed -nre 's/^mailto:([^?&]*).*$/\1/p' | \
        unquote_url | unquote_rfc2047)
to2_address=$(echopf "$url" | \
        sed -nre 's/^mailto:.*[?&][Tt][Oo]=([^?&]*).*$/\1/p' | \
        unquote_url | unquote_rfc2047)
to_address=$(printf "%s, %s\n" "$to1_address" "$to2_address" | \
        sed -re 's/^[, ]+|[, ]+$//g' | elisp_string_escape)

cc_address=$(echopf "$url" | \
        sed -nre 's/^mailto:.*[?&][Cc][Cc]=([^?&]*).*$/\1/p' | \
        unquote_url | unquote_rfc2047 | elisp_string_escape)
bcc_address=$(echopf "$url" | \
        sed -nre 's/^mailto:.*[?&][Bb][Cc][Cc]=([^?&]*).*$/\1/p' | \
        unquote_url | unquote_rfc2047 | elisp_string_escape)
subject=$(echopf "$url" | \
        sed -nre 's/^mailto:.*[?&][Ss]ubject=([^?&]*).*$/\1/p' | \
        convert_url_unix_lf | convert_url_lf_tab_to_space | \
        unquote_url | unquote_rfc2047 | elisp_string_escape)
in_reply_to=$(echopf "$url" | \
        sed -nre 's/^mailto:.*[?&]In-Reply-To=([^?&]*).*$/\1/p' | \
        unquote_url | sed -re 's/^[< ]+|[> ]+$//g' | elisp_string_escape)

elisp_expression=$(printf '(compose-mail "%s" "%s" (quote (' \
        "$to_address" "$subject")

[ "$cc_address" ] && elisp_expression=$(printf '%s("Cc" . "%s")' \
        "$elisp_expression" "$cc_address")

[ "$bcc_address" ] && elisp_expression=$(printf '%s("Bcc" . "%s")' \
        "$elisp_expression" "$bcc_address")

[ "$in_reply_to" ] && elisp_expression=$(printf '%s("In-Reply-To" . "<%s>")' \
        "$elisp_expression" "$in_reply_to")

elisp_expression=$(printf '%s)))\n' "$elisp_expression")

echopf "$elisp_expression"

exec emacsclient -c -n -a '' --eval "$elisp_expression"
_______________________________________________
info-gnus-english mailing list
info-gnus-english@gnu.org
http://lists.gnu.org/mailman/listinfo/info-gnus-english

Reply via email to