Difference between revisions of "Enviar mail con archivos adjuntos PHP"

From Wiki de Caballero
Jump to navigation Jump to search
 
(One intermediate revision by the same user not shown)
Line 11: Line 11:
Ahora tenemos que crear un limitador único que tendremos que añadir cada vez que introduzcamos un fragmento de email, ya sea texto, html o fichero adjunto.<br>
Ahora tenemos que crear un limitador único que tendremos que añadir cada vez que introduzcamos un fragmento de email, ya sea texto, html o fichero adjunto.<br>
<syntaxhighlight lang="php" line start="4">
<syntaxhighlight lang="php" line start="4">
$semi_rand = md5(time());<br>
$semi_rand = md5(time());
$mime_boundary = "==TecniBoundary_x{$semi_rand}x";<br>
$mime_boundary = "==TecniBoundary_x{$semi_rand}x";
</syntaxhighlight><br>
</syntaxhighlight><br>


Una vez tenemos el limitador asignado, podemos crear la cabecera del email, asignando el MIME-Version; Content-Type: multipart/mixed ya que contendrá texto y ficheros adjuntos; y no se nos puede olvidar indicar el limitador que hemos creado.<br>
Una vez tenemos el limitador asignado, podemos crear la cabecera del email, asignando el MIME-Version; Content-Type: multipart/mixed ya que contendrá texto y ficheros adjuntos; y no se nos puede olvidar indicar el limitador que hemos creado.<br>
<syntaxhighlight lang="php">
<syntaxhighlight lang="php" line start="6">
$headers = "From: $from";<br>
$headers = "From: $from";
$headers .= "\r\nMIME-Version: 1.0\r\n";<br>
$headers .= "\r\nMIME-Version: 1.0\r\n";
$headers .= "Content-Type: multipart/mixed;\r\n";<br>
$headers .= "Content-Type: multipart/mixed;\r\n";
$headers .= " boundary=\"{$mime_boundary}\"";<br>
$headers .= " boundary=\"{$mime_boundary}\"";
</syntaxhighlight><br>
</syntaxhighlight><br>


Una vez hecho esto, ya se puede empezar a introducir en el contenido del correo fragmentos de texto y adjuntos, indicando siempre en cada fragmento, el boundary con — delante y el resto de características de cada fragmento, como el Content-Type y el Content-Transfer-Encoding:<br>
Una vez hecho esto, ya se puede empezar a introducir en el contenido del correo fragmentos de texto y adjuntos, indicando siempre en cada fragmento, el boundary con — delante y el resto de características de cada fragmento, como el Content-Type y el Content-Transfer-Encoding:<br>
<syntaxhighlight lang="php">
<syntaxhighlight lang="php" line start="10">
$message = "Información del cedente";<br>
$message = "Información del cedente";
$message = "--{$mime_boundary}\r\n";<br>
$message = "--{$mime_boundary}\r\n";
$message .= "Content-Type: text/plain; charset=\"utf-8\"\r\n";<br>
$message .= "Content-Type: text/plain; charset=\"utf-8\"\r\n";
$message .= "Content-Transfer-Encoding: 7bit\r\n\r\n" . $message . "\r\n\r\n";<br>
$message .= "Content-Transfer-Encoding: 7bit\r\n\r\n" . $message . "\r\n\r\n";
</syntaxhighlight><br>
</syntaxhighlight><br>


A la hora de añadir un fichero adjunto, es necesario obtener el contenido del fichero y formatearlo adecuadamente:<br>
A la hora de añadir un fichero adjunto, es necesario obtener el contenido del fichero y formatearlo adecuadamente:<br>
<syntaxhighlight lang="php">
<syntaxhighlight lang="php" line start="14">
$file = './cotizaciones/cotizacion-' . $nombre . '.pdf';<br>
$file = './cotizaciones/cotizacion-' . $nombre . '.pdf';
$fp = fopen($file, "rb");<br>
$fp = fopen($file, "rb");
$data1 = fread($fp, filesize($file));<br>
$data1 = fread($fp, filesize($file));
fclose($fp);<br>
fclose($fp);
$data = chunk_split(base64_encode($data1), 70);<br>
$data = chunk_split(base64_encode($data1), 70);
</syntaxhighlight><br>
</syntaxhighlight><br>


