Send email with a template using php
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);
Related videos on Youtube
anonymous123
Updated on March 05, 2022Comments
-
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 over 12 yearsNice job. Doesn't the extract statement in the compile method need to precede the include statement?
-
RobertPitt over 12 yearsNo it needs to be called prior to loaded, this allows the template variables to be defined and in scope for the template content.
-
AKFourSeven about 11 yearsHi 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 over 10 yearsThis is just what I was looking for!
-
DS. over 10 yearsI like your solution better. Very simple.
-
kta about 7 yearsBrilliant!Brilliant!Brilliant!Brilliant!Brilliant!Brilliant!Brilliant!Brilliant!Brilliant!Brilliant!Brilliant!Brilliant!Brilliant!Brilliant!Brilliant!Brilliant!Brilliant!Brilliant!Brilliant!Brilliant!Brilliant!Brilliant!....
-
demonking over 5 years@RobertPitt There is a missing semicolon ;) $this->variables[$key] = $val
-
MestreLion over 5 yearsBy 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 over 3 yearswhat if it is an array?