xtreme: Получается, только в одном месте нужно оставить два $eol подряд? Вот так?
// Email header
$header = "From: " . $user_name . " <" . trim($_POST['contact_user_email']) . ">" . PHP_EOL;
$header .= "Reply-To: " . trim($_POST['contact_user_email']) . PHP_EOL;
$header .= "MIME-Version: 1.0" . PHP_EOL;
$header .= "Content-Type: multipart/mixed; boundary=\"" . $boundary . "\"" . PHP_EOL;
$header .= "This is a multi-part message in MIME format." . PHP_EOL;
$header .= "--" . $boundary . PHP_EOL . PHP_EOL;
// Email content
// Content-type can be text/plain or text/html
$header .= "Content-type:text/plain; charset=iso-8859-1" . PHP_EOL;
$header .= "Content-Transfer-Encoding: 7bit" . PHP_EOL;
$header .= "$message" . PHP_EOL;
$header .= "--" . $boundary . PHP_EOL;
// Attachment
$header .= "Content-Type: application/xml; name=\"" . $file_name . "\"" . PHP_EOL;
$header .= "Content-Transfer-Encoding: base64" . PHP_EOL;
$header .= "Content-Disposition: attachment; filename=\"" . $file_name . "\"" . PHP_EOL;
$header .= $content . PHP_EOL;
$header .= "--" . $boundary . "--";
Я добавил еще такую вот функцию и обернул $headers при отправке в нее:
function validateMail($str) {
return str_replace(array('\r\r', '\r\0', '\r\n\r\n', '\n\n', '\n\0', PHP_EOL . PHP_EOL), '', $str);
}
Теперь вместо ошибки просто отображается NULL и сообщение не отправляется. (UPD. Стоял лимит от хостинга в 20 сообщений на внешние ящики. А сам код работал нормально.)
UPD. Ответ на 2ой комментарий.
Честно сказать, вот те письма, что отправлялись без проблем. Как видно тут больше пустых строк и почему-то отправлялось. Опять же, очень странно, что один и тот же код работал какое-то время, а потом резко перестал. :)
![f7a889e31b134d0e9eb26b9a2b9f99f2.png](https://habrastorage.org/files/f7a/889/e31/f7a889e31b134d0e9eb26b9a2b9f99f2.png)
UPD. Решение проблемы:
Лучше всего использоваться PHP_EOL вместо \n или \r\n - сама определяется в зависимости от ОС
И разделить headers
$header = "From: " . $from . $endl;
$header .= "Reply-To: " . $user_email . $endl;
$header .= "MIME-Version: 1.0" . $endl;
$header .= "Content-Type: multipart/mixed; boundary=\"" . $uid . "\"" . $endl . $endl;
$emessage = "--" . $uid . "\n";
$emessage .= "Content-type:text/html; charset=utf-8\n";
$emessage .= "Content-Transfer-Encoding: 7bit\n\n";
$emessage .= $message . "\n\n";
$emessage .= "--" . $uid . "\n";
$emessage .= "Content-Type: application/octet-stream; name=\"" . $file_name . "\"\n";
$emessage .= "Content-Transfer-Encoding: base64\n";
$emessage .= "Content-Disposition: attachment; filename=\"" . $file_name . "\"\n\n";
$emessage .= $content . "\n\n";
$emessage .= "--" . $uid . "--";
Отправлять так:
mail($to, $subject, $emessage, $header);
У меня проблема была в этом и в том, что на хостинге лимит в 20 сообщений на внешние ящики стоит. :) Капец злой был.