Una vez formateado el fichero que adjuntaremos, añadiremos el fragmento al contenido del email sin olvidar indicar el Content-Type con el tipo de fichero adjunto, en Content-Transfer-Encoding indicaremos el tipo de codificación aplicada y por último, habrá que indicar Content-Disposition: attachment para que los clientes de correo identifiquen este fragmento de correo como un fichero adjunto.<br>
Una vez formateado el fichero que adjuntaremos, añadiremos el fragmento al contenido del email sin olvidar indicar el Content-Type con el tipo de fichero adjunto, en Content-Transfer-Encoding indicaremos el tipo de codificación aplicada y por último, habrá que indicar Content-Disposition: attachment para que los clientes de correo identifiquen este fragmento de correo como un fichero adjunto.<br>
<syntaxhighlight lang="php">
<syntaxhighlight lang="php" line start="19">
$message .= "--{$mime_boundary}\r\n";<br>
$message .= "--{$mime_boundary}\r\n";
$message .= "Content-Type: application/xlsx;";<br>
$message .= "Content-Type: application/xlsx;";
$message .= "name=\"" . basename($file) . "\"\r\n";<br>
$message .= "name=\"" . basename($file) . "\"\r\n";
$message .= "Content-Transfer-Encoding: base64" . "\r\n\r\n" . $data . "\r\n";<br>
$message .= "Content-Transfer-Encoding: base64" . "\r\n\r\n" . $data . "\r\n";
$message .= "Content-Disposition: attachment\r\n\r\n";<br>
$message .= "Content-Disposition: attachment\r\n\r\n";
</syntaxhighlight><br>
</syntaxhighlight><br>


Finalmente, antes de ejecutar la función mail de PHP, tendremos que poner el limitador con — tanto delante, como detrás, para así marcar que se ha acabado el contenido del email.<br>
Finalmente, antes de ejecutar la función mail de PHP, tendremos que poner el limitador con — tanto delante, como detrás, para así marcar que se ha acabado el contenido del email.<br>
<syntaxhighlight lang="php">
<syntaxhighlight lang="php" line start="24">
$message .= "--{$mime_boundary}--";<br>
$message .= "--{$mime_boundary}--";
mail($to, $subject, $message, $headers);<br>
mail($to, $subject, $message, $headers);
</syntaxhighlight><br>
</syntaxhighlight><br>



Latest revision as of 19:16, 7 November 2013

Ejemplo de como mandar mail con archivos adjuntos:

Inicialmente asignamos en variables los parámetros básicos del correo:

$to      = "contacto@destinatario.com";  //mail del que recibe el email.<br>
$from    = "contacto@remitente.com";     //mail del envía el email.<br>
$subject = "Cotización KafBarcelona";    //texto del asunto del email.<br>


Ahora tenemos que crear un limitador único que tendremos que añadir cada vez que introduzcamos un fragmento de email, ya sea texto, html o fichero adjunto.

$semi_rand = md5(time());
$mime_boundary = "==TecniBoundary_x{$semi_rand}x";


Una vez tenemos el limitador asignado, podemos crear la cabecera del email, asignando el MIME-Version; Content-Type: multipart/mixed ya que contendrá texto y ficheros adjuntos; y no se nos puede olvidar indicar el limitador que hemos creado.

$headers = "From: $from";
$headers .= "\r\nMIME-Version: 1.0\r\n";
$headers .= "Content-Type: multipart/mixed;\r\n";
$headers .= " boundary=\"{$mime_boundary}\"";


Una vez hecho esto, ya se puede empezar a introducir en el contenido del correo fragmentos de texto y adjuntos, indicando siempre en cada fragmento, el boundary con — delante y el resto de características de cada fragmento, como el Content-Type y el Content-Transfer-Encoding:

$message = "Información del cedente";
$message = "--{$mime_boundary}\r\n";
$message .= "Content-Type: text/plain; charset=\"utf-8\"\r\n";
$message .= "Content-Transfer-Encoding: 7bit\r\n\r\n" . $message . "\r\n\r\n";


A la hora de añadir un fichero adjunto, es necesario obtener el contenido del fichero y formatearlo adecuadamente:

$file = './cotizaciones/cotizacion-' . $nombre . '.pdf';
$fp = fopen($file, "rb");
$data1 = fread($fp, filesize($file));
fclose($fp);
$data = chunk_split(base64_encode($data1), 70);


Una vez formateado el fichero que adjuntaremos, añadiremos el fragmento al contenido del email sin olvidar indicar el Content-Type con el tipo de fichero adjunto, en Content-Transfer-Encoding indicaremos el tipo de codificación aplicada y por último, habrá que indicar Content-Disposition: attachment para que los clientes de correo identifiquen este fragmento de correo como un fichero adjunto.

$message .= "--{$mime_boundary}\r\n";
$message .= "Content-Type: application/xlsx;";
$message .= "name=\"" . basename($file) . "\"\r\n";
$message .= "Content-Transfer-Encoding: base64" . "\r\n\r\n" . $data . "\r\n";
$message .= "Content-Disposition: attachment\r\n\r\n";


Finalmente, antes de ejecutar la función mail de PHP, tendremos que poner el limitador con — tanto delante, como detrás, para así marcar que se ha acabado el contenido del email.

$message .= "--{$mime_boundary}--";
mail($to, $subject, $message, $headers);


Importante

Se debe verificar los \r\n para tengan la misma cantidad que el código y que se encuentren dentro de comillas dobles.