mail library example ejemplo php apache sendmail

library - phpmailer example



Error con PHP mail(): se encontraron líneas nuevas múltiples o malformadas en additional_header (9)

De repente, comenzó a recibir el error anterior sin que se hayan realizado cambios en el script.

El anfitrión es 1and1 (lo sé ...)

La secuencia de comandos todavía funciona bien en un servidor diferente, por lo que mi sospecha es que debe haber habido algún cambio en la configuración del servidor que haya llevado a esto, aunque los anfitriones aducen ignorancia.

No hay ninguna información sobre el error anterior en Google que pueda encontrar. ¿Alguien tiene alguna idea? El servidor ejecuta Apache si eso ayuda.


Es muy posible que alguien intente aprovechar su código para inyectar encabezados de correo electrónico.

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

Le sugiero que examine los registros de acceso, etc. y busque actividad inusual. El hecho de que reciba mensajes de error con suerte significa que su secuencia de comandos no se ha visto comprometida y, en su lugar, está extrayendo el mensaje de error. Sin embargo, debes asegurarte.


Es posible que te bugs.php.net/bug.php?id=69874 encontrando con el bugs.php.net/bug.php?id=69874 si no has hecho nada estúpido (es decir, se olvidó de desinfectar los encabezados).

Prueba para el error

$ 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

Alternativamente, si conoce su versión de PHP (sugerencia: php -v ), puede consultar el registro de cambios para ver el número de error (69874) para ver si la corrección se aplicó a su versión.

Una solución a corto plazo es reemplazar las llamadas a mail () como esta

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 ); }


Esto resolverá su problema. He cambiado un poco el código de Frank. Este código admitirá archivos adjuntos y 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);


Ninguna de las respuestas anteriores resolvió este problema para mí. Por lo tanto, amplié mi búsqueda para "enviar correos electrónicos con problemas de archivos adjuntos y HTML". Recopilando información de algunas publicaciones diferentes, se me ocurrió esto. Permite tanto el correo electrónico HTML como un archivo adjunto.

Mi código de encabezado original:

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

Mi nuevo código (completo): tenga en cuenta que $ body es el HTML que está siendo ensamblado por una función diferente.

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

Dos cambios clave aquí. (1) eliminó todas las cosas de varias partes de los encabezados en $ mensaje. (2) eliminó todas las cosas "/ r / n" y agregó $eol = PHP_EOL; al código

Juntos, estos cambios me permitieron enviar correos electrónicos HTML con archivos adjuntos una vez más.


Ninguno de los anteriores me lo arregló, el principal problema es que no debe poner nada más que definiciones de encabezado en los encabezados. Los viejos guiones contenían cualquier cosa allí. Mueva el texto o los archivos adjuntos que se incluyeron en los encabezados al cuerpo del mensaje. Tiene sentido..

Esto tiene una explanation
(Supongo que es la misma solución que la anterior de Frank más "líneas dobles no nuevas" de Davisca, pero es necesario duplicar las líneas nuevas para los archivos adjuntos)


Otro escenario que trae el mismo error nuevo es si no está enviando ningún encabezado al comando "mail". Solía ​​usar un valor por defecto, y ahora da el error engañoso: "Líneas nuevas o malformadas encontradas en additional_header".

Puede ser arreglado agregando esto:

$header = "From: ".$from_name." <".$from_mail.">/n"; $header .= "Reply-To: ".$replyto."/n"; $header .= "MIME-Version: 1.0/n"; ... mail($mailto,$subject,$emessage,$header);


Tenía el mismo problema.
Salió de la nada. No se modificó el código PHP.

Lo que cambió: PHP se actualizó 5.5.25-1 a 5.5.26.

Se ha corregido un riesgo de seguridad en la función PHP mail() y no se permiten additional_headers líneas additional_headers en additional_headers . Porque nuevas líneas adicionales significan: ahora comienza el mensaje de correo electrónico (y seguramente no queremos que alguien inserte líneas nuevas a través de encabezados seguidos por un mensaje maligno).

Lo que anteriormente funcionó bien, por ejemplo, tener nuevas líneas adicionales después de los encabezados o incluso pasar todo el mensaje a additional_headers , no funcionará más.

Solución :

  • Desinfecte sus encabezados. No hay nuevas líneas múltiples en el argumento additional_headers . Estos cuentan como "líneas nuevas múltiples o malformadas": /r/r, /r/0, /r/n/r/n, /n/n, /n/0 .
  • Use additional_headers para encabezados solamente. El mensaje de correo electrónico (multiparte o no, con ir sin archivos adjuntos, etc.) pertenece al argumento del message , no a los encabezados.

Informe de error de seguridad PHP: https://bugs.php.net/bug.php?id=68776
C Código diff cómo está fijo: http://git.php.net/?p=php-src.git;a=blobdiff;f=ext/standard/mail.c;h=448013a472a3466245e64b1cb37a9d1b0f7c007e;hp=1ebc8fecb7ef4c266a341cdc701f0686d6482242;hb=9d168b863e007c4e15ebe4d2eecabdf8b0582e30;hpb=eee8b6c33fc968ef8c496db8fb54e8c9d9d5a8f9


Tuve el mismo problema: Se eliminó el límite de mímica y el mensaje del encabezado y todo funcionó.

$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);


mi versión PHP - 5.4.43, probablemente contenga el error Fixed # 68776.

googleando al mismo error mostró [ http://fossies.org/diffs/php/5.4.42_vs_5.4.43/ext/standard/mail.c-diff.html]

=> No puedo usar cadenas vacías como parámetros de mail ().

mi viejo código:

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

mi nuevo código:

$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)) {