Add new environment variable SENDMAIL_ARGS to allow user to pass arguments to sendmai...
[pgp-tools.git] / gpg-mailkeys / gpg-mailkeys
index 2eaeac0aedae17f44d9f23e6a421a2a24fe4c5f5..7abe2200ee4dcd54811ad2a14d8e1ddd9eacaaad 100755 (executable)
@@ -8,9 +8,36 @@ set -e
 
 VERSION='$Rev$'
 
+# Define the charset used in the text message of the mail
+LOCAL_CHARSET=""
+
+##
+# Get the local charset.
+#
+# The local charset is deduced from the charset used by both ~/.gpg-mailkeysrc
+# and ~/.signature. If none of these files exist, the local charset is assumed
+# to be us-ascii.
+
+get_local_charset ()
+{
+    local charset="us-ascii"
+    local file_list="$HOME/.signature $HOME/.gpg-mailkeysrc"
+
+    for filename in $file_list; do
+
+        if [ -e $filename ]; then
+            charset=`file --mime-encoding $filename | cut -d ' ' -f 2`
+            break
+        fi
+
+    done;
+
+    LOCAL_CHARSET=$charset
+}
+
 if [ -z "$*" ]; then
-       echo "Send people their newly signed GPG key by mail."
-       echo "Usage: $0 keyid ..."
+       printf "Send people their newly signed GPG key by mail.\n"
+       printf "Usage: $0 keyid ...\n"
        exit 1
 fi
 
@@ -34,24 +61,30 @@ Here is your signed GPG key.
 Enjoy,
 $NAME"
 fi
+if [ -z "$SENDMAIL_ARGS" ]; then
+       SENDMAIL_ARGS=""
+fi
+
+get_local_charset
 
 FAILKEYS=
 
 while [ -n "$1" ]; do
-       echo -n "[$1] "
+       printf "[$1] "
        TEMPFILE=`mktemp -t gpg2mail.XXXXXX`
        ADDR=`gpg --with-colons --fixed-list-mode --list-key $1 | sed -e 's/^uid:[^re][^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:\([^:<]*<[^:>]*>\):.*/@@uid@@ \1/' -e '/^@@uid@@ /!d' -e 's/([^)]*)//g' -e 's/  */ /g' -e 's/^@@uid@@ //' | head -1`
        if [ -z "$ADDR" ]; then
-               echo "(no usable user ids)"
+               printf "(no usable user ids)\n"
                FAILKEYS="$FAILKEYS:$1"
                shift 1
                continue
        fi
-       BOUNDARY="ksp-$$-boundary-$RANDOM"
+       NANOTIME=`date +%s-%N`
+       BOUNDARY="ksp-$$-boundary-$NANOTIME"
        
-       echo -n "$ADDR:"
+       printf "$ADDR:"
        if [ $FROM ]; then
-               echo >$TEMPFILE "From: $NAME <$FROM>"
+               printf >$TEMPFILE "From: $NAME <$FROM>\n"
        fi
 cat << EOM >> $TEMPFILE
 To: $ADDR
@@ -59,45 +92,44 @@ Subject: $SUBJECT
 User-Agent: gpg-mailkeys/$VERSION
 MIME-Version: 1.0
 Content-Type: multipart/mixed; micalg=pgp-sha1;
-    protocol="application/pgp-signature"; boundary="$BOUNDARY"
+    boundary="$BOUNDARY"
 Content-Disposition: inline
 
 
 
 --$BOUNDARY
-Content-Type: text/plain; charset=us-ascii
+Content-Type: text/plain; charset=$LOCAL_CHARSET
 Content-Disposition: inline
 Content-Transfer-Encoding: quoted-printable
  
 
-$TEXT
+`echo "$TEXT" | qprint -e`
 
 EOM
 
 if [ -f ~/.signature ]; 
-       then echo "--=20" >> $TEMPFILE 
-       cat ~/.signature >> $TEMPFILE
+       then printf -- "--=20\n" >> $TEMPFILE 
+       qprint -e ~/.signature >> $TEMPFILE
 fi
 
 cat << EOM >> $TEMPFILE
 
 --$BOUNDARY
-Content-Type: text/plain; charset=us-ascii
-Content-Disposition: attachment; filename="$1.sig"
+Content-Type: application/pgp-keys
+Content-Disposition: attachment; filename="$1.asc"
 
 `gpg --armor --export $1`
 
 --$BOUNDARY--
 EOM
-       echo -n " sending"
-       /usr/sbin/sendmail -t <$TEMPFILE
+       printf " sending"
+       /usr/sbin/sendmail $SENDMAIL_ARGS -ti <$TEMPFILE
        rm $TEMPFILE
-       echo " done."
+       printf " done.\n"
        shift 1
 done
 
 if [ -n "$FAILKEYS" ]; then
-       echo
-       echo "Note: The following keys could not be sent:"
-       echo "$FAILKEYS" | tr ':' '\n' | sed -e '/^ *$/d' -e 's/^/  /'
+       printf "\nNote: The following keys could not be sent:\n"
+       printf "$FAILKEYS\n" | tr ':' '\n' | sed -e '/^ *$/d' -e 's/^/  /'
 fi