From 78a15e9c4806012f91c45b7f2af647d2da282ecf Mon Sep 17 00:00:00 2001
From: Bob Vincent <bobvin@pillars.net>
Date: Sat, 21 May 2011 10:59:06 -0400
Subject: [PATCH] Issue #131737 by scor, v1nce, AmrMostafa, Pancho, mrfelton, nvanhove, malc0mn, dhthwy, pillarsdotnet: Ensure that the Return-Path is set when sending mail on both Windows and non-Windows systems.

---
 modules/system/system.mail.inc |   40 ++++++++++++++++++++++------------------
 1 files changed, 22 insertions(+), 18 deletions(-)

diff --git a/modules/system/system.mail.inc b/modules/system/system.mail.inc
index ef50642c55a9db8c36ceb9a976f5f0d78096a3fc..b4cfda3d4ed20cb4685543a1396d719f27314356 100644
--- a/modules/system/system.mail.inc
+++ b/modules/system/system.mail.inc
@@ -65,26 +65,30 @@ class DefaultMailSystem implements MailSystemInterface {
     // For headers, PHP's API suggests that we use CRLF normally,
     // but some MTAs incorrectly replace LF with CRLF. See #234403.
     $mail_headers = join("\n", $mimeheaders);
+    $mail_additional = NULL;
     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']
-      );
+      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']);
+      }
+      else {
+        // On most non-Windows systems, the "-f" option to the sendmail command
+        // is used to set the Return-Path.
+        $mail_additional = '-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
-      );
+    $mail_result = @mail(
+      $message['to'],
+      $mail_subject,
+      $mail_body,
+      $mail_headers,
+      $mail_additional
+    );
+    if (isset($old_from)) {
+      // Set sendmail_from back to its previous value.
+      ini_set('sendmail_from', $old_from);
     }
     return $mail_result;
   }
-- 
1.7.4.1

