varios stexto spara sde sasunto por mail imagen funcion formulario form_mail enviar documento correo con archivos archivo adjuntos adjunto adjuntar php email attachment

stexto - php enviar correo electrónico con archivo adjunto



phpmailer (4)

Parece que no puedo encontrar el problema con esta función php que escribí que debería enviar un correo electrónico con datos adjuntos. He estado luchando con eso por bastante tiempo.

function myMail($to, $subject, $mail_msg, $filename, $contentType){ $random_hash = md5(date(''r'', time())); $headers = "From: [email protected]/r/nReply-To: ".$to; $headers .= "/r/nContent-Type: ".$contentType. "; boundary=/"PHP-mixed-".$random_hash."/""; $attachment = chunk_split(base64_encode(file_get_contents($filename))); ob_start(); echo " --PHP-mixed-$random_hash Content-Type: multipart/alternative; boundary=/"PHP-alt-$random_hash/" --PHP-alt-$random_hash Content-Type: text/plain; charset=/"utf-8/" Content-Transfer-Encoding: 7bit $mail_msg --PHP-alt-$random_hash --PHP-mixed-$random_hash-- Content-Type: text/plain; name=/"$filename/" Content-Transfer-Encoding: base64 Content-Disposition: attachment $attachment --PHP-mixed-$random_hash-- "; $message = ob_get_clean(); $mail_sent = @mail( $to, $subject, $message, $headers ); return $mail_sent ? "Mail sent" : "Mail failed"; }

Editar El problema es que el mensaje del correo se mezcla con el archivo y se envía como un archivo adjunto.


A menos que esté haciendo esto para aprender sobre el funcionamiento interno de los correos de MIME, la respuesta estándar es usar una biblioteca de correo como PHPMailer o Swiftmailer que pueda manejar los archivos adjuntos listos para usar.

Ejemplos de SwiftMailer sobre cómo adjuntar archivos están aquí .


Acabo de mirar algunos de mis correos electrónicos y noto que el límite final del archivo adjunto termina con ''-'', mientras que el marcador de límite de apertura no. En tu código, tienes:

--PHP-mixed-$random_hash-- Content-Type: text/plain; name=/"$filename/" Content-Transfer-Encoding: base64 Content-Disposition: attachment $attachment --PHP-mixed-$random_hash--

Tal vez debería ser:

--PHP-mixed-$random_hash Content-Type: text/plain; name=/"$filename/" Content-Transfer-Encoding: base64 Content-Disposition: attachment $attachment --PHP-mixed-$random_hash--

Echa un vistazo al ejemplo aquí:

http://en.wikipedia.org/wiki/MIME#Multipart_messages


Artefacto me hizo mirar la salida con más atención y encontré la solución:

function myMail($to, $subject, $mail_msg, $filename, $contentType, $pathToFilename){ $random_hash = md5(date(''r'', time())); $headers = "From: [email protected]/r/nReply-To: ".$to; $headers .= "/r/nContent-Type: multipart/mixed; boundary=/"PHP-mixed-".$random_hash."/""; $attachment = chunk_split(base64_encode(file_get_contents($pathToFilename))); ob_start(); echo " --PHP-mixed-$random_hash Content-Type: multipart/alternative; boundary=/"PHP-alt-$random_hash/" --PHP-alt-$random_hash Content-Type: text/plain; charset=/"utf-8/" Content-Transfer-Encoding: 7bit $mail_msg --PHP-alt-$random_hash-- --PHP-mixed-$random_hash Content-Type: $contentType; name=/"$filename/" Content-Transfer-Encoding: base64 Content-Disposition: attachment $attachment --PHP-mixed-$random_hash-- "; $message = ob_get_clean(); $fh=fopen(''log.txt'',''w''); fwrite($fh,$message); $mail_sent = @mail( $to, $subject, $message, $headers ); return $mail_sent ? "Mail sent" : "Mail failed"; }


Estos son los encabezados que uso y siempre han funcionado como un amuleto.

$base = basename($_FILES[''upload''][''name'']); $file = fopen($randname_path,''rb''); $size = filesize($randname_path); $data = fread($file,$size); fclose($file); $data = chunk_split(base64_encode($data)); //boundary $div = "==Multipart_Boundary_x".md5(time())."x"; //headers $head = "From: $from/n". "MIME-Version: 1.0/n". "Content-Type: multipart/mixed;/n". " boundary=/"$div/""; //message $mess = "--$div/n". "Content-Type: text/plain; charset=/"iso-8859-1/"/n". "Content-Transfer-Encoding: 7bit/n/n". "$message/n/n". "--$div/n". "Content-Type: application/octet-stream; name=/"$base/"/n". "Content-Description: $base/n". "Content-Disposition: attachment;/n". " filename=/"$base/"; size=$size;/n". "Content-Transfer-Encoding: base64/n/n". "$data/n/n". "--$div/n"; $return = "-f$from";

http://asdlog.com/Create_form_to_send_email_with_attachment