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í:
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";