? properly_formatted_mail_return_path_d6.patch Index: includes/mail.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/mail.inc,v retrieving revision 1.8.2.7 diff -u -p -r1.8.2.7 mail.inc --- includes/mail.inc 18 Jun 2009 12:15:44 -0000 1.8.2.7 +++ includes/mail.inc 8 Mar 2010 08:38:22 -0000 @@ -122,6 +122,16 @@ function drupal_mail($module, $key, $to, // Invoke hook_mail_alter() to allow all modules to alter the resulting e-mail. drupal_alter('mail', $message); + // If 'Return-Path' isn't already set in php.ini, we pass it separately as an + // additional parameter instead of in the header. + 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']); + } + } + // Concatenate and wrap the e-mail body. $message['body'] = is_array($message['body']) ? drupal_wrap_mail(implode("\n\n", $message['body'])) : drupal_wrap_mail($message['body']); @@ -181,16 +191,38 @@ function drupal_mail_send($message) { foreach ($message['headers'] as $name => $value) { $mimeheaders[] = $name .': '. mime_header_encode($value); } - return mail( - $message['to'], - mime_header_encode($message['subject']), - // Note: e-mail uses CRLF for line-endings, but PHP's API requires LF. - // They will appear correctly in the actual e-mail that is sent. - str_replace("\r", '', $message['body']), - // For headers, PHP's API suggests that we use CRLF normally, - // but some MTAs incorrecly replace LF with CRLF. See #234403. - join("\n", $mimeheaders) - ); + + // Prepare mail commands. + $mail_subject = mime_header_encode($message['subject']); + // Note: e-mail uses CRLF for line-endings, but PHP's API requires LF. + // They will appear correctly in the actual e-mail that is sent. + $mail_body = str_replace("\r", '', $message['body']); + // For headers, PHP's API suggests that we use CRLF normally, + // but some MTAs incorrecly 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; } }