diff --git a/webtools/bugzilla/Bugzilla/BugMail.pm b/webtools/bugzilla/Bugzilla/BugMail.pm index e51f0c83bcdc..260cb055457b 100644 --- a/webtools/bugzilla/Bugzilla/BugMail.pm +++ b/webtools/bugzilla/Bugzilla/BugMail.pm @@ -615,6 +615,14 @@ sub MessageToMTA { my ($msg) = (@_); return if (Param('mail_delivery_method') eq "none"); + if (Param("mail_delivery_method") eq "sendmail" && $^O =~ /MSWin32/i) { + open(SENDMAIL, '|' . SENDMAIL_EXE . ' -t -i') || + die "Failed to execute " . SENDMAIL_EXE . ": $!\n"; + print SENDMAIL $msg; + close SENDMAIL; + return; + } + my @args; if (Param("mail_delivery_method") eq "sendmail" && !Param("sendmailnow")) { push @args, "-ODeliveryMode=deferred"; diff --git a/webtools/bugzilla/Bugzilla/Constants.pm b/webtools/bugzilla/Bugzilla/Constants.pm index 95b8af98c902..2ebb7f10cb10 100644 --- a/webtools/bugzilla/Bugzilla/Constants.pm +++ b/webtools/bugzilla/Bugzilla/Constants.pm @@ -89,6 +89,8 @@ use base qw(Exporter); FULLTEXT_BUGLIST_LIMIT ADMIN_GROUP_NAME + + SENDMAIL_EXE ); @Bugzilla::Constants::EXPORT_OK = qw(contenttypes); @@ -238,4 +240,7 @@ use constant FULLTEXT_BUGLIST_LIMIT => 200; # Default administration group name. use constant ADMIN_GROUP_NAME => 'admin'; +# Path to sendmail.exe (Windows only) +use constant SENDMAIL_EXE => '/usr/lib/sendmail.exe'; + 1; diff --git a/webtools/bugzilla/checksetup.pl b/webtools/bugzilla/checksetup.pl index 8364a54a8093..6069de0c931a 100755 --- a/webtools/bugzilla/checksetup.pl +++ b/webtools/bugzilla/checksetup.pl @@ -1182,9 +1182,12 @@ if (@oldparams) { } # Set mail_delivery_method to SMTP and prompt for SMTP server -# if running on Windows and set to sendmail (Mail::Mailer doesn't -# support sendmail on Windows) -if ($^O =~ /MSWin32/i && Param('mail_delivery_method') eq 'sendmail') { +# if running on Windows and no third party sendmail wrapper +# is available +if ($^O =~ /MSWin32/i + && Param('mail_delivery_method') eq 'sendmail' + && !-e SENDMAIL_EXE) +{ print "\nBugzilla requires an SMTP server to function on Windows.\n" . "Please enter your SMTP server's hostname: "; my $smtp = $answer{'SMTP_SERVER'} diff --git a/webtools/bugzilla/defparams.pl b/webtools/bugzilla/defparams.pl index d8a7b7e38384..598d0711f334 100644 --- a/webtools/bugzilla/defparams.pl +++ b/webtools/bugzilla/defparams.pl @@ -54,6 +54,7 @@ use Socket; use Bugzilla::Config qw(:DEFAULT $templatedir $webdotdir); use Bugzilla::Util; +use Bugzilla::Constants; # Checking functions for the various values # Some generic checking functions are included in Bugzilla::Config @@ -247,6 +248,18 @@ sub find_languages { return join(', ', @languages); } +sub check_mail_delivery_method { + my $check = check_multi(@_); + return $check if $check; + my $mailer = shift; + if ($mailer eq 'sendmail' && $^O =~ /MSWin32/i) { + # look for sendmail.exe + return "Failed to locate " . SENDMAIL_EXE + unless -e SENDMAIL_EXE; + } + return ""; +} + # OK, here are the parameter definitions themselves. # # Each definition is a hash with keys: @@ -694,7 +707,8 @@ sub find_languages { name => 'mail_delivery_method', desc => 'Defines how email is sent, or if it is sent at all.
' , type => 's', choices => $^O =~ /MSWin32/i - ? ['smtp', 'testfile', 'none'] + ? ['smtp', 'testfile', 'sendmail', 'none'] : ['sendmail', 'smtp', 'qmail', 'testfile', 'none'], default => 'sendmail', - checker => \&check_multi + checker => \&check_mail_delivery_method }, {