Crear una plantilla de email dinámica en PHP

El hecho de enviar correos electrónicos es una de las características más utilizadas de las aplicaciones web. En muchos casos, el email debe enviarse mediante un script, como por ejemplo, el típico email de bienvenida tras un registro en un sitio web, el de olvidé mi contraseña, el del formulario de contacto o la confirmación de compra de un pedido online. Por regla general, se suele utilizar la función mail() de PHP para enviar correos desde un script, pero si quieres asegurarte de que se envíe correctamente, lo suyo es enviarlo mediante el servidor SMTP del alojamiento. Cuando enviamos un correo desde nuestra web, utilizamos una plantilla para que sea mucho más atractivo.

La plantillas de correo dinámicas hacen que sea sencillo gestionar diferentes tipos de mails. Este tipo de plantillas son muy útiles cuando quieres enviar un correo a varios destinatarios pero con distinto contenido. En este tutorial te mostraremos cómo gestionar plantillas de email y crear nuevas para enviar múltiples correos desde un script de PHP.

Creación de la base de datos

Para almacenar la información de las plantillas, necesitaremos crear una tabla MySQL. El siguiente SQL crea la tabla email_templates en la base de datos.

CREATE TABLE `email_templates` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `type` enum('contact_us','registration') COLLATE utf8_unicode_ci NOT NULL,
 `title` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
 `content` text COLLATE utf8_unicode_ci NOT NULL,
 `created` datetime NOT NULL,
 `modified` datetime NOT NULL,
 `status` enum('1','0') COLLATE utf8_unicode_ci NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Configuración de la base de datos (dbConfig.php)

Utilizaremos el archivo dbConfig.php para conectarnos a la BD.

<?php
//DB details
$dbHost = 'localhost';
$dbUsername = 'root';
$dbPassword = '*****';
$dbName = 'noprog';

//Create connection and select DB
$db = new mysqli($dbHost, $dbUsername, $dbPassword, $dbName);

if ($db->connect_error) {
    die("Unable to connect database: " . $db->connect_error);
}

Crear plantilla de email (add-template.php)

Antes de utilizar la plantilla dinámica, debes crear el contenido de la misma. Inicialmente, en este archivo, mostraremos el formulario para recabar información. Tendremos unos cuantos campos básicos:

  • Type: Tipo de plantilla (contacto, registro)
  • Title: Título de la plantilla
  • Content: Contenido del email. Utilizaremos el editor TinyMCE para insertar el HTML.
  • Otras variables: Variables estáticas que se pueden utilizar en el contenido de la plantilla. Serán reemplazadas por el valor dinámico en el momento de enviar el correo electrónico.

Una vez se envía el formulario, se enviarán los datos de la plantilla al archivo templateSubmit.php para su posterior procesamiento.

<?php
//start session
session_start();

if(!empty($_SESSION['status'])){
    //get status from session
    $status = $_SESSION['status'];
    $msg = $_SESSION['msg'];
    
    //remove status from session
    unset($_SESSION['status']);
    unset($_SESSION['msg']);
}
?>

<!DOCTYPE html>
<html>
<head>
    
    <!-- Add TinyMCE editor to textarea -->
    <script src="https://cloud.tinymce.com/stable/tinymce.min.js"></script>
    <script>tinymce.init({ selector:'textarea' });</script>
</head>
<body>
    <?php
    if(!empty($status) && $status == 'succ'){
        echo '<p style="color: green;">'.$msg.'</p>';
    }elseif(!empty($status) && $status == 'err'){
        echo '<p style="color: red;">'.$msg.'</p>';
    }
    ?>
    <form method="post" action="templateSubmit.php">
        <p>
            Type:
            <select name="type">
                <option value="contact_us">Contact Us</option>
                <option value="registration">Registration</option>
            </select>
        </p>
        <p>
            Title: <input type="text" name="title" />
        </p>
        <p>
            Content: <textarea name="content"></textarea>
        </p>
        <p>Available Variables: [SITE_URL] [SITE_NAME] [USER_NAME] [USER_EMAIL]</p>
        <p>
            <input type="submit" name="submit" value="Add Template">
        </p>
    </form>
</body>
</html>

Inserción del contenido del email (templateSubmit.php)

En este archivo, los datos de la plantilla se insertan en la base de datos utilizando PHP y MySQL. Después de la inserción, almacenamos el estado en la SESSION y lo redirigimos hacia la página de creación de plantillas.

<?php
//start session
session_start();

if(isset($_POST['submit'])){
    if(!empty($_POST['type']) && !empty($_POST['title']) && !empty($_POST['content'])){
        //Include database configuration file
        require_once 'dbConfig.php';
        
        //Insert email template data
        $type 	 = $db->real_escape_string($_POST['type']);
        $title   = $db->real_escape_string($_POST['title']);
        $content = $db->real_escape_string($_POST['content']);
        $dataTime= date("Y-m-d H:i:s");
        
        $insert = $db->query("INSERT into email_templates (type, title, content, created, modified, status) VALUES ('$type', '$title', '$content', '$dataTime', '$dataTime', '1')");
        if($insert){
            $_SESSION['status'] = 'succ';
            $_SESSION['msg'] = 'Email template has been created successfully.';
        }else{
            $_SESSION['status'] = 'err';
            $_SESSION['msg'] = 'Some problem occurred, please try again.';
        }
    }else{
        $_SESSION['status'] = 'err';
        $_SESSION['msg'] = 'All fields are mandatory, please fill all the fields.';
    }
}
header("Location: add-template.php");
?>

Plantilla dinámica (sendEmail.php)

Ahora enviaremos el correo electrónico con la plantilla dinámica que hemos almacenado en la base de datos. Después enviaremos el correo HTML con la plantilla dinámica utilizando PHP y MySQL.

  • La info del usuario los obtendremos del $ _POST (formulario de contacto) o de la base de datos (registro, activación, contraseña olvidada, etc.).
  • El contenido de la plantilla la obtendremos de la base de datos (email_templates) basados en el tipo de email.
  • Las variables de plantilla se reemplazan por los valores dinámicos.
<?php
//Include database configuration file
require_once 'dbConfig.php';

/*
 * Contact email with template
 */

//get user details
$userName  = 'John Doe';
$userEmail = [email protected]';

//get email template data from database
$query = $db->query("SELECT * FROM email_templates WHERE type = 'contact_us'");
$tempData = $query->fetch_assoc();

//replace template var with value
$token = array(
    'SITE_URL'  => 'http://www.programacion.net',
    'SITE_NAME' => 'Programacionnet',
    'USER_NAME' => $userName,
    'USER_EMAIL'=> $userEmail
);
$pattern = '[%s]';
foreach($token as $key=>$val){
    $varMap[sprintf($pattern,$key)] = $val;
}

$emailContent = strtr($tempData['content'],$varMap);

//send email to user
$to = $userEmail;
$subject = "Contact us email with template";

// Set content-type header for sending HTML email
$headers = "MIME-Version: 1.0" . "rn";
$headers .= "Content-type:text/html;charset=UTF-8" . "rn";

// Additional headers
$headers .= 'From: Programacion.net<[email protected]>' . "rn";

// Send email
if(mail($to,$subject,$emailContent,$headers)):
    $successMsg = 'Email has sent successfully.';
else:
    $errorMsg = 'Email sending fail.';
endif;

Fuente: codexworld.com

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP