Index: modules/system/system.mail.inc =================================================================== --- modules/system/system.mail.inc (revision 20) +++ modules/system/system.mail.inc (working copy) @@ -41,23 +41,55 @@ * TRUE if the mail was successfully accepted, otherwise FALSE. */ public function mail(array $message) { + // If 'Return-Path' isn't already set in php.ini, we pass it separately + // as an additional parameter instead of in the header. + // However, if PHP's 'safe_mode' is on, this is not allowed. + if (isset($message['headers']['Return-Path']) && !ini_get('safe_mode')) { + $return_path_set = strpos(ini_get('sendmail_path'), ' -f'); + if (!$return_path_set) { + $message['Return-Path'] = $message['headers']['Return-Path']; + unset($message['headers']['Return-Path']); + } + } + + + + $mimeheaders = array(); foreach ($message['headers'] as $name => $value) { $mimeheaders[] = $name . ': ' . mime_header_encode($value); } $line_endings = variable_get('mail_line_endings', MAIL_LINE_ENDINGS); - return mail( - $message['to'], - mime_header_encode($message['subject']), - // Note: e-mail uses CRLF for line-endings. PHP's API requires LF - // on Unix and CRLF on Windows. Drupal automatically guesses the - // line-ending format appropriate for your system. If you need to - // override this, adjust $conf['mail_line_endings'] in settings.php. - preg_replace('@\r?\n@', $line_endings, $message['body']), - // For headers, PHP's API suggests that we use CRLF normally, - // but some MTAs incorrectly replace LF with CRLF. See #234403. - join("\n", $mimeheaders) - ); + + if(isset($message['Return-Path']) && !ini_get('safe_mode')) { + $mail_result = mail( + $message['to'], + mime_header_encode($message['subject']), + // Note: e-mail uses CRLF for line-endings. PHP's API requires LF + // on Unix and CRLF on Windows. Drupal automatically guesses the + // line-ending format appropriate for your system. If you need to + // override this, adjust $conf['mail_line_endings'] in settings.php. + preg_replace('@\r?\n@', $line_endings, $message['body']), + // For headers, PHP's API suggests that we use CRLF normally, + // but some MTAs incorrectly replace LF with CRLF. See #234403. + join("\n", $mimeheaders), + // Pass the Return-Path via sendmail's -f command. + '-f ' . $message['Return-Path'] + ); + } else { + // the fifth parameter is not allowed in safe mode + // no matter what you set for the fifth parameter (NULL, '', ...), + // PHP will always 'complain' + // so this means bad headers when in safe mode, unless php.ini is + // set up correctly + $mail_result = mail( + $message['to'], + mime_header_encode($message['subject']), + preg_replace('@\r?\n@', $line_endings, $message['body']), + join("\n", $mimeheaders) + ); + } + return $mail_result; } }