oct 17, 2009

Enviado por en PHP, Programacion

Enviar un correo con Adjunto mediante PHP

Como dice el título de la entrada, hoy abarcaremos de tema como enviar un correo con un adjunto en PHP, mediante la funcion mail() y editando los headers del correo.

Digital-e-mail-icon

Para lograr esto necesitamos espeficicar el tipo MIME multipart/mixed y convertir los adjuntos a Base64

Primero generamos una semilla unica, basado en el MD5 del tiempo actual:

$semilla = md5(date('r', time()));

Luego el destinatario y asunto:

$para = "yo@micorreo.com";
$asunto = "Correo con adjunto";

Ahora los headers del correo

$headers = "From: alguien@algo.com\r\nReply-To: alguien@algo.com";
$headers .= "\r\nContent-Type: multipart/mixed; boundary=\"PHP-mixed-".$semilla."\"";

Ahora convertimos el adjunto a base 64

$adjunto= chunk_split(base64_encode(file_get_contents("adjunto.zip")));

Ahora escribimos nuestro correo:

$correo = "
--PHP-mixed-$semilla;
Content-Type: multipart/alternative; boundary='PHP-alt-$semilla'
--PHP-alt-$semilla
Content-Type: text/plain; charset='iso-8859-1'
Content-Transfer-Encoding: 7bit

Nuestro correo en versión de texto plano

--PHP-alt-$semilla
Content-Type: text/html; charset='iso-8859-1'
Content-Transfer-Encoding: 7bit

<h2>Contenido HTML!</h2>
<p>Aqui ponemos nuestra version <b>HTML</b> de nuestro correo.</p>

--PHP-alt-$semilla--

--PHP-mixed-$semilla
Content-Type: application/zip; name=adjunto.zip
Content-Transfer-Encoding: base64
Content-Disposition: attachment 

$adjunto
--PHP-mixed-$semilla--";

Como pueden ver en la linea 10 y 19 se especifica que tipo de correo acepta el cliente, ya sea HTML o texto plano, asi que definimos 2 mensajes uno sin formato el de la linea 10-18 y uno en formato HTML lineas 10 – 17.

A partir de la linea 20 se especifica el nombre del adjunto, su encodificación y finalmente el archivo que esta definido como la variable $adjunto

Ahora la última parte es estructurar el correo de la siguiente manera:

  echo @mail($para, $asunto, $correo, $headers);

Y asi es como quedaria el codigo finalmente:

$semilla = md5(date('r', time()));
$para = "yo@micorreo.com";
$asunto = "Correo con adjunto";
$headers = "From: alguien@algo.com\r\nReply-To: alguien@algo.com";
$headers .= "\r\nContent-Type: multipart/mixed; boundary=\"PHP-mixed-".$semilla."\"";
$adjunto= chunk_split(base64_encode(file_get_contents("adjunto.zip")));
$correo = "
--PHP-mixed-$semilla;
Content-Type: multipart/alternative; boundary='PHP-alt-$semilla'
--PHP-alt-$semilla
Content-Type: text/plain; charset='iso-8859-1'
Content-Transfer-Encoding: 7bit

Nuestro correo en versión de texto plano

--PHP-alt-$semilla
Content-Type: text/html; charset='iso-8859-1'
Content-Transfer-Encoding: 7bit

<h2>Contenido HTML!</h2>
<p>Aqui ponemos nuestra version <b>HTML</b> de nuestro correo.</p>

--PHP-alt-$semilla--

--PHP-mixed-$semilla
Content-Type: application/zip; name=adjunto.zip
Content-Transfer-Encoding: base64
Content-Disposition: attachment 

$adjunto
--PHP-mixed-$semilla--";
echo @mail($para, $asunto, $correo, $headers);

Se puede editar fácilmente para integrar con un formulario o algo asi, pero de eso hablaremos luego!

Recuerden que el código es de contenido didáctico solamente!

    Posts Relacionados

    Menciones/Notificaciones

    1. depression test printable - putting out great content that generously shares... the information people are searching for, you'll see an increase in visitors to your ...

    Dejar una respuesta

    Debes ser Alojarse para enviar un comentario.