commit 87d4b61bd85c854c80ccc895e10a9f0b2333e89e
parent 0fecc5ebef6e6ccb7cbfd692137489c8de2213c5
Author: Antoine Amarilli <a3nm@a3nm.net>
Date: Mon, 16 Sep 2013 10:50:31 +0200
fix
Diffstat:
msmtpq | | | 270 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
my-mutt | | | 3 | +++ |
2 files changed, 273 insertions(+), 0 deletions(-)
diff --git a/msmtpq b/msmtpq
@@ -0,0 +1,270 @@
+#!/bin/bash
+
+#--------------------------------------------------------------
+#
+# msmtpq : queue funtions to manage the msmtp queue,
+# as it was defined by Martin Lambers
+# Copyright (C) 2008 Chris Gianniotis
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or (at
+# your option) any later version.
+#
+#--------------------------------------------------------------
+
+#--------------------------------------------------------------
+#
+# This version has tiny modifications by Marianne Promberger to the original
+# found here:
+# http://www.mail-archive.com/msmtp-users@lists.sourceforge.net/msg00005.html
+#
+# -- cleaned up accidental linebreaks in comments
+# -- changed shell from /bin/sh to /bin/bash
+# -- changed logfile location
+#
+# marianne@promberger.info
+#--------------------------------------------------------------
+
+#--------------------------------------------------------------
+# the msmtp queue contains unique filenames of the following form :
+# two for each mail in the queue
+#
+# create new unique filenames of the form :
+# MLF: ccyy-mm-dd-hh.mm.ss[-x].mail -- mail file
+# MSF: ccyy-mm-dd-hh.mm.ss[-x].msmtp -- msmtp command line file
+# where x is a consecutive number only appended for uniqueness
+# if you send more than one mail per second
+#--------------------------------------------------------------
+
+
+# msmtpq is meant to be used to maintain the msmtp queue
+# there is a separate log file for all events & operations on the msmtp
+# queue that is defined below
+
+
+## !! please define the following two vars before using the msmtpq & msmtpQ
+## !! routines
+
+# msmtpQ is meant to be used directly by an email client - in 'sendmail' mode
+
+# set the queue var to the location of the msmtp queue directory
+# if the queue dir doesn't yet exist, better to create it (0700)
+# before using this routine (it will only complain ...)
+#
+Q=~/msmtp.queue # the queue - modify this to reflect where
+ # you'd like it to be
+
+# set the queue log var to the location of the msmtp queue log file
+# where it is or where you'd like it to be
+# ( note that the LOG setting could be the same as the )
+# ( 'logfile' setting in .msmtprc - but there may be )
+# ( some advantage in keeping the two logs separate )
+# if you don't want the log please unset (comment out) this var
+#
+LOG=~/logs/msmtp-queue # the log - modify to taste ...
+
+umask 077 # set secure permissions on created
+ # directories and files
+
+declare -i CNT # a count of mail(s) currently in the queue
+
+usage() {
+ echo
+ [ -n "$1" ] && { dsp '' "$@" '' ; echo ; }
+ echo ' usage : msmtpq functions'
+ echo
+ echo ' msmtpq <op>'
+ echo ' ops : -r run (flush) mail queue'
+ echo ' -d display (list) queue contents'
+ echo ' -p purge a single mail from queue'
+ echo ' -a purge all mail in queue'
+ echo ' -h this helpful blurt'
+ echo
+ echo ' - note that only one op per invocation is allowed'
+ echo ' - if more than one op is specified, the first one'
+ echo ' only is executed'
+ echo
+ [ -n "$1" ] && exit 1
+ exit 0
+}
+
+# display a message, possibly an error
+# usage : dsp [ -e ] [ -l ] msg [ msg ] ...
+# opts : -e an error ; display msg & terminate w/prejudice
+# opts : -L don't log this ; display msg only
+dsp() {
+ local ARG ERR NOL PFX
+
+ [ "$1" == '-e' ] && \
+ { ERR='t' ; shift ; } # set error flag ; shift opt off
+ [ "$1" == '-L' ] && \
+ { NOL='t' ; shift ; } # set don't log flag ; shift opt off
+
+ for ARG ; do # each msg line out ; no content - send blank
+ if [ -n "$ARG" ] ; then # line has content
+ echo " $ARG" # send it out
+ else
+ echo # send out blank
+ fi
+ done
+
+ if [ -n "$LOG" ] && [ -z "$NOL" ] ; then # logging allowed (not suppressed)
+ PFX="$(/bin/date +'%Y %b %d %H:%M:%S')" # time stamp prefix - "2008 Mar 13
+ # 03:59:45 "
+ for ARG ; do # each msg line out
+ [ -n "$ARG" ] && \
+ echo "$PFX : $ARG" >> "$LOG" # line has content ; send it to log
+ done
+ fi
+
+ [ -n "$ERR" ] && exit 1 # error ; leave w/error return
+}
+
+# verify that the msmtp queue is present
+# the first version can be used if you'd like to create the queue dir
+# if it's not found ; I'd rather just be warned if it's not there
+check_queue() { # make certain queue dir is present
+ #if [ ! -d "$Q" ] ; then # queue dir not present ; create it
+ # /bin/mkdir -p "$Q" || dsp -e 'could not create queue dir'
+ # dsp "created msmtp queue dir [ $Q ]"
+ #fi
+ [ -d "$Q" ] || \
+ dsp -e "can't find msmtp queue [ $Q ]" # queue dir not present - complain
+}
+
+# run (flush) queue
+run_queue() { # run queue
+ local LOK="${Q}/.lock" MLF MSF # lock file name ; queued mail filename pairs
+ local -i MAX=120 SEC=0 RC # max seconds to gain a lock ; seconds waiting
+
+ if (( $(/bin/ls -1 ${Q}/*.mail 2> /dev/null | \
+ /usr/bin/wc -l) > 0 )) ; then # if any mail in Q
+ # attempt to lock queue
+ while [ -e "$LOK" ] && (( SEC < MAX )) ; do # if a lock file there
+ /bin/sleep 1 # wait a second
+ (( ++SEC )) # accumulate seconds
+ done # try again while locked
+ # for MAX secs
+ if [ -e "$LOK" ] ; then # lock file still there, give up
+ dsp -e '' "cannot use $Q : waited $MAX seconds for"\
+ " lockfile [ $LOK ] to vanish ; giving up"\
+ 'if you are sure that no other instance of this script'\
+ ' is running, then delete the lock file manually' ''
+ fi
+
+ /bin/touch "$LOK" || \
+ dsp -e "couldn't create lock file [ $LOK ]" # lock queue
+
+ for MLF in ${Q}/*.mail ; do # process all mails
+ dsp "sending mail file [ $MLF ] ..." # scratch user's itch
+ MSF="${MLF%.*}.msmtp"
+ if [ ! -f "$MSF" ] ; then # no corresponding MSF file found
+ dsp "corresponding mail file [ $MSF ] not found in queue"\
+ ' worth an investigation ...' # give user the bad news
+ continue # crank on
+ fi
+ /usr/bin/msmtp $(/bin/cat "$MSF") < "$MLF" # this mail goes out the door
+ RC=$?
+ if [ $RC == 0 ] ; then # send was successful
+ /bin/rm -f "$MLF" "$MSF" # nuke the mail files
+ dsp "sent mail [ $MLF ] from queue : send successful ; purged from queue" # good news to user
+ else # send was unsuccessful
+ dsp "sent mail [ $MLF ] from queue ; send failed ; msmtp rc = $RC" # bad news ...
+ fi
+ done
+ else # no mails in queue
+ dsp -L '' 'mail queue is empty'\
+ 'nothing to run/flush' '' # inform user
+ fi
+
+ /bin/rm -f "$LOK" # remove the lock
+ nohup notmuch new &
+}
+
+# display queue contents
+display_queue() {
+ local M LST="$(/bin/ls $Q/*.mail 2>/dev/null)" # list of mails in queue
+
+ (( CNT = 0 ))
+ if [ -n "$LST" ] ; then # list has contents (any mails in queue)
+ for M in $LST ; do # cycle through each
+ dsp -L '' "mail id = [ $(/usr/bin/basename $M .mail) ]" # show mail id
+ /bin/egrep -s --colour -h '(^From:|^To:|^Subject:)' "$M" # show mail info
+ (( CNT++ )) # bump counter
+ done
+ echo
+ else # no mails ; no contents
+ dsp -L '' 'no mail in queue' '' # inform user
+ fi
+}
+
+# delete all mail in queue
+purge_all_mail() { # <-- 'one mail' opt (-1)
+ local YN I C # confirmation response ; question text ; ack text
+
+ if [ "$1" == '-1' ] ; then # queue contains single mail
+ I="remove the only mail from the queue"
+ C="single mail purged from queue"
+ else # queue contains multiple mails
+ I="remove (purge) all mail from the queue"
+ C="msmtp queue purged (all mail)"
+ display_queue
+ fi
+
+ echo -n " $I [y/N] ? ...: " ; read YN
+ case $YN in # nuke all mail in queue (dir)
+ y|Y) /bin/rm -f "$Q"/*.* ; dsp '' "$C ..." '' ;;
+ *) dsp -L '' 'nothing done ; queue is untouched ...' '' ;;
+ esac
+}
+
+# purge a single mail from queue
+purge_one_mail() {
+ local ID # id of mail being deleted
+
+ while true ; do # purge an individual mail from queue
+ display_queue # show queue contents, if any
+ if (( CNT > 0 )) ; then # something there
+ if (( CNT == 1 )) ; then # only one mail
+ purge_all_mail -1 # purge it
+ break
+ else # more than one mail
+ echo ' remove (purge) a mail from the queue ; enter its id'
+ echo -n ' ( <cr> only to exit ) ...: ' ; read ID
+ if [ -n "$ID" ] ; then # <-- file name (only, no suff)
+ if [ -n "$(/bin/ls "$Q"/"$ID".* 2>/dev/null)" ] ; then
+ /bin/rm -f "$Q"/"$ID".* # msmtp - nukes a single mail in queue (dir)
+ dsp '' "mail [ $ID ] purged from queue ..."
+ else # invalid id entered
+ dsp -L '' "mail [ $ID ] not found ; bad id ..."
+ fi
+ else # nothing entered
+ dsp -L '' 'nothing done ; queue is untouched ...' ''
+ break
+ fi
+ fi
+ else
+ break
+ fi
+ done
+}
+
+#
+## -- entry point
+#
+
+[ -z "$1" ] && usage 'msmtpq requires an instruction'
+
+check_queue # check that queue directory is present ...
+OP=${1:1} # trim off first char of OP
+case "$OP" in # sort ops ; run according to spec
+ r) run_queue ;; # run (flush) the queue
+ d) display_queue ;; # display (list) all mail in queue
+ p) purge_one_mail ;; # purge an individual mail from queue
+ a) purge_all_mail ;; # purge all mail in queue
+ h) usage ;; # show help
+ *) usage "[ $A ] is an unknown msmtpq option" ;;
+esac
+
+exit 0
diff --git a/my-mutt b/my-mutt
@@ -1,4 +1,7 @@
#!/bin/bash
+# TODO: why the hell is this ls needed to make it work with urxvt?!
+echo
+sleep 0.01
mutt -e "push '<limit>~(! ~D)<enter>G'"