Send email with a template using php

87,665

Solution 1

Why not try something as simple as this :

$variables = array();

$variables['name'] = "Robert";
$variables['age'] = "30";

$template = file_get_contents("template.html");

foreach($variables as $key => $value)
{
    $template = str_replace('{{ '.$key.' }}', $value, $template);
}

echo $template;

Your template file being something like :

<html>

<p>My name is {{ name }} and I am {{ age }} !</p>

</html>

Solution 2

Lets have a small crack at this :)

class Emailer
{
    var $recipients = array();
    var $EmailTemplate;
    var $EmailContents;

    public function __construct($to = false)
    {
        if($to !== false)
        {
            if(is_array($to))
            {
                foreach($to as $_to){ $this->recipients[$_to] = $_to; }
            }else
            {
                $this->recipients[$to] = $to; //1 Recip
            }
        }
    }

    function SetTemplate(EmailTemplate $EmailTemplate)
    {
        $this->EmailTemplate = $EmailTemplate;            
    }

    function send() 
    {
        $this->EmailTemplate->compile();
        //your email send code.
    }
}

Notice the function SetTemplate() ...

Heres a a small template class

class EmailTemplate
{
    var $variables = array();
    var $path_to_file= array();
    function __construct($path_to_file)
    {
         if(!file_exists($path_to_file))
         {
             trigger_error('Template File not found!',E_USER_ERROR);
             return;
         }
         $this->path_to_file = $path_to_file;
    }

    public function __set($key,$val)
    {
        $this->variables[$key] = $val;
    }


    public function compile()
    {
        ob_start();

        extract($this->variables);
        include $this->path_to_file;


        $content = ob_get_contents();
        ob_end_clean();

        return $content;
    }
}

Here's a small example, you still need to do the core of the script but this will provide you with a nice layout to get started with.

$emails = array(
    '[email protected]',
    '[email protected]'
);

$Emailer = new Emailer($emails);
 //More code here

$Template = new EmailTemplate('path/to/my/email/template');
    $Template->Firstname = 'Robert';
    $Template->Lastname = 'Pitt';
    $Template->LoginUrl= 'http://stackoverflow.com/questions/3706855/send-email-with-a-template-using-php';
    //...

$Emailer->SetTemplate($Template); //Email runs the compile
$Emailer->send();

Thats really all there is to it, just have to know how to use objects and its pretty simple from there, ooh and the template would look a little something like this:

Welcome to my site,

Dear <?php echo $Firstname ?>, You have been registered on our site.

Please visit <a href="<?php echo $LoginUrl ?>">This Link</a> to view your upvotes

Regards.

Solution 3

My simple example

template.php

<?php
class Template
{
  function get_contents($templateName, $variables) {
    $template = file_get_contents($templateName);

    foreach($variables as $key => $value)
    {
        $template = str_replace('{{ '.$key.' }}', $value, $template);
    }
    return $template;
  }
}
?>

contact-us.tpl

Name: {{ name }}
Email:  {{ email }}
subject:  {{ subject }}
------messages------
{{ messages }}
---------------------

main.php

<?php
include_once 'template.php';

$name = "Your name";
$to = "[email protected]";  
$subject = "Test mail";  
$message = "Hello! This is a simple email message.";  
$from = "[email protected]";  
$headers = "From: $from"; 

$text = Template::get_contents("contact-us.tpl", array('name' => $name, 'email' => $from, 'subject' => $subject, 'messages' => $message));
echo '<pre>';
echo $text;
echo '<pre>';

$mail = @mail($to, $subject, $text, $headers); 
if($mail) {
  echo "<p>Mail Sent.</p>"; 
}
else {
  echo "<p>Mail Fault.</p>"; 
}
?>

Solution 4

        $message_to_client = file_get_contents("client_email.html");
        //$message_to_client = "bla bla {{ EMAIL }} bla bla";


        $variables = array(
            'SITE_TITLE' => $SITE_TITLE,
            'SITE_LOGO' => $SITE_LOGO,
            'SITE_URL' => $SITE_URL,
            'CLIENT_NAME' => strip_tags($data->clientname),
            'PHONE' => strip_tags($data->phone),
            'EMAIL' => strip_tags($data->email),
            'CITY' => strip_tags($data->city),
            'REGION' => strip_tags($data->region),
            'COMMENT' => htmlentities($data->comment)                
        );

        $message_to_client = preg_replace_callback('/{{([a-zA-Z0-9\_\-]*?)}}/i',
             function($match) use ($variables) { 
                 return  $variables[$match[1]]; 
        }, $message_to_client );

Solution 5

Create your template file, e.g,

/path/to/templates/template.twig:

Dear {{name}},

Thank you for writing to us about {{subject}}.

Then follow the instructions at https://twig.symfony.com/doc/2.x/api.html to install and use the twig templating engine with Composer

require_once '/path/to/vendor/autoload.php';

$loader = new Twig_Loader_Filesystem('/path/to/templates');
$twig = new Twig_Environment($loader, array());

Then render and send your email:

$to = "[email protected]";  
$subject = "Test mail";  
$message = $twig->render('template.twig', array(
   'name' => 'Fred',
   'subject' => 'philately',
));
$from = "[email protected]";  
$headers = "From: $from";  
mail($to,$subject,$message,$headers);  
Share:
87,665

Related videos on Youtube

anonymous123
Author by

anonymous123

Updated on March 05, 2022

Comments

  • anonymous123
    anonymous123 about 2 years

    How can I send an email using php then add a template design in the email? I'm using this:

    $to = "[email protected]";  
    $subject = "Test mail";  
    $message = "Hello! This is a simple email message.";  
    $from = "[email protected]";  
    $headers = "From: $from";  
    mail($to,$subject,$message,$headers);  
    echo "Mail Sent.";  
    

    And it works fine! The problem is just how to add a template.

  • Bart Jacobs
    Bart Jacobs over 12 years
    Nice job. Doesn't the extract statement in the compile method need to precede the include statement?
  • RobertPitt
    RobertPitt over 12 years
    No it needs to be called prior to loaded, this allows the template variables to be defined and in scope for the template content.
  • AKFourSeven
    AKFourSeven about 11 years
    Hi Robert, great snippet but I am not sure I follow how the mail is sent. You could easily compile the template into SetTemplate, but then there is no send function and the class Emailer does not extend any Mailer class (with a send or mail() function)... am I missing something here?
  • CMH
    CMH over 10 years
    This is just what I was looking for!
  • DS.
    DS. over 10 years
    I like your solution better. Very simple.
  • kta
    kta about 7 years
    Brilliant!Brilliant!Brilliant!Brilliant!Brilliant!Brilliant!‌​Brilliant!Brilliant!‌​Brilliant!Brilliant!‌​Brilliant!Brilliant!‌​Brilliant!Brilliant!‌​Brilliant!Brilliant!‌​Brilliant!Brilliant!‌​Brilliant!Brilliant!‌​Brilliant!Brilliant!‌​....
  • demonking
    demonking over 5 years
    @RobertPitt There is a missing semicolon ;) $this->variables[$key] = $val
  • MestreLion
    MestreLion over 5 years
    By the way, that is the basis of Mustache. Once installed, using it is as easy as $m = new Mustache_Engine; echo $m->render("template.html", $variables);
  • Porcellino80
    Porcellino80 over 3 years
    what if it is an array?