Предупреждение: mail (): множественные или неверные строки, найденные в проблеме с дополнительным_header, с адресом электронной почты Php [duplicate]

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

33
задан freestate 17 June 2015 в 09:31
поделиться

9 ответов

Была только аналогичная проблема. Он вышел из синего. Код PHP не был изменен.

Что изменилось: PHP был обновлен с 5.5.25-1 до 5.5.26.

Риск безопасности в функции PHP mail() исправлен, а дополнительные строки в additional_headers больше не разрешены. Потому что дополнительные символы новой строки означают: теперь начинается электронное сообщение (и мы, конечно же, не хотим, чтобы кто-то вводил некоторые новые строки через заголовки, за которыми следовало злое сообщение).

Что ранее работало нормально, например. просто добавив новые строки после заголовков или даже передав все сообщение в additional_headers, больше не будет функционировать.

Решение:

  • Санируйте заголовки. Нет нескольких строк в аргументе additional_headers. Они считаются «множественными или искаженными новостями»: \r\r, \r\0, \r\n\r\n, \n\n, \n\0.
  • Используйте только additional_headers только для заголовков. Сообщение электронной почты (multipart или нет, с ir без вложений и т. Д.) Принадлежит аргументу message, а не в заголовках.

Отчет об ошибке безопасности PHP: https://bugs.php.net/bug.php?id=68776 C Код diff как исправлено: http://git.php.net/?p=php-src.git;a=blobdiff;f=ext/standard/mail.c;h=448013a472a3466245e64b1cb37a9d1b0f7c007e;hp=1ebc8fecb7ef4c266a341cdc701f0686d6482242;hb=9d168b863e007c4e15ebe4d2eecabdf8b0582e30;hpb=eee8b6c33fc968ef8c496db8fb54e8c9d9d5a8f9

53
ответ дан davisca 19 August 2018 в 06:34
поделиться
  • 1
    У меня был дополнительный трейлинг\n в конце моих дополнительных заголовков ... удаление его решило проблему. – Yorick 30 October 2015 в 19:43
  • 2
    Отличный ответ. К сожалению, какой-то старый код использует\n\n для многократной почты в дополнительных заголовках. Может ли кто-нибудь предоставить решение для этой ситуации? – SteAp 16 November 2015 в 13:56

Ни один из вышеперечисленных не исправил это для меня - основная проблема заключается в том, что вы не должны помещать в заголовки ничего, кроме заголовков. В старых сценариях что-то там было. Поэтому переместите любой текст или вложения, которые были добавлены в заголовки в тело сообщения. Имеет смысл.

У этого есть объяснение (я предполагаю, что это то же самое решение, что и Фрэнк, плюс Дависка «нет двойных новых строк», - но вам нужно удвоенные новые строки для вложений)

5
ответ дан anoldermark 19 August 2018 в 06:34
поделиться

моя версия PHP - 5.4.43, вероятно, содержит исправленную ошибку # 68776.

