From 5d96fa703d3d9a17b39c910f3f00c6bf60b0363c Mon Sep 17 00:00:00 2001 From: Frédéric Buclin Date: Sat, 20 Sep 2014 14:17:14 +0200 Subject: Bug 502625: Replace Email::Send with Email::Sender r=dylan a=glob --- Bugzilla/Config.pm | 23 ++++++----- Bugzilla/Config/MTA.pm | 11 +---- Bugzilla/Hook.pm | 3 -- Bugzilla/Install/Requirements.pm | 16 ++------ Bugzilla/Mailer.pm | 57 ++++++++++---------------- template/en/default/admin/params/mta.html.tmpl | 4 +- 6 files changed, 41 insertions(+), 73 deletions(-) diff --git a/Bugzilla/Config.pm b/Bugzilla/Config.pm index 7ec80e1ab..fdbedbdc0 100644 --- a/Bugzilla/Config.pm +++ b/Bugzilla/Config.pm @@ -185,16 +185,19 @@ sub update_params { } # Old mail_delivery_method choices contained no uppercase characters - if (exists $param->{'mail_delivery_method'} - && $param->{'mail_delivery_method'} !~ /[A-Z]/) { - my $method = $param->{'mail_delivery_method'}; - my %translation = ( - 'sendmail' => 'Sendmail', - 'smtp' => 'SMTP', - 'qmail' => 'Qmail', - 'testfile' => 'Test', - 'none' => 'None'); - $param->{'mail_delivery_method'} = $translation{$method}; + my $mta = $param->{'mail_delivery_method'}; + if ($mta) { + if ($mta !~ /[A-Z]/) { + my %translation = ( + 'sendmail' => 'Sendmail', + 'smtp' => 'SMTP', + 'qmail' => 'Qmail', + 'testfile' => 'Test', + 'none' => 'None'); + $param->{'mail_delivery_method'} = $translation{$mta}; + } + # This will force the parameter to be reset to its default value. + delete $param->{'mail_delivery_method'} if $param->{'mail_delivery_method'} eq 'Qmail'; } # Convert the old "ssl" parameter to the new "ssl_redirect" parameter. diff --git a/Bugzilla/Config/MTA.pm b/Bugzilla/Config/MTA.pm index ec74b20b3..7be439bf6 100644 --- a/Bugzilla/Config/MTA.pm +++ b/Bugzilla/Config/MTA.pm @@ -12,13 +12,6 @@ use strict; use warnings; use Bugzilla::Config::Common; -# Return::Value 1.666002 pollutes the error log with warnings about this -# deprecated module. We have to set NO_CLUCK = 1 before loading Email::Send -# to disable these warnings. -BEGIN { - $Return::Value::NO_CLUCK = 1; -} -use Email::Send; our $sortkey = 1200; @@ -28,9 +21,7 @@ sub get_param_list { { name => 'mail_delivery_method', type => 's', - # Bugzilla is not ready yet to send mails to newsgroups, and 'IO' - # is of no use for now as we already have our own 'Test' mode. - choices => [grep {$_ ne 'NNTP' && $_ ne 'IO'} Email::Send->new()->all_mailers(), 'None'], + choices => ['Sendmail', 'SMTP', 'Test', 'None'], default => 'Sendmail', checker => \&check_mail_delivery_method }, diff --git a/Bugzilla/Hook.pm b/Bugzilla/Hook.pm index 14bac0435..2904acba1 100644 --- a/Bugzilla/Hook.pm +++ b/Bugzilla/Hook.pm @@ -1033,9 +1033,6 @@ Params: =item C - The C object that's about to be sent. -=item C - An arrayref that's passed as C to -L. - =back =head2 object_before_create diff --git a/Bugzilla/Install/Requirements.pm b/Bugzilla/Install/Requirements.pm index bec753830..db3d7b028 100644 --- a/Bugzilla/Install/Requirements.pm +++ b/Bugzilla/Install/Requirements.pm @@ -23,13 +23,6 @@ use Bugzilla::Install::Util qw(install_string bin_loc use List::Util qw(max); use Term::ANSIColor; -# Return::Value 1.666002 pollutes the error log with warnings about this -# deprecated module. We have to set NO_CLUCK = 1 before loading Email::Send -# in have_vers() to disable these warnings. -BEGIN { - $Return::Value::NO_CLUCK = 1; -} - use parent qw(Exporter); our @EXPORT = qw( REQUIRED_MODULES @@ -131,12 +124,11 @@ sub REQUIRED_MODULES { module => 'Template', version => '2.24' }, - # 2.04 implement the "Test" method (to write to data/mailer.testfile). + # 1.300011 has a debug mode for SMTP and automatically pass -i to sendmail. { - package => 'Email-Send', - module => 'Email::Send', - version => ON_WINDOWS ? '2.16' : '2.04', - blacklist => ['^2\.196$'] + package => 'Email-Sender', + module => 'Email::Sender', + version => '1.300011', }, { package => 'Email-MIME', diff --git a/Bugzilla/Mailer.pm b/Bugzilla/Mailer.pm index 576f69da8..5c0d85d33 100644 --- a/Bugzilla/Mailer.pm +++ b/Bugzilla/Mailer.pm @@ -23,15 +23,10 @@ use Date::Format qw(time2str); use Encode qw(encode); use Encode::MIME::Header; -use Email::Address; use Email::MIME; -# Return::Value 1.666002 pollutes the error log with warnings about this -# deprecated module. We have to set NO_CLUCK = 1 before loading Email::Send -# to disable these warnings. -BEGIN { - $Return::Value::NO_CLUCK = 1; -} -use Email::Send; +use Email::Sender::Simple qw(sendmail); +use Email::Sender::Transport::SMTP; +use Email::Sender::Transport::Sendmail; sub MessageToMTA { my ($msg, $send_now) = (@_); @@ -55,8 +50,6 @@ sub MessageToMTA { # Email::MIME doesn't do this for us. We use \015 (CR) and \012 (LF) # directly because Perl translates "\n" depending on what platform # you're running on. See http://perldoc.perl.org/perlport.html#Newlines - # We check for multiple CRs because of this Template-Toolkit bug: - # https://rt.cpan.org/Ticket/Display.html?id=43345 $msg =~ s/(?:\015+)?\012/\015\012/msg; $email = new Email::MIME($msg); } @@ -108,21 +101,14 @@ sub MessageToMTA { my $from = $email->header('From'); - my ($hostname, @args); - my $mailer_class = $method; + my $hostname; + my $transport; if ($method eq "Sendmail") { - $mailer_class = 'Bugzilla::Send::Sendmail'; if (ON_WINDOWS) { - $Email::Send::Sendmail::SENDMAIL = SENDMAIL_EXE; + $transport = Email::Sender::Transport::Sendmail->new({ sendmail => SENDMAIL_EXE }); } - push @args, "-i"; - # We want to make sure that we pass *only* an email address. - if ($from) { - my ($email_obj) = Email::Address->parse($from); - if ($email_obj) { - my $from_email = $email_obj->address; - push(@args, "-f$from_email") if $from_email; - } + else { + $transport = Email::Sender::Transport::Sendmail->new(); } } else { @@ -141,16 +127,16 @@ sub MessageToMTA { } if ($method eq "SMTP") { - push @args, Host => Bugzilla->params->{"smtpserver"}, - username => Bugzilla->params->{"smtp_username"}, - password => Bugzilla->params->{"smtp_password"}, - Hello => $hostname, - ssl => Bugzilla->params->{'smtp_ssl'}, - Debug => Bugzilla->params->{'smtp_debug'}; + $transport = Email::Sender::Transport::SMTP->new({ + host => Bugzilla->params->{'smtpserver'}, + sasl_username => Bugzilla->params->{'smtp_username'}, + sasl_password => Bugzilla->params->{'smtp_password'}, + helo => $hostname, + ssl => Bugzilla->params->{'smtp_ssl'}, + debug => Bugzilla->params->{'smtp_debug'} }); } - Bugzilla::Hook::process('mailer_before_send', - { email => $email, mailer_args => \@args }); + Bugzilla::Hook::process('mailer_before_send', { email => $email }); return if $email->header('to') eq ''; @@ -185,13 +171,12 @@ sub MessageToMTA { close TESTFILE; } else { - # This is useful for both Sendmail and Qmail, so we put it out here. + # This is useful for Sendmail, so we put it out here. local $ENV{PATH} = SENDMAIL_PATH; - my $mailer = Email::Send->new({ mailer => $mailer_class, - mailer_args => \@args }); - my $retval = $mailer->send($email); - ThrowCodeError('mail_send_error', { msg => $retval, mail => $email }) - if !$retval; + eval { sendmail($email, { transport => $transport }) }; + if ($@) { + ThrowCodeError('mail_send_error', { msg => $@->message, mail => $email }); + } } } diff --git a/template/en/default/admin/params/mta.html.tmpl b/template/en/default/admin/params/mta.html.tmpl index 86a7a22cb..0efbcddeb 100644 --- a/template/en/default/admin/params/mta.html.tmpl +++ b/template/en/default/admin/params/mta.html.tmpl @@ -14,7 +14,7 @@ mail_delivery_method => "Defines how email is sent, or if it is sent at all.
  • - 'Sendmail', 'SMTP' and 'Qmail' are all MTAs. + 'Sendmail' and 'SMTP' are both MTAs. You need to install a third-party sendmail replacement if you want to use sendmail on Windows.
  • @@ -23,7 +23,7 @@ in 'data/mailer.testfile' instead of being sent.
  • - 'none' will completely disable email. Bugzilla continues + 'None' will completely disable email. Bugzilla continues to act as though it is sending mail, but nothing is sent or stored.
  • -- cgit v1.2.3-24-g4f1b