blob: 4034639f62d36ce8bf48681dd43d4fc8aff05f09 [file] [log] [blame]
mdm@chromium.org56df6d32010-08-31 18:16:49 +00001#!/bin/sh
dkegel@google.comf20da1f2009-06-30 19:16:32 +00002#---------------------------------------------
3# xdg-email
4#
5# Utility script to open the users favorite email program, using the
6# RFC 2368 mailto: URI spec
7#
8# Refer to the usage() function below for usage.
9#
10# Copyright 2006, Kevin Krammer <kevin.krammer@gmx.at>
11# Copyright 2006, Jeremy White <jwhite@codeweavers.com>
12#
13# LICENSE:
14#
15#---------------------------------------------
16
17manualpage()
18{
19cat << _MANUALPAGE
20_MANUALPAGE
21}
22
23usage()
24{
25cat << _USAGE
26_USAGE
27}
28
29#@xdg-utils-common@
30
mdm@chromium.org56df6d32010-08-31 18:16:49 +000031run_thunderbird()
32{
33 local THUNDERBIRD MAILTO NEWMAILTO TO CC BCC SUBJECT BODY ATTACH
34 THUNDERBIRD="$1"
35 MAILTO=$(echo "$2" | sed 's/^mailto://')
36 echo "$MAILTO" | grep -qs "^?"
37 if [ "$?" = "0" ] ; then
38 MAILTO=$(echo "$MAILTO" | sed 's/^?//')
39 else
40 MAILTO=$(echo "$MAILTO" | sed 's/^/to=/' | sed 's/?/\&/')
41 fi
42
43 MAILTO=$(echo "$MAILTO" | sed 's/&/\n/g')
44 TO=$(echo "$MAILTO" | grep '^to=' | sed 's/^to=//' | awk '{ printf "%s,",$0 }')
45 CC=$(echo "$MAILTO" | grep '^cc=' | sed 's/^cc=//' | awk '{ printf "%s,",$0 }')
46 BCC=$(echo "$MAILTO" | grep '^bcc=' | sed 's/^bcc=//' | awk '{ printf "%s,",$0 }')
47 SUBJECT=$(echo "$MAILTO" | grep '^subject=' | tail -n 1)
48 BODY=$(echo "$MAILTO" | grep '^body=' | tail -n 1)
49 ATTACH=$(echo "$MAILTO" | sed 's/^attach=/\n\nfile:\/\//g' | awk '/^file:/ { printf "%s,",$0 }')
50
51 if [ -z "$TO" ] ; then
52 NEWMAILTO=
53 else
54 NEWMAILTO="to='$TO'"
55 fi
56 if [ -n "$CC" ] ; then
57 NEWMAILTO="${NEWMAILTO},cc='$CC'"
58 fi
59 if [ -n "$BCC" ] ; then
60 NEWMAILTO="${NEWMAILTO},bcc='$BCC'"
61 fi
62 if [ -n "$SUBJECT" ] ; then
63 NEWMAILTO="${NEWMAILTO},$SUBJECT"
64 fi
65 if [ -n "$BODY" ] ; then
66 NEWMAILTO="${NEWMAILTO},$BODY"
67 fi
68
69 if [ -n "$ATTACH" ] ; then
70 NEWMAILTO="${NEWMAILTO},attachment='${ATTACH}'"
71 fi
72
73 NEWMAILTO=$(echo "$NEWMAILTO" | sed 's/^,//')
74 DEBUG 1 "Running $THUNDERBIRD -compose \"$NEWMAILTO\""
75 "$THUNDERBIRD" -compose "$NEWMAILTO"
76 if [ $? -eq 0 ]; then
77 exit_success
78 else
79 exit_failure_operation_failed
80 fi
81}
82
dkegel@google.comf20da1f2009-06-30 19:16:32 +000083open_kde()
84{
85 local client
mdm@chromium.org56df6d32010-08-31 18:16:49 +000086 client=`kreadconfig --file emaildefaults --group PROFILE_Default --key EmailClient | cut -d ' ' -f 1`
87 echo $client | grep thunderbird > /dev/null 2>&1
88 if [ $? -eq 0 ] ; then
89 run_thunderbird "$client" "$1"
90 fi
91
dkegel@google.comf20da1f2009-06-30 19:16:32 +000092 if [ -f /etc/SuSE-release ] ; then
93 # Workaround for SUSE 10.0
mdm@chromium.org56df6d32010-08-31 18:16:49 +000094 [ -z "$client" ] && client="kmail"
95 if ! which "$client" > /dev/null 2> /dev/null; then
dkegel@google.comf20da1f2009-06-30 19:16:32 +000096 DEBUG 3 "KDE has $client configured as email client which isn't installed"
97 if which gnome-open > /dev/null 2> /dev/null && which evolution > /dev/null 2> /dev/null; then
98 DEBUG 3 "Try gnome-open instead"
99 open_gnome "$1"
100 fi
101 fi
102 fi
103 DEBUG 1 "Running kmailservice \"$1\""
mdm@chromium.orgad856b92009-07-27 21:50:25 +0000104 if [ x"$KDE_SESSION_VERSION" = x"4" ]; then
105 KMAILSERVICE=`kde4-config --locate kmailservice --path exe 2>/dev/null`
106 else
107 KMAILSERVICE=`which kmailservice 2>/dev/null`
108 fi
dkegel@google.comf20da1f2009-06-30 19:16:32 +0000109 # KDE uses locale's encoding when decoding the URI, so set it to UTF-8
mdm@chromium.orgad856b92009-07-27 21:50:25 +0000110 LC_ALL=C.UTF-8 $KMAILSERVICE "$1"
dkegel@google.comf20da1f2009-06-30 19:16:32 +0000111 kfmclient_fix_exit_code $?
112
113 if [ $? -eq 0 ]; then
114 exit_success
115 else
116 exit_failure_operation_failed
117 fi
118}
119
120open_gnome()
121{
mdm@chromium.org56df6d32010-08-31 18:16:49 +0000122 local client
123 client=`gconftool-2 --get /desktop/gnome/url-handlers/mailto/command | cut -d ' ' -f 1` || ""
124 echo $client | grep thunderbird > /dev/null 2>&1
125 if [ $? -eq 0 ] ; then
126 run_thunderbird "$client" "$1"
127 fi
128
129 if gvfs-open --help 2>/dev/null 1>&2; then
130 DEBUG 1 "Running gvfs-open \"$1\""
131 gvfs-open "$1"
132 else
133 DEBUG 1 "Running gnome-open \"$1\""
134 gnome-open "$1"
135 fi
dkegel@google.comf20da1f2009-06-30 19:16:32 +0000136
137 if [ $? -eq 0 ]; then
138 exit_success
139 else
140 exit_failure_operation_failed
141 fi
142}
143
144
145open_xfce()
146{
147 DEBUG 1 "Running exo-open \"$1\""
148 exo-open "$1"
149
150 if [ $? -eq 0 ]; then
151 exit_success
152 else
153 exit_failure_operation_failed
154 fi
155}
156
157open_generic()
158{
159 IFS=":"
160 for browser in $BROWSER; do
161 if [ x"$browser" != x"" ]; then
162
mdm@chromium.org56df6d32010-08-31 18:16:49 +0000163 browser_with_arg=`printf "$browser" "$1" 2>/dev/null`
164 if [ $? -ne 0 ]; then browser_with_arg=$browser;
165 fi
dkegel@google.comf20da1f2009-06-30 19:16:32 +0000166
167 if [ x"$browser_with_arg" = x"$browser" ]; then "$browser" "$1";
168 else $browser_with_arg;
169 fi
170
171 if [ $? -eq 0 ]; then exit_success;
172 fi
173 fi
174 done
175
176 exit_failure_operation_impossible "no method available for opening '$1'"
177}
178
179url_encode()
180{
181result=$(echo "$1" | $utf8 | awk '
182 BEGIN {
183 for ( i=1; i<=255; ++i ) ord [ sprintf ("%c", i) "" ] = i + 0
184 e = ""
185 linenr = 1
186 }
187 {
188 if ( linenr++ != 1 ) {
189 e = e "%0D%0A"
190 }
191 for ( i=1; i<=length ($0); ++i ) {
192 c = substr ($0, i, 1)
193 if ( ord [c] > 127 ) {
194 e = e "%" sprintf("%02X", ord [c])
mdm@chromium.org56df6d32010-08-31 18:16:49 +0000195 } else if ( c ~ /[@a-zA-Z0-9.-\\/]/ ) {
dkegel@google.comf20da1f2009-06-30 19:16:32 +0000196 e = e c
197 } else {
198 e = e "%" sprintf("%02X", ord [c])
199 }
200 }
201 }
202 END {
203 print e
204 }
205')
206}
207
208options=
209mailto=
210utf8="iconv -t utf8"
211while [ $# -gt 0 ] ; do
212 parm="$1"
213 shift
214
215 case "$parm" in
216 --utf8)
217 utf8="cat"
218 ;;
219
220 --to)
221 if [ -z "$1" ] ; then
222 exit_failure_syntax "email address argument missing for --to"
223 fi
224 url_encode "$1"
225 options="${options}to=${result}&"
226 shift
227 ;;
228
229 --cc)
230 if [ -z "$1" ] ; then
231 exit_failure_syntax "email address argument missing for --cc"
232 fi
233 url_encode "$1"
234 options="${options}cc=${result}&"
235 shift
236 ;;
237
238 --bcc)
239 if [ -z "$1" ] ; then
240 exit_failure_syntax "email address argument missing for --bcc"
241 fi
242 url_encode "$1"
243 options="${options}bcc=${result}&"
244 shift
245 ;;
246
247 --subject)
248 if [ -z "$1" ] ; then
249 exit_failure_syntax "text argument missing for --subject option"
250 fi
251 url_encode "$1"
252 options="${options}subject=${result}&"
253 shift
254 ;;
255
256 --body)
257 if [ -z "$1" ] ; then
258 exit_failure_syntax "text argument missing for --body option"
259 fi
260 url_encode "$1"
261 options="${options}body=${result}&"
262 shift
263 ;;
264
265 --attach)
266 if [ -z "$1" ] ; then
267 exit_failure_syntax "file argument missing for --attach option"
268 fi
269 check_input_file "$1"
270 file=`readlink -f "$1"` # Normalize path
271 if [ -z "$file" -o ! -f "$file" ] ; then
272 exit_failure_file_missing "file '$1' does not exist"
273 fi
274
275 url_encode "$file"
276 options="${options}attach=${result}&"
277 shift
278 ;;
279
280 -*)
281 exit_failure_syntax "unexpected option '$parm'"
282 ;;
283
284 mailto:*)
285 mailto="$parm"
286 ;;
287
288 *@*)
289 url_encode "$parm"
290 if [ -z "${mailto}" ] ; then
291 mailto="mailto:"${result}"?"
292 else
293 options="${options}to=${result}&"
294 fi
295 ;;
296
297 *)
298 exit_failure_syntax "unexpected argument '$parm'"
299 ;;
300 esac
301done
302
303if [ -z "${mailto}" ] ; then
304 # TO address is optional
305 mailto="mailto:?"
306fi
307
308case $mailto in
309 *\?)
310 mailto="${mailto}${options}"
311 ;;
312
313 *\?*)
314 mailto="${mailto}&${options}"
315 ;;
316
317 *)
318 mailto="${mailto}?${options}"
319 ;;
320esac
321
322# Strip trailing ? and &
323mailto=`echo "${mailto}"| sed 's/[?&]$//'`
324
325# Shouldn't happen
326[ x"${mailto}" != x"" ] || exit_failure_syntax
327
328if which @NAME@-hook.sh > /dev/null 2> /dev/null; then
329 @NAME@-hook.sh "${mailto}"
330 if [ $? -eq 0 ]; then
331 exit_success
332 else
333 exit_failure_operation_failed
334 fi
335fi
336
337detectDE
338
339if [ x"$DE" = x"" ]; then
dkegel@google.comf20da1f2009-06-30 19:16:32 +0000340 DE=generic
341fi
342
mdm@chromium.org56df6d32010-08-31 18:16:49 +0000343# if BROWSER variable is not set, check some well known browsers instead
344if [ x"$BROWSER" = x"" ]; then
345 BROWSER=links2:links:lynx:w3m
346 if [ -n "$DISPLAY" ]; then
347 BROWSER=firefox:mozilla:epiphany:konqueror:chromium-browser:google-chrome:$BROWSER
348 fi
349fi
350
dkegel@google.comf20da1f2009-06-30 19:16:32 +0000351case "$DE" in
352 kde)
353 open_kde "${mailto}"
354 ;;
355
356 gnome)
357 open_gnome "${mailto}"
358 ;;
359
360 xfce)
361 open_xfce "${mailto}"
362 ;;
363
364 generic)
365 open_generic "${mailto}"
366 ;;
367
368 *)
369 exit_failure_operation_impossible "no method available for opening '${mailto}'"
370 ;;
371esac