| #!/usr/bin/perl | |
| # SPDX-License-Identifier: GPL-2.0 | |
| #----------------------------------------------------------------------------- | |
| # This program gives you low level control over an SMTP conversation. | |
| # | |
| # This program delivers a mail message to an SMTP server. Command line | |
| # options tell what server to use and determine the commands this program | |
| # sends to it. The program reads the mail message itself from | |
| # Standard Input. | |
| # | |
| # This program does not generate headers inside the mail message (e.g. | |
| # RFC 822 headers). You can use the program 'makemail' to do that. | |
| # | |
| # This program does not extract any envelope information from the mail | |
| # message or rewrite the message in any way. | |
| #----------------------------------------------------------------------------- | |
| use strict; | |
| use warnings; | |
| use Net::SMTP; | |
| use Getopt::Long; | |
| use Sys::Hostname; | |
| use Data::Dumper; | |
| my $TRUE = 1; | |
| my $FALSE = 0; | |
| sub getSender($) { | |
| my ($fromOpt) = @_; | |
| my $retval; | |
| if (defined($fromOpt)) { | |
| $retval = $fromOpt; | |
| } else { | |
| my $user = $ENV{"USER"} || $ENV{"LOGNAME"}; | |
| if (!defined("$user")) { | |
| die("You didn't supply a sender address with " . | |
| "--from and I cannot " . | |
| "default one because neither USER nor LOGNAME environment " . | |
| "variables is set."); | |
| } else { | |
| my $hostname = hostname; | |
| if (defined($hostname)) { | |
| $retval = "$user\@$hostname"; | |
| } else { | |
| $retval = $user; | |
| } | |
| } | |
| } | |
| return $retval; | |
| } | |
| ############################################################################## | |
| # MAINLINE | |
| ############################################################################## | |
| my %options; | |
| $options{"to"} = []; # Establish as an array reference | |
| GetOptions(\%options, | |
| "to=s", | |
| "from=s", | |
| "server=s", | |
| "hello=s", | |
| "timeout=i", | |
| "quiet", | |
| "debug" | |
| ); | |
| if ($options{"debug"}) { | |
| Net::SMTP->debug(1); | |
| } | |
| if (@{$options{"to"}} == 0) { | |
| die("Must specify the recipient email address with --to"); | |
| } | |
| my @recipients = @{$options{"to"}}; | |
| #print Data::Dumper->Dump([ \@recipients ], [ "recipients" ]); | |
| my $sender = getSender($options{"from"}); | |
| my $server = $options{"server"} || "localhost"; | |
| my @smtpOptions = (); # initial value | |
| if (defined($options{"hello"})) { | |
| push(@smtpOptions, Hello => $options{"hello"}); | |
| } | |
| if (defined($options{"timeout"})) { | |
| push(@smtpOptions, Timeout => $options{"timeout"}); | |
| } | |
| if ($options{"debug"}) { | |
| push(@smtpOptions, Debug => 1); | |
| } | |
| my $smtp = Net::SMTP->new($server, @smtpOptions); | |
| if (!defined($smtp)) { | |
| die("Failed to connect to SMTP server at '$server'"); | |
| } | |
| if (!$options{"quiet"}) { | |
| print("Server at $server identifies as '" . $smtp->domain . "' " . | |
| "and says:\n"); | |
| print $smtp->banner; | |
| print ("\n"); | |
| print ("Reading mail message from Standard Input...\n"); | |
| } | |
| my $result = $smtp->mail($sender); | |
| if (!$result) { | |
| warn("Failed sending MAIL command. " . | |
| "Server says '" . $smtp->message . "'"); | |
| } else { | |
| my $rcptError; | |
| foreach my $recipient (@recipients) { | |
| my $result = $smtp->recipient($recipient); | |
| if (!$result) { | |
| warn("Failed sending RCPT command for '$recipient'. " . | |
| "Server says '" . $smtp->message . "'"); | |
| $rcptError = $TRUE; | |
| } | |
| } | |
| if ($rcptError) { | |
| $smtp->quit; | |
| die("send error"); | |
| } else { | |
| my @message = <STDIN>; | |
| my $result = $smtp->data(@message); | |
| if (!$result) { | |
| warn("Server rejected message. " . | |
| "Server says '" . $smtp->message . "'"); | |
| $smtp->quit; | |
| die("rejected"); | |
| } else { | |
| $smtp->quit; | |
| if (!$options{"quiet"}) { | |
| my $recipientDesc; | |
| if (@recipients == 1) { | |
| $recipientDesc = $recipients[0]; | |
| } else { | |
| $recipientDesc = scalar(@recipients) . " recipients"; | |
| } | |
| print("Message sent to $recipientDesc from $sender.\n"); | |
| } | |
| } | |
| } | |
| } |