Etiqueta: Email

  • Cómo testear los emails que envía tu aplicación

    Cómo testear los emails que envía tu aplicación

    ¿Alguna vez te llegó un correo similar a este?

    Es un hecho: los mails que genera y envía tu aplicación son una parte de ella y, como tal, deben ser testeados.

    En este artículo te mostraré algunas técnicas que te ayudarán a encarar estas pruebas

    Testear emails enviando a un único destinatario

    Una técnica simple es hacer que todos los correos lleguen siempre a un mismo destinatario (a vos).

    La ventaja de esto es que prácticamente no necesitás nada extra (Nada que no tengas digamos).

    El problema es que implementar esto puede implicar ensuciar el código con condicionales aquí y allí.

    Si usas un componente para el envío (Como el Mailer de Symfony), las cosas pueden ser más simples.

    Basta con especificar el destinatario único en el archivo de configuración de esta forma:

    # config/packages/dev/mailer.yaml
    framework:
        mailer:
            envelope:
                recipients: ['youremail@example.com']

    A partir de aquí, todos los correos salientes serán recibidos por un único destinatario independientemente de quién sea el «verdadero».

    Testear emails usando un servidor SMTP local

    Otra forma de realizar estas pruebas es instalar un servidor SMTP local y configurarlo de modo de no realizar ningún envío, si no encolarlos todos y luego consultar los envíos pendientes.

    Realizar esta configuración desde cero puede resultar bastante engorroso.

    Afortunadamente existen algunas herramientas que simplifican mucho todo este proceso.

    Una que me parece particularmente interesante es MailHog.

    Es bastante simple de instalar y cuenta con una interface web para consultar los correos que se han «enviado» a través de ella:

    Otra ventaja no menor de usar MailHog es que viene pre-instalado con el paquete Homestead de Laravel (Una excelente herramienta para usar una máquina virtual para tus desarrollos)

    Pero, por si no te convencí de usar MailHog aún, acá te dejo algunas alternativas:

  • Cómo usar CC y BCC con PHPMailer

    Cómo usar CC y BCC con PHPMailer

    ¿Qué es PHPMailer?

    Comencemos por el principio: PHPMailer es una librería que permite enviar emails desde PHP (Podés consultar algunas opciones acá).

    Si bien no es la única (De hecho, mi preferida es SwiftMailer), su principal ventaja es que suele estar disponible en entornos de hosting compartido, con lo cual, su uso es bastante popular.

    ¿Cómo se usa?

    Su uso es bastante simple: basta con crear una instancia de PHPMailer para tener acceso a una gran cantidad de funcionalidad:

    <?php
    use PHPMailer\PHPMailer\PHPMailer;
    use PHPMailer\PHPMailer\Exception;
    
    require_once 'vendor/autoload.php';
    
    $mail = new PHPMailer();
    
    $mail->isSMTP();                                      
    $mail->Host = 'mail.google.com';
    $mail->SMTPAuth = true;                               
    $mail->Username = 'usuario@gmail.com';                
    $mail->Password = 'miSuperPassword';                           
    $mail->SMTPSecure = 'tls';                            
    $mail->Port = 587;                                   
    
    $mail->setFrom('acedmy@leewayweb.com', 'Leeway Academy');
    $mail->addAddress('juan.perez@yahoo.com', 'Juan Perez'); 
    
    $mail->Subject = 'Este es el asunto';
    $mail->Body    = 'Este el cuerpo del mensaje';
    
    if(!$mail->send()) {
        echo 'No se pudo enviar el mensaje...'.$mail->ErrorInfo;
    } else {
        echo 'El mensaje se envió!';
    }

    Claro que, antes de poder usarla, la librería debe estar instalada… En este ejemplo vemos cómo se utiliza asumiendo que se ha usado composer para incorporarla al proyecto.

    Para agregar otros destinatarios en copia (CC) o copia oculta (BCC), simplemente debemos agregar estas líneas:

    $mail->addCC('copiado@hotmail.com');
    $mail->addBCC('copia_oculta@outlook.com');

    Antes de realizar el envío.

    Por útlimo, como siempre, no hay que olvidar el $mail->send().

    ¿Alguna pregunta? ¡Deja un comentario!

     

  • Cómo enviar mails con formato usando SwiftMailer

    Cómo enviar mails con formato usando SwiftMailer

    Ya he comentado en otros artículos sobre las diferentes posibilidades para enviar emails usando PHP. De todas las que he probado hasta el momento, SwiftMailer es la que me resulta más cómoda y conveniente, sin embargo, he tenido algunas peleas a la hora de enviar mails con formato (es decir, mails que contengan HTML que necesito que sea entendido como tal y no como mero texto).

    La verdad es que es bastante simple lograrlo, sólo hay que conocer el método adecuado 🙂

    En general, lo que uno hace cuando quiere enviar un email es algo como esto:

    $message = (new Swift_Message())
      ->setSubject('Este es el asunto')
      ->setFrom(['mauro.chojrin@leewayweb.com' => 'Mauro Chojrin'])
      ->setTo(['destinatario@dominio.com' => 'Gran Amigo'])
      ->setBody('Este es el importante mensaje que quiero enviarte!!')
      ;

    El problema (si puede llamársele así) es que nos hemos olvidado que el mail acompaña a Internet desde sus inicios, con lo cual, el modo default de envío de correos es texto plano (Aunque muy poca gente lo utilice así hoy en día).

    Para enviar correos utilizando HTML se debe agregar una parte al correo que así lo especifique. Es decir, en lugar de usar setBody debemos usar addPart:

    $message = (new Swift_Message())
      ->setSubject('Este es el asunto')  ->addPart('<p>Este es el <strong>importante</strong> mensaje que quiero enviarte!!</p>')
      ->setFrom(['mauro.chojrin@leewayweb.com' => 'Mauro Chojrin'])
      ->setTo(['destinatario@dominio.com' => 'Gran Amigo'])
      ->addPart('<p>Este es el <strong>importante</strong> mensaje que quiero enviarte!!</p>')
      ;

    Si queremos ser muy puritanos, deberíamos incluir ambas versiones (La HTML y la de texto plano) para no perder a aquellas personas que no tienen habilitado el HTML en su cliente de correo (Aunque sinceramente, es muy raro que así sea y si queremos lograr un buen efecto visual, nada como el HTML, CSS y demás).

  • Cómo enviar emails desde PHP

    Cómo enviar emails desde PHP

    Es muy común la necesidad de enviar emails desde PHP, tanto si se trata de un script de CLI (como puede ser un cronjob) o de una aplicación web.

    Existen varias opciones a la hora de conseguirlo:

    La más simple es el uso de la función mail

    Es una función de bastante bajo nivel (es decir, algo tosca), pero está disponible en casi cualquier instalación de php.

    Esta opción está bien para escenarios simples, pero para usos más avanzados (como enviar adjuntos, HTML o similares), es conveniente utilizar alguna otra opción algo más robusta.

    Algunas alternativas interesantes son:

    Cualquiera de estas resultará más adecuada que el uso de la simple función mail en contextos en los que la performance sea una preocupación (Por ejemplo, cuando hay alto tráfico en el sitio) o cuando se prefiere realizar el envío a través de un servidor SMTP externo.

    Si decides usar una librería (Es decir, pasar de la función mail), algo muy interesante por hacer es apoyarte en algún servicio externo (Por ejemplo MailGun).

    Si bien es posible utilizar un servicio como este (O algún otro SMTP externo) a través de la función mail, es bastante tortuoso (Ya no depende directamente de código PHP si no que requiere de meterle mano a la configuración del sendmail y otras cuestiones así…).

    Lo mejor es usar una librería que tenga esta posibilidad, como por ejemplo SwiftMailer (Aquí un poco más de detalle).

    Otro tema importante: enviar correos con HTML (Por ejemplo para que incluyan imágenes) no es nada divertido si usas la función mail a secas.

    Por último, ten en cuenta que la función mail no realiza ninguna clase de optimización… si usas SMTP, cada envío realizará su propia conexión… imagínate la penalización de rendimiento que tendrán tus usuarios… Para evitar este problema deberías, al menos, intentar usar una librería que maneje un pool de conexiones SMTP (Casi cualquiera que no use mail :p).

    Espero haberte convencido de que la función mail es sólo para casos de emergencia :).

    ¿Lo logré o tienes alguna experiencia que indique algo diferente? ¡Deja un comentario!