blob: bbfb604312204ac83e9e0de1cf54fb95fb34b9d9 [file] [log] [blame]
#!/bin/sh
#---------------------------------------------
# xdg-email
#
# Utility script to open the users favorite email program, using the
# RFC 2368 mailto: URI spec
#
# Refer to the usage() function below for usage.
#
# Copyright 2009-2010, Fathi Boudra <fabo@freedesktop.org>
# Copyright 2009-2010, Rex Dieter <rdieter@fedoraproject.org>
# Copyright 2006, Kevin Krammer <kevin.krammer@gmx.at>
# Copyright 2006, Jeremy White <jwhite@codeweavers.com>
#
# LICENSE:
#
#---------------------------------------------
manualpage()
{
cat << _MANUALPAGE
_MANUALPAGE
}
usage()
{
cat << _USAGE
_USAGE
}
#@xdg-utils-common@
run_thunderbird()
{
local THUNDERBIRD MAILTO NEWMAILTO TO CC BCC SUBJECT BODY ATTACH
THUNDERBIRD="$1"
MAILTO=$(echo "$2" | sed 's/^mailto://')
echo "$MAILTO" | grep -qs "^?"
if [ "$?" = "0" ] ; then
MAILTO=$(echo "$MAILTO" | sed 's/^?//')
else
MAILTO=$(echo "$MAILTO" | sed 's/^/to=/' | sed 's/?/\&/')
fi
MAILTO=$(echo "$MAILTO" | sed 's/&/\n/g')
TO=$(echo "$MAILTO" | grep '^to=' | sed 's/^to=//' | awk '{ printf "%s,",$0 }')
CC=$(echo "$MAILTO" | grep '^cc=' | sed 's/^cc=//' | awk '{ printf "%s,",$0 }')
BCC=$(echo "$MAILTO" | grep '^bcc=' | sed 's/^bcc=//' | awk '{ printf "%s,",$0 }')
SUBJECT=$(echo "$MAILTO" | grep '^subject=' | tail -n 1)
BODY=$(echo "$MAILTO" | grep '^body=' | tail -n 1)
ATTACH=$(echo "$MAILTO" | sed 's/^attach=/\n\nfile:\/\//g' | awk '/^file:/ { printf "%s,",$0 }' | sed 's/,$//')
if [ -z "$TO" ] ; then
NEWMAILTO=
else
NEWMAILTO="to='$TO'"
fi
if [ -n "$CC" ] ; then
NEWMAILTO="${NEWMAILTO},cc='$CC'"
fi
if [ -n "$BCC" ] ; then
NEWMAILTO="${NEWMAILTO},bcc='$BCC'"
fi
if [ -n "$SUBJECT" ] ; then
NEWMAILTO="${NEWMAILTO},$SUBJECT"
fi
if [ -n "$BODY" ] ; then
NEWMAILTO="${NEWMAILTO},$BODY"
fi
if [ -n "$ATTACH" ] ; then
NEWMAILTO="${NEWMAILTO},attachment='${ATTACH}'"
fi
NEWMAILTO=$(echo "$NEWMAILTO" | sed 's/^,//')
DEBUG 1 "Running $THUNDERBIRD -compose \"$NEWMAILTO\""
"$THUNDERBIRD" -compose "$NEWMAILTO"
if [ $? -eq 0 ]; then
exit_success
else
exit_failure_operation_failed
fi
}
open_kde()
{
local client kde_email_profile_name
kde_email_profile_name=`kreadconfig --file emaildefaults --group Defaults --key Profile`
client=`kreadconfig --file emaildefaults --group PROFILE_"$kde_email_profile_name" --key EmailClient | cut -d ' ' -f 1`
echo $client | grep thunderbird > /dev/null 2>&1
if [ $? -eq 0 ] ; then
run_thunderbird "$client" "$1"
fi
if [ -f /etc/SuSE-release ] ; then
# Workaround for SUSE 10.0
[ -z "$client" ] && client="kmail"
if ! which "$client" > /dev/null 2> /dev/null; then
DEBUG 3 "KDE has $client configured as email client which isn't installed"
if which gnome-open > /dev/null 2> /dev/null && which evolution > /dev/null 2> /dev/null; then
DEBUG 3 "Try gnome-open instead"
open_gnome "$1"
fi
fi
fi
DEBUG 1 "Running kmailservice \"$1\""
if [ x"$KDE_SESSION_VERSION" = x"4" ]; then
KMAILSERVICE=`kde4-config --locate kmailservice --path exe 2>/dev/null`
$KMAILSERVICE "$1"
else
KMAILSERVICE=`which kmailservice 2>/dev/null`
# KDE3 uses locale's encoding when decoding the URI, so set it to UTF-8
LC_ALL=C.UTF-8 $KMAILSERVICE "$1"
fi
if [ $? -eq 0 ]; then
exit_success
else
exit_failure_operation_failed
fi
}
open_gnome3()
{
local client
local desktop
desktop=`xdg-mime query default "x-scheme-handler/mailto"`
client=`desktop_file_to_binary "$browser"`
echo $client | grep thunderbird > /dev/null 2>&1
if [ $? -eq 0 ] ; then
run_thunderbird "$client" "$1"
fi
if gvfs-open --help 2>/dev/null 1>&2; then
DEBUG 1 "Running gvfs-open \"$1\""
gvfs-open "$1"
else
DEBUG 1 "Running gnome-open \"$1\""
gnome-open "$1"
fi
if [ $? -eq 0 ]; then
exit_success
else
exit_failure_operation_failed
fi
}
open_gnome()
{
local client
client=`gconftool-2 --get /desktop/gnome/url-handlers/mailto/command | cut -d ' ' -f 1` || ""
echo $client | grep thunderbird > /dev/null 2>&1
if [ $? -eq 0 ] ; then
run_thunderbird "$client" "$1"
fi
if gvfs-open --help 2>/dev/null 1>&2; then
DEBUG 1 "Running gvfs-open \"$1\""
gvfs-open "$1"
else
DEBUG 1 "Running gnome-open \"$1\""
gnome-open "$1"
fi
if [ $? -eq 0 ]; then
exit_success
else
exit_failure_operation_failed
fi
}
open_xfce()
{
DEBUG 1 "Running exo-open \"$1\""
exo-open "$1"
if [ $? -eq 0 ]; then
exit_success
else
exit_failure_operation_failed
fi
}
open_generic()
{
IFS=":"
for browser in $BROWSER; do
if [ x"$browser" != x"" ]; then
browser_with_arg=`printf "$browser" "$1" 2>/dev/null`
if [ $? -ne 0 ]; then browser_with_arg=$browser;
fi
if [ x"$browser_with_arg" = x"$browser" ]; then "$browser" "$1";
else $browser_with_arg;
fi
if [ $? -eq 0 ]; then exit_success;
fi
fi
done
exit_failure_operation_impossible "no method available for opening '$1'"
}
url_encode()
{
result=$(echo "$1" | $utf8 | awk '
BEGIN {
for ( i=1; i<=255; ++i ) ord [ sprintf ("%c", i) "" ] = i + 0
e = ""
linenr = 1
}
{
if ( linenr++ != 1 ) {
e = e "%0D%0A"
}
for ( i=1; i<=length ($0); ++i ) {
c = substr ($0, i, 1)
if ( ord [c] > 127 ) {
e = e "%" sprintf("%02X", ord [c])
} else if ( c ~ /[@a-zA-Z0-9.-\\\/]/ ) {
e = e c
} else {
e = e "%" sprintf("%02X", ord [c])
}
}
}
END {
print e
}
')
}
options=
mailto=
utf8="iconv -t utf8"
while [ $# -gt 0 ] ; do
parm="$1"
shift
case "$parm" in
--utf8)
utf8="cat"
;;
--to)
if [ -z "$1" ] ; then
exit_failure_syntax "email address argument missing for --to"
fi
url_encode "$1"
options="${options}to=${result}&"
shift
;;
--cc)
if [ -z "$1" ] ; then
exit_failure_syntax "email address argument missing for --cc"
fi
url_encode "$1"
options="${options}cc=${result}&"
shift
;;
--bcc)
if [ -z "$1" ] ; then
exit_failure_syntax "email address argument missing for --bcc"
fi
url_encode "$1"
options="${options}bcc=${result}&"
shift
;;
--subject)
if [ -z "$1" ] ; then
exit_failure_syntax "text argument missing for --subject option"
fi
url_encode "$1"
options="${options}subject=${result}&"
shift
;;
--body)
if [ -z "$1" ] ; then
exit_failure_syntax "text argument missing for --body option"
fi
url_encode "$1"
options="${options}body=${result}&"
shift
;;
--attach)
if [ -z "$1" ] ; then
exit_failure_syntax "file argument missing for --attach option"
fi
check_input_file "$1"
file=`readlink -f "$1"` # Normalize path
if [ -z "$file" -o ! -f "$file" ] ; then
exit_failure_file_missing "file '$1' does not exist"
fi
url_encode "$file"
options="${options}attach=${result}&"
shift
;;
-*)
exit_failure_syntax "unexpected option '$parm'"
;;
mailto:*)
mailto="$parm"
;;
*@*)
url_encode "$parm"
if [ -z "${mailto}" ] ; then
mailto="mailto:"${result}"?"
else
options="${options}to=${result}&"
fi
;;
*)
exit_failure_syntax "unexpected argument '$parm'"
;;
esac
done
if [ -z "${mailto}" ] ; then
# TO address is optional
mailto="mailto:?"
fi
case $mailto in
*\?)
mailto="${mailto}${options}"
;;
*\?*)
mailto="${mailto}&${options}"
;;
*)
mailto="${mailto}?${options}"
;;
esac
# Strip trailing ? and &
mailto=`echo "${mailto}"| sed 's/[?&]$//'`
# Shouldn't happen
[ x"${mailto}" != x"" ] || exit_failure_syntax
if which @NAME@-hook.sh > /dev/null 2> /dev/null; then
@NAME@-hook.sh "${mailto}"
if [ $? -eq 0 ]; then
exit_success
else
exit_failure_operation_failed
fi
fi
detectDE
if [ x"$DE" = x"" ]; then
DE=generic
fi
# if BROWSER variable is not set, check some well known browsers instead
if [ x"$BROWSER" = x"" ]; then
BROWSER=links2:elinks:links:lynx:w3m
if [ -n "$DISPLAY" ]; then
BROWSER=x-www-browser:firefox:seamonkey:mozilla:epiphany:konqueror:chromium-browser:google-chrome:$BROWSER
fi
fi
case "$DE" in
kde)
open_kde "${mailto}"
;;
gnome)
open_gnome "${mailto}"
;;
gnome3)
open_gnome3 "${mailto}"
;;
xfce)
open_xfce "${mailto}"
;;
generic|lxde)
open_generic "${mailto}"
;;
*)
exit_failure_operation_impossible "no method available for opening '${mailto}'"
;;
esac