# ¿Qué es y para que sirve PHPMailer?

En algunos servidores no está disponible la función **mail()** de PHP. \
Esta función es cada vez más habitual que esté desactivada en los servidores como medida de seguridad. \
Normalmente se desactiva por protección contra SPAM, Mail Spoofing y Proxy Mail Servers.\
En caso de que cualquiera de las webs alojadas sea vulnerada por un usuario malintencionado, se evitan los riesgos mencionados, deshabilitando esta función.

### La librería PHPMailer

La librería PHPMailer nos permite, entre otras funcionalidades, establecer una conexión SMTP con un servidor de correo. Este servidor SMTP será quién envíe realmente nuestro correo electrónico.

La web oficial del proyecto en GitHub contiene la documentación con las opciones de instalación y configuración. \
El enlace a Github es: <https://github.com/PHPMailer/PHPMailer>.

### Instalación de PHPMailer

1. Descargá **PHPMailer** desde <https://github.com/PHPMailer/PHPMailer>. \
   Presioná el botón verde **Code** y, luego,  hacé clic en **Download ZIP** en el cuadro **Clone**. <br>

<figure><img src="https://3368453466-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtxuPnaaHDcmSjTmrlrko%2Fuploads%2Fgit-blob-3af99e33393ba2bd236192a95a897ae94aa13f87%2FCorreoErroresPHPMailer01.png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://3368453466-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtxuPnaaHDcmSjTmrlrko%2Fuploads%2Fgit-blob-d89d2fb5c165e9486686f55baae56cc9d652501d%2FCorreoErroresPHPMailer02.png?alt=media" alt=""><figcaption></figcaption></figure>

2. Descomprimí el archivo descargado “**PHPMailer-master.zip**” y renombrá el directorio **PHPMailer-master** a **PHPMailer**
3. Copiá el directorio **PHPMailer** dentro de la raíz de tu página web (por ejemplo public\_html). Para verificar que las rutas son correctas, debería existir, desde la raíz de nuestro proyecto: **/PHPMailer/src/PHPMailer.php**

### Ejemplo de configuración

1. Guardá el siguiente código en un archivo, por ejemplo, **ejemplo.php**

```
// Some code<?php
// Mostrar errores PHP (Desactivar en producción)
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

// Incluir la libreria PHPMailer
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
use PHPMailer\PHPMailer\SMTP;

require 'PHPMailer/src/Exception.php';
require 'PHPMailer/src/PHPMailer.php';
require 'PHPMailer/src/SMTP.php';

// Inicio
$mail = new PHPMailer(true);

try {
    // Configuracion SMTP
    $mail->SMTPDebug = SMTP::DEBUG_SERVER;                         // Mostrar salida (Desactivar en producción)
    $mail->isSMTP();                                               // Activar envio SMTP
    $mail->Host  = 'CONFIGURAR_SERVIDOR_SMTP';                     // Servidor SMTP
    $mail->SMTPAuth  = true;                                       // Identificacion SMTP
    $mail->Username  = 'CONFIGURAR_USUARIO_SMTP';                  // Usuario SMTP
    $mail->Password  = 'CONFIGURAR_CONTRASEÑA_SMTP';	          // Contraseña SMTP
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
    $mail->Port  = 587;
    $mail->setFrom('hola@prueba.com', 'Tu nombre');                // Remitente del correo

    // Destinatarios
    $mail->addAddress('prueba@midominio.com', 'Nombre del destinario');  // Email y nombre del destinatario

    // Contenido del correo
    $mail->isHTML(true);
    $mail->Subject = 'Asunto del correo';
    $mail->Body  = 'Contenido del correo <b>en HTML!</b>';
    $mail->AltBody = 'Contenido del correo en texto plano para los clientes de correo que no soporten HTML';
    $mail->send();
    echo 'El mensaje se ha enviado';
} catch (Exception $e) {
    echo "El mensaje no se ha enviado. Mailer Error: {$mail->ErrorInfo}";
}
```

2. Modificá los parámetros de conexión en este archivo, el email del remitente y del destinatario donde enviáremos nuestro correo de prueba.\
   Buscá las siguientes lineas en el script y reemplazá los datos por los tuyos.\
   **¡Es muy importante configurar estos datos usando una casilla valida a la que puedas acceder!**

```
// Configuracion SMTP
$mail->Host  = 'mail.tudominio.com';   // Acá debes configurar el servidor SMTP
$mail->Username  = 'casilla@tudominio.com';  // Esta será la casilla que enviará los mails
$mail->Password  = 'contraseña de casilla';  // Contraseña de tu casilla
$mail->setFrom('casilla@tudominio.com', 'Tu nombre'); // Configurá tu nombre y la casilla remitente
```

Debajo verás esta sección para completar con tus datos:

```
// Destinatarios    
$mail->addAddress('prueba@otrodominio.com', 'Nombre del destinario');  // Email y nombre del destinatario
```

Y la ultima sección a completar con tus datos:  &#x20;

```
// Contenido del correo 
$mail->isHTML(true);
$mail->Subject = 'Asunto del correo';  // El asunto que mostrará el mail enviado
$mail->Body  = 'Contenido del correo <b>en HTML!</b>';  
```

3. Subí por **FTP** o, utilizando el **Administrador de Archivos** de **cPanel**, el directorio **PHPMailer** y el archivo **ejemplo.php** a la raíz del directorio público de tu pagina web (public\_html).
4. Ejecutá el ejemplo desde `https://tudominio.com/ejemplo.php`.\
   Te mostrará el debug del proceso y,  luego recibirás el correo electrónico: \
   `"El mensaje se ha enviado"`\
   \
   Si muestra algún error, ya sea de PHP o de conexión SMTP, deberás depurar el origen del problema. El mensaje de error que recibirías en este caso es: \
   `"El mensaje no se ha enviado. Mailer Error:<tipo de error>`

En producción, recordá desactivar el debug de errores PHP y SMTP cambiando las primeras lineas del código de prueba:

```
ini_set('display_errors', 1);    // Cambiá el 1 por 0
ini_set('display_startup_errors', 1); // Cambiá el 1 por 0
error_reporting(E_ALL); // Cambiá el "E_ALL" por 0
```
