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.