From 9eb093e93729ffbea9e4663d04851f17275eb575 Tue, 25 Oct 2011 23:39:24 +0200
From: Bram Goffings <bramgoffings@gmail.com>
Date: Tue, 25 Oct 2011 23:39:02 +0200
Subject: [PATCH] 

Change-Id: I36f4906acfd5c7d179b649432e5c5caafe033909


diff --git a/modules/system/system.mail.inc b/modules/system/system.mail.inc
index ef50642..69d4d0a 100644
--- a/modules/system/system.mail.inc
+++ b/modules/system/system.mail.inc
@@ -66,25 +66,30 @@
     // but some MTAs incorrectly replace LF with CRLF. See #234403.
     $mail_headers = join("\n", $mimeheaders);
     if (isset($message['Return-Path']) && !ini_get('safe_mode')) {
-      $mail_result = mail(
-        $message['to'],
-        $mail_subject,
-        $mail_body,
-        $mail_headers,
-        // Pass the Return-Path via sendmail's -f command.
-        '-f ' . $message['Return-Path']
-      );
-    }
-    else {
-      // The optional $additional_parameters argument to mail() is not allowed
-      // if safe_mode is enabled. Passing any value throws a PHP warning and
-      // makes mail() return FALSE.
-      $mail_result = mail(
-        $message['to'],
-        $mail_subject,
-        $mail_body,
-        $mail_headers
-      );
+      if (isset($_SERVER['WINDIR']) || strpos($_SERVER['SERVER_SOFTWARE'], 'Win32') !== FALSE) {
+        // On Windows, PHP will use the value of sendmail_from for the
+        // Return-Path header.
+        $old_from = ini_get('sendmail_from');
+        ini_set('sendmail_from', $message['Return-Path']);
+        $mail_result = @mail(
+          $message['to'],
+          $mail_subject,
+          $mail_body,
+          $mail_headers
+        );
+        ini_set('sendmail_from', $old_from);
+      }
+      else {
+        // On most non-Windows systems, the "-f" option to the sendmail command
+        // is used to set the Return-Path.
+        $mail_result = @mail(
+          $message['to'],
+          $mail_subject,
+          $mail_body,
+          $mail_headers,
+          '-f' . $message['Return-Path']
+        );
+      }
     }
     return $mail_result;
   }
