summaryrefslogtreecommitdiff
path: root/esmtp-wrapper
blob: 1a9aa1a68cc568c88a9022eed4c44b0b9c7e0918 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#!/bin/bash
#  Esmtp-wrapper adds shell based queueing support to esmtp.
#    Copyright (C) 2007 by Phil Sutter <phil@nwl.cc>
#
#  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 </dev/stdin >"$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 $?