send-email: Change from Mail::Sendmail to Net::SMTP
authorEric Wong <normalperson@yhbt.net>
Sun, 26 Mar 2006 01:20:48 +0000 (17:20 -0800)
committerJunio C Hamano <junkio@cox.net>
Sun, 26 Mar 2006 01:41:06 +0000 (17:41 -0800)
Net::SMTP is in the base Perl distribution, so users are more
likely to have it.  Net::SMTP also allows reusing the SMTP
connection, so sending multiple emails is faster.

[jc: tweaked X-Mailer further while we are at it.]

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
git-send-email.perl

index 7c27eed..e578aff 100755 (executable)
 use strict;
 use warnings;
 use Term::ReadLine;
-use Mail::Sendmail qw(sendmail %mailcfg);
 use Getopt::Long;
 use Data::Dumper;
+use Net::SMTP;
 use Email::Valid;
 
+# most mail servers generate the Date: header, but not all...
+$ENV{LC_ALL} = 'C';
+use POSIX qw/strftime/;
+
+my $smtp;
+
 sub unique_email_list(@);
 sub cleanup_compose_files();
 
@@ -270,35 +276,45 @@ $cc = "";
 
 sub send_message
 {
-       my $to = join (", ", unique_email_list(@to));
-
-       %mail = (       To      =>      $to,
-                       From    =>      $from,
-                       CC      =>      $cc,
-                       Subject =>      $subject,
-                       Message =>      $message,
-                       'Reply-to'      =>      $from,
-                       'In-Reply-To'   =>      $reply_to,
-                       'Message-ID'    =>      $message_id,
-                       'X-Mailer'      =>      "git-send-email",
-               );
-
-       $mail{smtp} = $smtp_server;
-       $mailcfg{mime} = 0;
-
-       #print Data::Dumper->Dump([\%mail],[qw(*mail)]);
-
-       sendmail(%mail) or die $Mail::Sendmail::error;
+       my @recipients = unique_email_list(@to);
+       my $to = join (",\n\t", @recipients);
+       @recipients = unique_email_list(@recipients,@cc);
+       my $date = strftime('%a, %d %b %Y %H:%M:%S %z', localtime(time));
+
+       my $header = "From: $from
+To: $to
+Cc: $cc
+Subject: $subject
+Reply-To: $from
+Date: $date
+Message-Id: $message_id
+X-Mailer: git-send-email @@GIT_VERSION@@
+";
+       $header .= "In-Reply-To: $reply_to\n" if $reply_to;
+
+       $smtp ||= Net::SMTP->new( $smtp_server );
+       $smtp->mail( $from ) or die $smtp->message;
+       $smtp->to( @recipients ) or die $smtp->message;
+       $smtp->data or die $smtp->message;
+       $smtp->datasend("$header\n$message") or die $smtp->message;
+       $smtp->dataend() or die $smtp->message;
+       $smtp->ok or die "Failed to send $subject\n".$smtp->message;
 
        if ($quiet) {
                printf "Sent %s\n", $subject;
        } else {
-               print "OK. Log says:\n", $Mail::Sendmail::log;
-               print "\n\n"
+               print "OK. Log says:
+Date: $date
+Server: $smtp_server Port: 25
+From: $from
+Subject: $subject
+Cc: $cc
+To: $to
+
+Result: ", $smtp->code, ' ', ($smtp->message =~ /\n([^\n]+\n)$/s), "\n";
        }
 }
 
-
 $reply_to = $initial_reply_to;
 make_message_id();
 $subject = $initial_subject;
@@ -389,7 +405,7 @@ sub cleanup_compose_files() {
 
 }
 
-
+$smtp->quit if $smtp;
 
 sub unique_email_list(@) {
        my %seen;