googling к той же ошибке показал [ http://fossies.org/diffs/php/5.4.42_vs_5 .4.43 / ext / standard / mail.c-diff.html]

=> Я не могу использовать пустые строки как параметры mail ().

мой старый код:

$headers = 'From: ' . $frm . "\r\n";
$headers .= 'To: ' . $contactEmail . "\r\n";
if ( $flag ) {
  $headers .= 'To: ' . $contactEmail2 . "\r\n";
}
$headers .= 'Cc: ' . $contactEmailCc . "\r\n";
$headers .= 'Bcc: ' . $contactEmailBcc . "\r\n";
$headers .= 'Return-Path: ' . $frm . "\r\n";
$headers .= 'MIME-Version: 1.0' ."\r\n";
$headers .= 'Content-Type: text/HTML; charset=ISO-8859-1' . "\r\n";
$headers .= 'Content-Transfer-Encoding: 8bit'. "\n\r\n";

$headers .= $htmlText . "\r\n";

if (!mail('', $strSubject, '', $headers)) {    // !!! note the empty parameters.

мой новый код:

$headers = 'From: ' . $frm . "\r\n";
// note: no "To: " !!!
$headers .= 'Cc: ' . $contactEmailCc . "\r\n";
$headers .= 'Bcc: ' . $contactEmailBcc . "\r\n";
$headers .= 'Return-Path: ' . $frm . "\r\n";
$headers .= 'MIME-Version: 1.0' ."\r\n";   
$headers .= 'Content-Type: text/HTML; charset=ISO-8859-1' . "\r\n";
$headers .= 'Content-Transfer-Encoding: 8bit'. "\n\r\n";
// note: no $htmlText !!!

// note: new parameters:  
$mTo = $contactEmail;
if ( $flag ) {
  $mTo .= ', ' . $contactEmail2;
}

$mMessage .= $htmlText . "\r\n";

if (!mail($mTo, $strSubject, $mMessage, $headers)) {
2
ответ дан Atara 19 August 2018 в 06:34
поделиться

Возможно, вы столкнулись с ошибкой Ошибка # 69874 Невозможно установить пустые дополнительные_доны для mail () , если вы не сделали ничего глупого (т. е. забыли обработать заголовки).

Тест на ошибку

$ php -d display_errors=1 -d display_startup_errors=1 -d error_reporting=30719 -r 'mail("test@email.com","Subject Here", "Message Here",NULL);'

Warning: mail(): Multiple or malformed newlines found in additional_header in Command line code on line 1

Альтернативно, если вы знаете свою версию PHP (подсказка: php -v), вы можете проверить код изменений для номера ошибки (69874) на см., было ли исправлено для вашей версии.

Кратковременное исправление заключается в замене вызовов на почту () следующим образом:

 function fix_mail(  $to ,  $subject ,  $message , $additional_headers =NULL,  $additional_parameters=NULL ) {
            $to=filter_var($to, FILTER_SANITIZE_STRING, FILTER_FLAG_NO_ENCODE_QUOTES| FILTER_FLAG_STRIP_LOW| FILTER_FLAG_STRIP_HIGH);
            $subject=filter_var($subject, FILTER_SANITIZE_STRING, FILTER_FLAG_NO_ENCODE_QUOTES| FILTER_FLAG_STRIP_LOW| FILTER_FLAG_STRIP_HIGH);             

            if (!$additional_headers)
                    return mail(  $to ,  $subject ,  $message );

            if (!$additional_parameters)
                     return mail(  $to ,  $subject ,  $message , $additional_headers );

            return mail(  $to ,  $subject ,  $message , $additional_headers, $additional_parameters );
    }
1
ответ дан b7kich 19 August 2018 в 06:34
поделиться

Возможно, кто-то пытается использовать ваш код для ввода заголовков электронной почты.

http://resources.infosecinstitute.com/email-injection/

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

0
ответ дан edmondscommerce 19 August 2018 в 06:34
поделиться

Другой сценарий, который приносит ту же самую новую ошибку, заключается в том, что вы не отправляете заголовки в команду «mail».

Можно исправить, добавив это:

$header = "From: ".$from_name." <".$from_mail.">\n";
$header .= "Reply-To: ".$replyto."\n";
$header .= "MIME-Version: 1.0\n";

...

mail($mailto,$subject,$emessage,$header);
.

2
ответ дан eyal_katz 19 August 2018 в 06:34
поделиться

Имеет ту же проблему: удалили границу мимики и сообщение из заголовка и все сработало.

    $header = "From: ".$from_name." <".$from_mail.">\n";
    $header .= "Reply-To: ".$replyto."\n";
    $header .= "MIME-Version: 1.0\n";
    $header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\n\n";
    $emessage= "--".$uid."\n";
    $emessage.= "Content-type:text/plain; charset=iso-8859-1\n";
    $emessage.= "Content-Transfer-Encoding: 7bit\n\n";
    $emessage .= $message."\n\n";
    $emessage.= "--".$uid."\n";
    $emessage .= "Content-Type: application/octet-stream; name=\"".$filename."\"\n"; // use different content types here
    $emessage .= "Content-Transfer-Encoding: base64\n";
    $emessage .= "Content-Disposition: attachment; filename=\"".$filename."\"\n\n";
    $emessage .= $content."\n\n";
    $emessage .= "--".$uid."--";
    mail($mailto,$subject,$emessage,$header);
11
ответ дан Frank 19 August 2018 в 06:34
поделиться
  • 1
    Это было создано исправленной ошибкой # 68776 (mail () не имеет предотвращения вставки заголовка заголовка для дополнительных заголовков). – Frank 17 June 2015 в 17:24
  • 2
    Это работает, но почта не отправляется как HTML. HTML-теги отображаются по почте как есть. Любое решение? – Sunish Menon 30 June 2015 в 06:26
  • 3
    @SunishMenon - я использую - $ headers. = 'Content-Type: text / HTML; charset = ISO-8859-1 '. & Quot; \ г \n & Quot ;; $ headers. = 'Content-Transfer-Encoding: 8bit'. & Quot; \n \ г \n & Quot ;; см. мой ответ ниже – Atara 28 July 2015 в 09:10
  • 4
    Я использовал функцию рассылки здесь , поэтому я обновил ответ, чтобы отразить разделение заголовка и сообщения, которое @Frank здесь делает – shadi 30 March 2016 в 09:41
  • 5
    Мне также нужно было сбросить double \n после первого Content-Type, но он может быть специфичным для PHP7 – shadi 26 May 2016 в 16:13

Это решит вашу проблему. Я немного изменил код Фрэнка. Этот код будет поддерживать вложение и html.

 <?php

$filename  = "certificate.jpg";
$path      = "/home/omnibl/subdomains/test/certificate/certimage/";
$file      = $path . $filename;
$file_size = filesize($file);
$handle    = fopen($file, "r");
$content   = fread($handle, $file_size);
fclose($handle);

$content = chunk_split(base64_encode($content));
$uid     = md5(uniqid(time()));
$name    = basename($file);

$eol     = PHP_EOL;
$subject = "Mail Out Certificate";
$message = '<h1>Hi i m mashpy</h1>';

$from_name = "mail@example.com";
$from_mail = "mail@example.com";
$replyto   = "mail@example.com";
$mailto    = "mail@example.com";
$header    = "From: " . $from_name . " <" . $from_mail . ">\n";
$header .= "Reply-To: " . $replyto . "\n";
$header .= "MIME-Version: 1.0\n";
$header .= "Content-Type: multipart/mixed; boundary=\"" . $uid . "\"\n\n";
$emessage = "--" . $uid . "\n";
$emessage .= "Content-type:text/html; charset=iso-8859-1\n";
$emessage .= "Content-Transfer-Encoding: 7bit\n\n";
$emessage .= $message . "\n\n";
$emessage .= "--" . $uid . "\n";
$emessage .= "Content-Type: application/octet-stream; name=\"" . $filename . "\"\n"; // use different content types here
$emessage .= "Content-Transfer-Encoding: base64\n";
$emessage .= "Content-Disposition: attachment; filename=\"" . $filename . "\"\n\n";
$emessage .= $content . "\n\n";
$emessage .= "--" . $uid . "--";
mail($mailto, $subject, $emessage, $header);
2
ответ дан Mashpy Says 19 August 2018 в 06:34
поделиться
  • 1
    Отлично ... Просто нужно было исправить это в 5.4.32 до 5.4.40 php migration – GeorgeKaf 18 March 2016 в 12:51

Ни один из вышеперечисленных ответов не решил эту проблему для меня. Итак, я расширил свой поиск до «почты с приложением и сообщениями HTML-сообщения». Собирая информацию из нескольких разных сообщений, я придумал это. Это позволяет BOTH HTML-адрес электронной почты и вложение.

Мой исходный код заголовка:

$header = "From: ".$from_name." <".$from_mail.">\r\n";
$header .= "Reply-To: ".$replyto."\r\n";
$header .= "MIME-Version: 1.0\r\n";
$header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n";
$header .= "--".$uid."\r\n";
$header .= "Content-Type: text/html; charset=ISO-8859-1\r\n";
$header .= "Content-Transfer-Encoding: 8bit\r\n";
$header .= $body."\r\n";
$header .= "--".$uid."\r\n";
$header .= "Content-Type: application/pdf; name=\"".$filename."\"\r\n"; 
$header .= "Content-Transfer-Encoding: base64\r\n";
$header .= "Content-Disposition: attachment; filename=\"".$filename."\"\r\n";
$header .= $content."\r\n";
$header .= "--".$uid."--";

if (mail($mail_to, $subject, "", $header))
{
    return "mail_success";
}
else
{
    return "mail_error";
}

Мой новый код (полный): Обратите внимание, что $ body это HTML, который собирается другой функцией.

$file = $path.$filename;
$file_size = filesize($file);
$handle = fopen($file, "r");
$content = fread($handle, $file_size);
fclose($handle);

$content = chunk_split(base64_encode($content));
$uid = md5(uniqid(time()));
$name = basename($file);

$eol = PHP_EOL;

// Basic headers
$header = "From: ".$from_name." <".$from_mail.">".$eol;
$header .= "Reply-To: ".$replyto.$eol;
$header .= "MIME-Version: 1.0\r\n";
$header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"";

// Put everything else in $message
$message = "--".$uid.$eol;
$message .= "Content-Type: text/html; charset=ISO-8859-1".$eol;
$message .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
$message .= $body.$eol;
$message .= "--".$uid.$eol;
$message .= "Content-Type: application/pdf; name=\"".$filename."\"".$eol;
$message .= "Content-Transfer-Encoding: base64".$eol;
$message .= "Content-Disposition: attachment; filename=\"".$filename."\"".$eol;
$message .= $content.$eol;
$message .= "--".$uid."--";

if (mail($mail_to, $subject, $message, $header))
{
    return "mail_success";
}
else
{
    return "mail_error";
}

Здесь два ключевых изменения. (1) удалил все многочастные вещи из заголовков в $ message. (2) удалил все материалы «\r\n» и добавил $eol = PHP_EOL; в код.

Вместе эти изменения позволили мне еще раз отправить HTML-письмо с вложениями.

38
ответ дан Mike 19 August 2018 в 06:34
поделиться
  • 1
    Это сработало, однако у меня возникли проблемы с отправкой нескольких вложений – RedRory 15 September 2015 в 22:42
  • 2
    Помните, что перед контентом у вас должна быть новая строка (новые строки после последнего заголовка), она должна быть ... $ message. = & Quot; Content-Disposition: attachment; имя файла = \ & Quot; & Quot;. $ имя_файла & Quot;. \ & Quot; & Quot;.. $ EOL EOL $; $ message. = $ content. $ eol; – Henrique Rocha 17 June 2016 в 16:24
  • 3
    Он решил мою проблему, но можете ли вы помочь мне в нескольких приложениях? – Harsh Sanghani 19 September 2016 в 05:04
  • 4
    все еще говорит "MIME-Version: 1.0\r\n"; – commonpike 12 July 2017 в 13:54
Другие вопросы по тегам:

Похожие вопросы: