2 # sshsendmail uses ssh to send a mail message to a different machine,
3 # and is released under the terms of the GPL version 2, or any later
4 # version, at your option. See the file README and COPYING for more
6 # Copyright 2005-10 by Don Armstrong <don@donarmstrong.com>.
8 # parse command line options
20 sshsendmail - Uses ssh to send a mail message to a different machine's copy of sendmail.
24 Stick this command in /usr/lib/nullmailer/sshsendmail.
28 foohost.com sshsendmail --identity=/var/mail/.ssh/id_rsa --username remotemail --sendmail-options='-baruser@foohost.com'
30 to /etc/nullmailer/remotes.
33 --identity, -i ssh identity to use to connect to the server
34 --username, -l remote username
35 --sendmail-options, -o options to pass to sendmail
36 --debug, -d debugging level (Default 0)
37 --help, -h display this help
38 --man, -m display manual
44 =item B<--identity, -i>
46 ssh identity to send to the server we're connecting to
50 Debug verbosity. (Default 0)
54 Display brief useage information.
66 use File::Basename qw(basename);
74 # XXX parse config file
76 my %options = (debug => 0,
82 'sendmail-options' => '',
85 # this is really janky, but because nullmailer doesn't properly handle
86 # quotes, we must do it for it.
88 my $concatenate_to_last;
91 if ($concatenate_to_last) {
92 $fixed_argv[-1].=' '.$opt;
94 $concatenate_to_last = 0;
98 if (/(['"])(.+)/ && $2 !~ /$1/) {
100 $concatenate_to_last = 1;
102 push @fixed_argv,$opt;
106 GetOptions(\%options,'identity|i=s','username|l=s','daemon|d', 'syslog|s',
107 'sendmail-options|o=s',
110 pod2usage() if $options{help};
111 pod2usage({verbose=>2}) if $options{man};
113 $DEBUG = $options{debug};
116 print STDERR "${0}: Too few command-line arguments\n";
118 usage: ${0} [flags] remote-address < mail-file
119 Send an email message via ssh+sendmail
120 -p, --port=INT Set the port number on the remote host to connect to
121 -d, --daemon use syslog exclusively (Debian only)
122 -s, --syslog use syslog additionally (Debian only)
124 -h, --help Display this help and exit
129 my $hostname = shift @ARGV;
132 #throw away envelope sender
136 while (my $line = shift @message) {
137 last if $line eq "\n";
139 push @recipients,$line;
142 @recipients = qw(-t) if not @recipients;
144 my @ssh_arguments = ($hostname);
146 push @ssh_arguments, '-i', $options{identity} if defined $options{identity};
147 push @ssh_arguments, '-l', $options{username} if defined $options{username};
148 push @ssh_arguments, q(cat - | /usr/lib/sendmail ).$options{'sendmail-options'}.' '.join(' ',@recipients);
149 qx(ping -q -c 3 $hostname 2>/dev/null);
151 print STDERR "${0}: Failed: unable to ping $hostname\n";
154 my $ssh = new IO::Handle;
155 open($ssh,'|-','ssh',@ssh_arguments) or exit(17);
156 print {$ssh} @message or exit(17);
157 close $ssh or exit(17);
159 print STDERR "${0}: Failed: sendmail died for some reason\n";
163 print STDERR "${0}: Succeeded: Yeay\n";