Php-mailer и html включают в себя переменные php
Привет, я пытаюсь отправить html-письма, используя php-почтовый класс. Проблема в том, что я хотел бы включить PHP-переменные в мой адрес электронной почты, а использование включает в себя, чтобы держать вещи организованными. Heres my php mailer....
$place = $data['place'];
$start_time = $data['start_time'];
$mail->IsHTML(true); // set email format to HTML
$mail->Subject = "You have an event today";
$mail->Body = file_get_contents('../emails/event.html');
$mail->Send(); // send message
Мой вопрос: возможно ли иметь php-переменные в event.html? Я пробовал это без везения (ниже event.html)..
<table width='600px' cellpadding='0' cellspacing='0'>
<tr><td bgcolor='#eeeeee'><img src='logo.png' /></td></tr>
<tr><td bgcolor='#ffffff' bordercolor='#eeeeee'>
<div style='border:1px solid #eeeeee;font-family:Segoe UI,Tahoma,Verdana,Arial,sans-serif;padding:20px 10px;'>
<p style=''>This email is to remind you that you have an upcoming meeting at $place on $start_time.</p>
<p>Thanks</p>
</div>
</td></tr>
</table>
Ответы
Ответ 1
Да, очень легко с include и короткой вспомогательной функцией:
function get_include_contents($filename, $variablesToMakeLocal) {
extract($variablesToMakeLocal);
if (is_file($filename)) {
ob_start();
include $filename;
return ob_get_clean();
}
return false;
}
$mail->IsHTML(true); // set email format to HTML
$mail->Subject = "You have an event today";
$mail->Body = get_include_contents('../emails/event.php', $data); // HTML -> PHP!
$mail->Send(); // send message
-
Функция get_include_contents
любезно предоставлена PHP include
документацией, слегка измененной для включения массива переменных.
-
Важно:. Поскольку ваш include обрабатывает внутри функции, область выполнения файла шаблона PHP (/emails/event.php
) находится в этой области действия (без переменных, доступных сразу, кроме супер-глобалы
-
Вот почему я добавил extract($variablesToMakeLocal)
— он извлекает все ключи массива из $variablesToMakeLocal
в качестве переменных в области функций, что, в свою очередь, означает, что они находятся в пределах объема включенного файла.
Поскольку у вас уже были place
и start_time
в массиве $data
, я просто передал это прямо в функцию. Возможно, вам захочется знать, что все ключи будут извлечены в $data
— вы можете или не захотите этого.
-
Обратите внимание, что теперь ваш файл шаблона обрабатывается как файл PHP, поэтому применяются все те же оговорки и правила синтаксиса. Вы не должны подвергать его редактированию внешним миром, и вы должны использовать <?php echo $place ?>
для вывода переменных, как в любом файле PHP.
Ответ 2
Пара способов сделать это:
Temken Template
<p> Some cool text %var1%,, %var2%,etc...</p>
Token Mailer
$mail->Body = strtr(file_get_contents('path/to/template.html'), array('%var1%' => 'Value 1', '%var2%' => 'Value 2'));
Шаблон буфера
<p> Some cool text $var1,, $var2,etc...</p>
Буферная почта
$var1 = 'Value 1';
$var2 = 'Value 2';
ob_start();
include('path/to/template.php');
$content = ob_get_clean();
$mail->Body = $content;
Ответ 3
Вы можете поместить переменные в html-адрес электронной почты, а затем сделать string_replace
, чтобы содержимое отображалось в письме вместо переменных:
try {
$mail = new PHPMailer(true);
$body = file_get_contents('phpmailer/subdir/contents.html');
$body = str_replace('$fullname', $fullname, $body);
$body = str_replace('$title', $title, $body);
$body = str_replace('$email', $email, $body);
$body = str_replace('$company', $company, $body);
$body = str_replace('$address', $address, $body);
// strip backslashes
$body = preg_replace('/\\\\/','', $body);
// mail settings below including these:
$mail->MsgHTML($body);
$mail->IsHTML(true); // send as HTML
$mail->CharSet="utf-8"; // use utf-8 character encoding
}
Это настройка, которая работала для меня. Возможно, это не СУХОЙ, но он работает.
Ответ 4
Используя метод todigitalson token, для меня это работало. PHP-код:
$e = "[email protected]";
$sc = "2sbd2152g#!fsf";
$body = file_get_contents("../email/recovery_email.html");
$body = eregi_replace("%e%" ,$sc, $body);
$body = eregi_replace("%sc%" ,$sc, $body);
$mail->MsgHTML($body);
HTML был просто:
<p>Click this link: www.mysite.com/recover.php?e=%e%&sc=%sc%<p>
eregi_replace
работал лучше, чем strtr
в моем случае - (последний не работал вообще).