it-swarm.com.de

Fehler mit PHP mail (): Mehrere oder fehlerhafte Zeilenumbrüche in additional_header gefunden

Ich habe plötzlich angefangen, den obigen Fehler zu erhalten, ohne dass Änderungen am Skript vorgenommen wurden.

Gastgeber ist 1and1 (ich weiß ...)

Das Skript funktioniert auf einem anderen Server weiterhin einwandfrei. Mein Verdacht ist daher, dass es einige Änderungen an der Serverkonfiguration gegeben haben muss, die dazu geführt haben, obwohl sich die Hosts auf Unwissen berufen.

Es gibt überhaupt keine Informationen zu dem oben genannten Fehler in Google, die ich finden kann. Hat jemand eine Idee? Auf dem Server läuft Apache, wenn das hilft.

37
freestate

Keine der obigen Antworten hat dieses Problem für mich gelöst. Also erweiterte ich meine Suche auf "Mail mit Anhang und HTML-Nachrichtenproblemen". Ich habe Informationen aus ein paar verschiedenen Beiträgen zusammengestellt und bin auf diese Idee gekommen. Es ermöglicht [~ # ~] sowohl [~ # ~] HTML-E-Mail als auch einen Anhang.

Mein ursprünglicher Header-Code:

$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";
}

Mein neuer Code (vollständig): Beachten Sie, dass $ body der HTML-Code ist, der von einer anderen Funktion zusammengestellt wird.

$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";
}

Zwei wichtige Änderungen hier. (1) entfernte alle mehrteiligen Sachen aus den Kopfzeilen in $ message. (2) entfernte alles "\ r\n" Zeug und fügte dem Code $eol = PHP_EOL; Hinzu.

Zusammen haben diese Änderungen es mir ermöglicht, erneut HTML-E-Mails mit Anhängen zu senden.

42
seveninstl

Hatte das gleiche Problem: Entfernte die MIME-Grenze und die Nachricht aus dem Header und alles funktionierte.

    $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

Keines der oben genannten Probleme hat es für mich behoben - Hauptproblem ist, dass Sie nichts anderes als Header-Definitionen in Header einfügen dürfen. Alte Skripte haben irgendetwas darin verbockt. Verschieben Sie daher Text oder Anhänge, die in Kopfzeilen eingefügt wurden, in den Nachrichtentext. Macht Sinn..

Dies hat eine Erklärung
(Ich denke, es ist die gleiche Lösung wie Franks oben, plus Daviscas "keine doppelten neuen Zeilen" - aber Sie benötigen doppelte neue Zeilen für Anhänge)

5
anoldermark

meine PHP Version - 5.4.43, enthält wahrscheinlich den Fehler # 68776.

googeln auf den gleichen Fehler zeigte [ http://fossies.org/diffs/php/5.4.42_vs_5.4.43/ext/standard/mail.c-diff.html]

=> Ich kann keine leeren Strings als mail () Parameter verwenden.

mein alter Code:

$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.

mein neuer Code:

$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

Dies wird Ihr Problem lösen. Ich habe ein bisschen von Franks Code geändert. Dieser Code unterstützt Anhang und 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 = "[email protected]";
$from_mail = "[email protected]";
$replyto   = "[email protected]";
$mailto    = "[email protected]";
$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

Ein weiteres Szenario, das denselben neuen Fehler verursacht, ist, wenn Sie keine Header an den Befehl "mail" senden. Früher wurde nur ein Standard verwendet, und jetzt wird der irreführende Fehler ausgegeben: "Mehrere oder fehlerhafte Zeilenumbrüche in additional_header gefunden".

Kann behoben werden, indem Folgendes hinzugefügt wird:

$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

Möglicherweise stößt du auf Bug # 69874 Kann keine leeren zusätzlichen Header für mail () setzen, wenn du nichts Dummes getan hast (d. H. Vergessen hast, die Header zu bereinigen).

Teste auf den Bug

$ php -d display_errors=1 -d display_startup_errors=1 -d error_reporting=30719 -r 'mail("[email protected]","Subject Here", "Message Here",NULL);'

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

Alternativ, wenn Sie Ihre PHP Version kennen (Hinweis: php -v) Sie können das Changelog für die Fehlernummer (69874) überprüfen, um festzustellen, ob das Update für Ihre Version angewendet wurde.

Eine kurzfristige Lösung besteht darin, Anrufe an mail () wie folgt zu ersetzen

 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

Dies ist möglicherweise jemand, der versucht, Ihren Code zu nutzen, um E-Mail-Header einzufügen.

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

Ich würde vorschlagen, dass Sie Zugriffsprotokolle usw. untersuchen und nach ungewöhnlichen Aktivitäten suchen. Die Tatsache, dass Sie Fehlermeldungen erhalten, bedeutet hoffentlich, dass Ihr Skript nicht kompromittiert wurde und stattdessen fehlerhaft ausgeführt wird. Sie müssen jedoch sicherstellen, dass.

0
edmondscommerce