change
[mail2smsgw.git] / convert2sms.sh
1 #!/bin/bash
2
3 # constants
4 MYDIR=$(dirname $0)
5 PROGNAME=$(basename $0)
6
7 # configuration variables
8 CONFIG=$MYDIR/convert2sms.rc
9 DOMAINS=$(hostname -d | awk '{ print "@" $0 }')
10 [ -f "$CONFIG" ] && source $CONFIG
11 [ -z "$GATEWAY" -o -z "$PASSWORD" ] \
12 && { echo "No valid configuration"; exit 1; }
13
14 # default variables
15 DRYRUN=
16 PHONE=
17 TEMPFILE=$HOME/tmp/smsto.$$
18
19 # urlencode function
20 function urlencode () {
21 string=$*
22
23 #[ "$DRYRUN" ] && { echo $string; return; }
24
25 for ((i = 0 ; i < ${#string} ; i++ )); do
26 c=${string:$i:1}
27 case "$c" in
28 [-_.~a-zA-Z0-9]) echo -n $c;;
29 *) printf '%%%02x' "'$c"
30 esac
31 done
32 }
33
34 # log function
35 function log () {
36 [ "$DRYRUN" ] && echo -e "\033[1;34m$*\033[0;0m" \
37 || logger -i -t SMSTO "$*"
38 }
39
40 # usage function
41 function usage () {
42 echo "usage: $PROGNAME [-h] [-p ..........]"
43 echo " -d: dryrun"
44 echo " -h: help message"
45 echo " -p: phone number"
46 exit $1
47 }
48
49 # get phone number from argument
50 while [ $# -ne 0 ]; do
51 case "$1" in
52 -d) DRYRUN=1;;
53 -h) usage 0;;
54 -p) shift; PHONE=$1;;
55 *) usage 1;;
56 esac
57 shift
58 done
59 [ "$PHONE" ] || usage 1
60
61 # clean up when done
62 trap "/bin/rm -f $TEMPFILE" 0 1 2 3 15
63
64 # get mail from standard input
65 while read -t 1 line; do
66 echo "$line" >> $TEMPFILE
67 done
68 [ -f "$TEMPFILE" ] || { echo "No input email"; exit 1; }
69
70 # analyse message to get sender and subject
71 FROM=$(awk '$1 == "From:" { sub(/[^ ]*: */, ""); print }' $TEMPFILE)
72 SUBJECT=$(awk '$1 == "Subject:" { sub(/[^ ]*: */, ""); print }' $TEMPFILE)
73 MESSAGE=$(awk '/^$/,0 { if (/^--/) exit; if (!/^$/) print }' $TEMPFILE)
74
75 # check sender domain
76 ERR=1
77 [ "$DOMAINS" ] || ERR=0
78 for d in $DOMAINS; do
79 [ "$FROM" ] || break;
80 [[ $FROM =~ $d ]] && { ERR=0; break; }
81 done
82 [ $ERR -ne 0 ] && { log "Reject from '$FROM'"; exit 1; }
83
84 # check the right pattern of the number
85 [[ "$PHONE" =~ ^0[0-9]*$ ]] \
86 || { log "Incorrect phone number '$PHONE' from '$FROM'"; exit 1; }
87 [[ "$PHONE" =~ ^00 ]] \
88 && { log "International phone number '$PHONE' from '$FROM'"; exit 1; }
89 [ ${#PHONE} -eq 10 ] \
90 || { log "Non standard phone number '$PHONE' from '$FROM'"; exit 1; }
91
92 # log message
93 log "Accept from '$FROM' to $PHONE"
94
95 # build message
96 EMAIL=${FROM/#*<}; EMAIL=${EMAIL/%>*}
97 FROM=${FROM/%<*}; FROM=${FROM/% }
98 [ "$FROM" ] || FROM=EMAIL
99 [ "$SUBJECT" ] && SUBJECT=" "$SUBJECT":"
100 [ "$MESSAGE" ] && MESSAGE=$'\n'$MESSAGE
101
102 MESSAGE=$(urlencode "[$FROM]$SUBJECT$MESSAGE")
103
104 # send http command
105 [ "$DRYRUN" ] && echo "SMS: $MESSAGE" \
106 || wget --quiet --output-document=/dev/null \
107 "http://$GATEWAY:9090/sendsms?phone=$PHONE&text=$MESSAGE&password=$PASSWORD"
108
109 exit $?