#!/bin/bash # Esmtp-wrapper adds shell based queueing support to esmtp. # Copyright (C) 2007 by Phil Sutter # # 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 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA qdir="$HOME/.esmtp_queue" esmtp="/usr/bin/esmtp" mktemp="/bin/mktemp" queue_mail() { # ($@) local ret=0 mkdir -p "$qdir" || { echo "unable to create queue dir $qdir" 2>&1 return 1 } mdir="`$mktemp -d "$qdir/XXXXXXXX"`" [ -d "$mdir" ] || { echo "unable to create tempdir inside $qdir" 2>&1 return 1 } echo "$@" >"$mdir/cmd" || ret=1 cat "$mdir/mail" || ret=1 [ $ret -eq 0 ] || { echo "could not enqueue mail in dir $mdir" 2>&1 return 1 } chmod 0600 $mdir/* || echo "warning setting secure permissions failed!" 2>&1 return 0 } show_mail() { # ($mdir) echo "mail in dir $1:" printf '\t%s' "`grep ^From: "$1/mail"`" printf '\t%s' "`grep ^To: "$1/mail"`" printf '\t%s\n' "`grep ^Date: "$1/mail"`" } show_queue() { # () local i=0 for dir in $qdir/*; do [ ! -d "$dir" ] && continue show_mail $dir let i++ done echo "$i mails to deliver" } send_mail() { # ($mdir) $esmtp $(<"$1/cmd") <"$1/mail" && \ rm -rf "$1" || return 1 return $? } deliver_queue() { # () local undelivered=0 for dir in $qdir/*; do [ ! -d "$dir" ] && continue sleep 5 # allow tunnel to close properly send_mail "$dir" undelivered=`expr $undelivered + $?` done return $undelivered } ME=`basename "$0"` case "$ME" in sendmail|esmtp) queue_mail "$@" || return 1 deliver_queue & ;; deliver) deliver_queue ;; mailq) if [ x"$1" = x"-q" ]; then deliver_queue else show_queue fi ;; *) exit 1 ;; esac exit $?