diff options
Diffstat (limited to 'modules/system/system.mail.inc')
-rw-r--r-- | modules/system/system.mail.inc | 65 |
1 files changed, 43 insertions, 22 deletions
diff --git a/modules/system/system.mail.inc b/modules/system/system.mail.inc index ef50642c5..4e7544006 100644 --- a/modules/system/system.mail.inc +++ b/modules/system/system.mail.inc @@ -65,28 +65,49 @@ 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); - 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 - ); - } - return $mail_result; + + // We suppress warnings and notices from mail() because of issues on some + // hosts. The return value of this method will still indicate whether mail + // was sent successfully. + if (!isset($_SERVER['WINDIR']) && strpos($_SERVER['SERVER_SOFTWARE'], 'Win32') === FALSE) { + if (isset($message['Return-Path']) && !ini_get('safe_mode')) { + // On most non-Windows systems, the "-f" option to the sendmail command + // is used to set the Return-Path. There is no space between -f and + // the value of the return path. + $mail_result = @mail( + $message['to'], + $mail_subject, + $mail_body, + $mail_headers, + '-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 + ); + } + } + else { + // 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); + } + return $mail_result; } } |