X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=git-send-email.perl;h=7b1cca70abcfcbf12c171c91d3f71ad4e43b0474;hb=7612a1efdb0c0806b43db10ce784707aae874340;hp=312a4ea2aa10189eeb470a185993bb7f8af45d0e;hpb=283c8eef6c9a4e379c73904d2bc22b19341b15c8;p=git.git diff --git a/git-send-email.perl b/git-send-email.perl index 312a4ea2..7b1cca70 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -21,7 +21,6 @@ use warnings; 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'; @@ -37,7 +36,8 @@ sub cleanup_compose_files(); my $compose_filename = ".msg.$$"; # Variables we fill in automatically, or via prompting: -my (@to,@cc,@initial_cc,$initial_reply_to,$initial_subject,@files,$from,$compose,$time); +my (@to,@cc,@initial_cc,@bcclist, + $initial_reply_to,$initial_subject,@files,$from,$compose,$time); # Behavior modification variables my ($chain_reply_to, $quiet, $suppress_from, $no_signed_off_cc) = (1, 0, 0, 0); @@ -56,6 +56,7 @@ my $rc = GetOptions("from=s" => \$from, "subject=s" => \$initial_subject, "to=s" => \@to, "cc=s" => \@initial_cc, + "bcc=s" => \@bcclist, "chain-reply-to!" => \$chain_reply_to, "smtp-server=s" => \$smtp_server, "compose" => \$compose, @@ -160,6 +161,7 @@ sub expand_aliases { @to = expand_aliases(@to); @initial_cc = expand_aliases(@initial_cc); +@bcclist = expand_aliases(@bcclist); if (!defined $initial_subject && $compose) { do { @@ -269,6 +271,9 @@ Options: --cc Specify an initial "Cc:" list for the entire series of emails. + --bcc Specify a list of email addresses that should be Bcc: + on all the emails. + --compose Use \$EDITOR to edit an introductory message for the patch series. @@ -303,20 +308,23 @@ EOT } # Variables we set as part of the loop over files -our ($message_id, $cc, %mail, $subject, $reply_to, $message); +our ($message_id, $cc, %mail, $subject, $reply_to, $references, $message); 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 - return ($address =~ /([^\"<>\s]+@[^<>\s]+)/); + $address =~ /($local_part_regexp\@$domain_regexp)/; + return $1; } } @@ -348,7 +356,7 @@ sub send_message { my @recipients = unique_email_list(@to); my $to = join (",\n\t", @recipients); - @recipients = unique_email_list(@recipients,@cc); + @recipients = unique_email_list(@recipients,@cc,@bcclist); my $date = strftime('%a, %d %b %Y %H:%M:%S %z', localtime($time++)); my $gitversion = '@@GIT_VERSION@@'; if ($gitversion =~ m/..GIT_VERSION../) { @@ -367,17 +375,24 @@ Date: $date Message-Id: $message_id X-Mailer: git-send-email $gitversion "; - $header .= "In-Reply-To: $reply_to\n" if $reply_to; + if ($reply_to) { + + $header .= "In-Reply-To: $reply_to\n"; + $header .= "References: $references\n"; + } if ($smtp_server =~ m#^/#) { 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; @@ -406,6 +421,7 @@ X-Mailer: git-send-email $gitversion } $reply_to = $initial_reply_to; +$references = $initial_reply_to || ''; make_message_id(); $subject = $initial_subject; @@ -482,6 +498,11 @@ foreach my $t (@files) { # set up for the next message if ($chain_reply_to || length($reply_to) == 0) { $reply_to = $message_id; + if (length $references > 0) { + $references .= " $message_id"; + } else { + $references = "$message_id"; + } } make_message_id(); }