Должны ли заголовки mail () заканчиваться переводом строки? (Проблема IncrediMail) - PullRequest
1 голос
/ 12 июля 2011

Я использую функцию для отправки писем в формате UTF8.Поскольку по крайней мере у одного получателя возникли проблемы с электронными письмами, отправленными моей функцией (не UTF8, поэтому специальные символы повреждены; некоторые заголовки писем появляются в теле), мне интересно, нужно ли ставить еще один разрыв строки в конце строки заголовка:

function mail_utf8($to, $subject = "(No subject)", $message = "", $header = "")
{
   $header_ = 'MIME-Version: 1.0'."\r\n".'Content-type: text/plain; charset=UTF-8'."\r\n";
   $header_ .= "From: my@mail.com"; //Should be optional...
   if (!empty($header)) $header_ .= "\r\n".$header;
   $out = mail($to, '=?UTF-8?B?'.base64_encode($subject).'?=', $message, $header_);

   return $out;
}

Так что же правильно - mail_utf8("x@y.z", "", "blah", "") или mail_utf8("x@y.z", "", "blah", "\r\n")?

Редактировать : очевидный ресурс для такого рода вопросов - www.php.net/mail - использует такой разрыв строки только в примере # 4, в отличие от # 2.

Edit2 : Итак, вот текущая версия.См. Комментарии для дальнейшей информации.

function mail_utf8($to, $subject = "(No subject)", $message = "", $header = "")
{
$linebreak = PHP_EOL; //Seems to work everywhere, including IncrediMail
$linebreak = "\n"; //Debug
$header_ = 'MIME-Version: 1.0'.$linebreak.'Content-type: text/plain; charset=UTF-8'.$linebreak;
$header_ .= "From: my@mail.com".$linebreak;
if (!empty($header)) $header_ .= $header.$linebreak; //Last line break !?
$out = mail($to, '=?UTF-8?B?'.base64_encode($subject).'?=', $message, $header_);

return $out;
}

Ответы [ 2 ]

1 голос
/ 12 июля 2011

Попробуйте завершить каждую строку заголовка просто \n вместо \r\n.

Если сообщения не получены, попробуйте использовать только LF (\ n).Некоторые некачественные агенты пересылки почты Unix автоматически заменяют LF на CRLF (что приводит к удвоению CR, если используется CRLF).Это должно быть последним средством, поскольку оно не соответствует » RFC 2822 .

Источник: PHP mail() Функция

0 голосов
/ 12 июля 2011

Я думаю, что вы не можете пропустить разрыв строки в верхней части заголовка, как вы делаете это в строке 5, и старайтесь избегать множества кавычек, это выглядит как запутанный.

Переработанный пример вашей функции:

  function mail_utf8($to, $subject = "(No subject)", $message = "", $header = "") {
    $header_  = "MIME-Version: 1.0\r\nContent-type: text/plain; charset=UTF-8\r\n";
    $header_ .= "From: my@mail.com\r\n";
    if(!empty($header)) $header_ .= $header;
    $out = mail($to, '=?UTF-8?B?'.base64_encode($subject).'?=', $message, $header_);
    return $out;
  }
...