PHP Attach Mailer

  • Por
Clase en PHP que nos permite utilizar la función mail de PHP para enviar correos con archivos PDF como adjuntos.

En este nuevo artículo de nuestro Taller de PHP vamos a ver una clase en PHP que nos permite enviar correos con archivos PDF u otro tipo de adjuntos desde PHP y con la función nativa "Mail()".

Antes de comenzar siempre me gusta dar a conocer el autor de la clase que estamos analizando. Y en esta ocasión es "Lattuada" y nos deja esta clase en la página de PHPClasses.

Bien, ya conocemos al autor y también el lugar desde donde podemos descargarla, ahora toca ver el funcionamiento y hacer algún ejemplo.

Lo primero que tenemos que hacer es descargarnos el archivo "AttachMailer.php" y colocarlo en nuestro proyecto, en una carpeta o en la raíz.

Una vez que lo tenemos descargado y puesto en nuestro proyecto, podemos pasar a ver la estructura básica de un ejemplo con dicha clase.

<?php 
require_once('AttachMailer.php'); 

$mailer = new AttachMailer("correo@correo.com", "correo_destino@correo.com", "asunto", "hello contenido del mensaje");
$mailer->attachFile("garantia.pdf");
$mailer->send() ? "Enviado": "Problema al enviar";


El código es sencillo de entender.

Lo primero que estamos haciendo es incluir el archivo que contiene la clase.
A continuación, creamos un objeto de "AttachMailer", es decir, de la clase que nos permite enviar correos con archivos PDF u otro tipo como adjuntos.

En esa misma instancia añadimos los datos que necesitamos para poder enviar el correo.
El primero es el correo origen, luego el destinatario, el asunto del mensaje y terminamos con el cuerpo del mensaje.

La siguiente linea nos permite añadir los archivos pdf, .txt, .php, etc que queramos adjuntar. Podemos adjuntar tantos archivos como queramos. Simplemente se trata de ir añadiendo dicha línea con cada archivo.

La última es la que nos da la opción de enviar el archivo adjunto, junto con la función "send".

Cómo podéis ver es bien sencillo de utilizar, pero creo que es importante colocar el contenido de la clase para que entiendas mejor todo el código. Si entramos en el archivo "AttachMailer.php" podemos encontrar las siguientes lineas:

 <?php

/*
 * @author : nicolas Lattuada 
 * send emails with pdf attachment
 */

class AttachMailer{
    
    private $from, $to, $subject, $mess, $hash, $output;
    private $documents = Array();
    
    /*
     * @params from: adresse de l'envoyeur(+reponse)
     *            to : adresse a qui on envoie
     *            subject : le sujet du message
     *            mess : le message lui meme(format html)
     */
    function __construct($_from, $_to, $_subject, $_mess){
        $this->from = $_from;
        $this->to = $_to;
        $this->subject = $_subject;
        $this->mess = $_mess;
        $this->hash = md5(date('r', time()));
    }
    
    /*
     * @params url du document ajout
     */    
    public function attachFile($url, $name = ""){
        $attachment = chunk_split(base64_encode(file_get_contents($url)));
        $docName    = $name == "" ? basename($url) : $name;
        $randomHash = $this->hash;
        $docOutput = "--PHP-alt-$randomHash--rnrn"
                     ."--PHP-mixed-$randomHashrn"
                     ."Content-Type: application/pdf; name="$docName" rn"
                     ."Content-Transfer-Encoding: base64 rn"
                     ."Content-Disposition: attachment rnrn"
                     .$attachment . "rn";
        $this->documents[] = $docOutput;
    }
    
    private function makeMessage(){
        $randomHash = $this->hash;
        $messageOutput = "--PHP-mixed-$randomHashrn"
                         ."Content-Type: multipart/alternative; boundary=PHP-alt-$randomHashrnrn"
                         ."--PHP-alt-$randomHashrn"
                         ."Content-Type: text/plain; charset='iso-8859-1'rn"
                         ."Content-Transfer-Encoding: 7bitrnrn"
                         .$this->mess . "rnrn"
                         ."--PHP-alt-$randomHashrn"
                         ."Content-Type: text/html; charset='iso-8859-1'rn"
                         ."Content-Transfer-Encoding: 7bitrnrn"
                         . $this->mess . "rn";
                         
        foreach($this->documents as $document){
            $messageOutput .= $document; 
        }
        $messageOutput .="--PHP-mixed-$randomHash;--";
        $this->output = $messageOutput;
    }
    
    public function send(){
        $this->makeMessage();
        $from = $this->from;
        $randomHash = $this->hash;
        $headers = "From: $fromrnReply-To: $from";
        $headers .= "rnContent-Type: multipart/mixed; boundary="PHP-mixed-$randomHash"";
        $mail_sent = @mail( $this->to, $this->subject, $this->output, $headers );
        return $mail_sent ? true : false;
    }
    
}

¡Espero que te sea de utilidad y ayuda!

Autor

Sara Alvarez

Equipo DesarrolloWeb.com

Compartir

Comentarios

tecnofixer

19/11/2013
adjundar mas de un archivo
Hola, cuando adjunto mas de un archivo, sean de formato .pdf u otro me los adjunto con tamaño 0, el primer archivo se adjunta bien, y se baja birn, el resto no<br />
Saludos

LuisQuintana

26/11/2013
Código incompleto
Disculpad pero creo que las primeras líneas de código (tres primeras en rojo) no están completas.
Falta la instrucción donde se dice el email del destinatario, el del remitente y el contenido del mensaje así como la instrucción para incluir el AttachMailer.
Si estoy equivocado disculpadme pero os agradecería me lo explicarais.
Gracias
Luis

Richie

26/11/2013
Código incompleto
Luis, mira el codigo fuente de la página y verás la parte del código que falta

LuisQuintana

26/11/2013
CODIGO INCOMPLETO
Perfecto Richie, ya lo tengo, muchas gracias.
Luis

Luis

25/10/2014
duda sobre la posibilidad de una doble función
Hola a todos

Estoy desarrollando un sitio manejando por primera vez PHP, y pues las dudas van saliendo...
Me gustaría saber si es posible agregar fragmentos de código para que además de adjuntar el archivo pdf, se envíe un correo a otra persona, avisando que el pdf ya se envió al usuario que lo solicitó

Gracias por sus respuestas!!

Tany

29/5/2015
Envío con Autentificación
Y cómo haces este envío autentificando smtp?

rodrigo_perez-509675

08/7/2015
bajar archivo
Perdon soy nuevo en la pagina, de donde se baja el archivo, no encuentro el link...no lo veo en la pagina

Esneider Mendez

30/6/2016
CÓDIGO Y ACTUALIZACIÓN
Buenas tardes,
Estoy tratando de crear un pdf con la herramienta de dompdf y lo concateno al final en una variable para que no se descargue ni se muestre por el navegador,
la idea es que esa variable sea el archivo en pdf y se adjunte en un correo, ya se que los datos del correo son relevantes pero al adjuntar el siguiente codigo $mailer->attachFile($variable_antes_nombrada);
sospecho que la version del AttachMailer que tengo no es la misma del tutorial, dejo mi contacto para poder salir de esta situación. Infinitas gracias.

Wilson

13/12/2016
No recibo nada
Hola buenas tardes, tengo un problema aparentemente el correo se ha enviado, ya que me seale el mensaje de enviado, pero cuando entro a mi correo gmail que es donde envio el correo o a otro email de una cuenta de trabajo no recibo en ninguno de los 2, a alguien le paso esto ?