send-email: a bit more careful domain regexp.
[gitweb.git] / git-send-email.perl
index d418d6c5d2230fde2e201d31ff82dc5e26e79a9a..7b1cca70abcfcbf12c171c91d3f71ad4e43b0474 100755 (executable)
@@ -21,7 +21,6 @@
 use Term::ReadLine;
 use Getopt::Long;
 use Data::Dumper;
-use Net::SMTP;
 
 # most mail servers generate the Date: header, but not all...
 $ENV{LC_ALL} = 'C';
@@ -313,20 +312,19 @@ sub expand_aliases {
 
 sub extract_valid_address {
        my $address = shift;
+       my $local_part_regexp = '[^<>"\s@]+';
+       my $domain_regexp = '[^.<>"\s@]+(?:\.[^.<>"\s@]+)+';
 
        # check for a local address:
-       return $address if ($address =~ /^([\w\-]+)$/);
+       return $address if ($address =~ /^($local_part_regexp)$/);
 
        if ($have_email_valid) {
-               return Email::Valid->address($address);
+               return scalar Email::Valid->address($address);
        } else {
                # less robust/correct than the monster regexp in Email::Valid,
                # but still does a 99% job, and one less dependency
-               my $cleaned_address;
-               if ($address =~ /([^\"<>\s]+@[^<>\s]+)/) {
-                       $cleaned_address = $1;
-               }
-               return $cleaned_address;
+               $address =~ /($local_part_regexp\@$domain_regexp)/;
+               return $1;
        }
 }
 
@@ -387,11 +385,14 @@ sub send_message
                my $pid = open my $sm, '|-';
                defined $pid or die $!;
                if (!$pid) {
-                       exec($smtp_server,'-i',@recipients) or die $!;
+                       exec($smtp_server,'-i',
+                            map { extract_valid_address($_) }
+                            @recipients) or die $!;
                }
                print $sm "$header\n$message";
                close $sm or die $?;
        } else {
+               require Net::SMTP;
                $smtp ||= Net::SMTP->new( $smtp_server );
                $smtp->mail( $from ) or die $smtp->message;
                $smtp->to( @recipients ) or die $smtp->message;
@@ -420,7 +421,7 @@ sub send_message
 }
 
 $reply_to = $initial_reply_to;
-$references = $initial_reply_to;
+$references = $initial_reply_to || '';
 make_message_id();
 $subject = $initial_subject;