Skip to content

Commit 90583f1

Browse files
committed
Merge branch 'km/send-email-remove-cruft-in-address'
* km/send-email-remove-cruft-in-address: git-send-email: allow edit invalid email address git-send-email: ask what to do with an invalid email address git-send-email: remove invalid addresses earlier git-send-email: fix fallback code in extract_valid_address() git-send-email: remove garbage after email address
2 parents 16e6e72 + d0e9810 commit 90583f1

File tree

1 file changed

+59
-18
lines changed

1 file changed

+59
-18
lines changed

git-send-email.perl

Lines changed: 59 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -781,9 +781,11 @@ sub expand_one_alias {
781781
}
782782

783783
@initial_to = expand_aliases(@initial_to);
784-
@initial_to = (map { sanitize_address($_) } @initial_to);
784+
@initial_to = validate_address_list(sanitize_address_list(@initial_to));
785785
@initial_cc = expand_aliases(@initial_cc);
786+
@initial_cc = validate_address_list(sanitize_address_list(@initial_cc));
786787
@bcclist = expand_aliases(@bcclist);
788+
@bcclist = validate_address_list(sanitize_address_list(@bcclist));
787789

788790
if ($thread && !defined $initial_reply_to && $prompting) {
789791
$initial_reply_to = ask(
@@ -826,12 +828,45 @@ sub extract_valid_address {
826828
$address =~ s/^\s*<(.*)>\s*$/$1/;
827829
if ($have_email_valid) {
828830
return scalar Email::Valid->address($address);
829-
} else {
830-
# less robust/correct than the monster regexp in Email::Valid,
831-
# but still does a 99% job, and one less dependency
832-
$address =~ /($local_part_regexp\@$domain_regexp)/;
833-
return $1;
834831
}
832+
833+
# less robust/correct than the monster regexp in Email::Valid,
834+
# but still does a 99% job, and one less dependency
835+
return $1 if $address =~ /($local_part_regexp\@$domain_regexp)/;
836+
return undef;
837+
}
838+
839+
sub extract_valid_address_or_die {
840+
my $address = shift;
841+
$address = extract_valid_address($address);
842+
die "error: unable to extract a valid address from: $address\n"
843+
if !$address;
844+
return $address;
845+
}
846+
847+
sub validate_address {
848+
my $address = shift;
849+
while (!extract_valid_address($address)) {
850+
print STDERR "error: unable to extract a valid address from: $address\n";
851+
$_ = ask("What to do with this address? ([q]uit|[d]rop|[e]dit): ",
852+
valid_re => qr/^(?:quit|q|drop|d|edit|e)/i,
853+
default => 'q');
854+
if (/^d/i) {
855+
return undef;
856+
} elsif (/^q/i) {
857+
cleanup_compose_files();
858+
exit(0);
859+
}
860+
$address = ask("Who should the email be sent to (if any)? ",
861+
default => "",
862+
valid_re => qr/\@.*\./, confirm_only => 1);
863+
}
864+
return $address;
865+
}
866+
867+
sub validate_address_list {
868+
return (grep { defined $_ }
869+
map { validate_address($_) } @_);
835870
}
836871

837872
# Usually don't need to change anything below here.
@@ -919,6 +954,10 @@ sub quote_subject {
919954
# use the simplest quoting being able to handle the recipient
920955
sub sanitize_address {
921956
my ($recipient) = @_;
957+
958+
# remove garbage after email address
959+
$recipient =~ s/(.*>).*$/$1/;
960+
922961
my ($recipient_name, $recipient_addr) = ($recipient =~ /^(.*?)\s*(<.*)/);
923962

924963
if (not $recipient_name) {
@@ -946,6 +985,10 @@ sub sanitize_address {
946985

947986
}
948987

988+
sub sanitize_address_list {
989+
return (map { sanitize_address($_) } @_);
990+
}
991+
949992
# Returns the local Fully Qualified Domain Name (FQDN) if available.
950993
#
951994
# Tightly configured MTAa require that a caller sends a real DNS
@@ -1008,14 +1051,13 @@ sub maildomain {
10081051

10091052
sub send_message {
10101053
my @recipients = unique_email_list(@to);
1011-
@cc = (grep { my $cc = extract_valid_address($_);
1054+
@cc = (grep { my $cc = extract_valid_address_or_die($_);
10121055
not grep { $cc eq $_ || $_ =~ /<\Q${cc}\E>$/ } @recipients
10131056
}
1014-
map { sanitize_address($_) }
10151057
@cc);
10161058
my $to = join (",\n\t", @recipients);
10171059
@recipients = unique_email_list(@recipients,@cc,@bcclist);
1018-
@recipients = (map { extract_valid_address($_) } @recipients);
1060+
@recipients = (map { extract_valid_address_or_die($_) } @recipients);
10191061
my $date = format_2822_time($time++);
10201062
my $gitversion = '@@GIT_VERSION@@';
10211063
if ($gitversion =~ m/..GIT_VERSION../) {
@@ -1258,7 +1300,7 @@ sub send_message {
12581300
foreach my $addr (parse_address_line($1)) {
12591301
printf("(mbox) Adding to: %s from line '%s'\n",
12601302
$addr, $_) unless $quiet;
1261-
push @to, sanitize_address($addr);
1303+
push @to, $addr;
12621304
}
12631305
}
12641306
elsif (/^Cc:\s+(.*)$/) {
@@ -1367,6 +1409,9 @@ sub send_message {
13671409
($confirm =~ /^(?:auto|compose)$/ && $compose && $message_num == 1));
13681410
$needs_confirm = "inform" if ($needs_confirm && $confirm_unconfigured && @cc);
13691411

1412+
@to = validate_address_list(sanitize_address_list(@to));
1413+
@cc = validate_address_list(sanitize_address_list(@cc));
1414+
13701415
@to = (@initial_to, @to);
13711416
@cc = (@initial_cc, @cc);
13721417

@@ -1422,14 +1467,10 @@ sub unique_email_list {
14221467
my @emails;
14231468

14241469
foreach my $entry (@_) {
1425-
if (my $clean = extract_valid_address($entry)) {
1426-
$seen{$clean} ||= 0;
1427-
next if $seen{$clean}++;
1428-
push @emails, $entry;
1429-
} else {
1430-
print STDERR "W: unable to extract a valid address",
1431-
" from: $entry\n";
1432-
}
1470+
my $clean = extract_valid_address_or_die($entry);
1471+
$seen{$clean} ||= 0;
1472+
next if $seen{$clean}++;
1473+
push @emails, $entry;
14331474
}
14341475
return @emails;
14351476
}

0 commit comments

Comments
 (0)