Issue #131737 by malc0mn, pillarsdotnet, xjm, scor, v1nce, Pancho, mrfelton. et al: Ensure that the Return-Path is set when sending mail on both Windows and non-Windows systems.

8.0.x
catch 2012-01-03 14:42:21 +09:00
parent 5d5cadea60
commit e526dceb97
1 changed files with 34 additions and 13 deletions

View File

@ -65,26 +65,47 @@ 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']
);
// 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 {
// 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(
// 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;
}