Привет, я пытаюсь отправить 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>
Да, очень легко с включением и короткой вспомогательной функцией:
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 обрабатывает внутри функции, область выполнения файла шаблона PHP ( /emails/event.php
) находится в области этой функции (без каких-либо переменных, доступных сразу, кроме супер-глобалов
Вот почему я добавил extract($variablesToMakeLocal)
– он извлекает все ключи массива из $variablesToMakeLocal
как переменные в области функции, что, в свою очередь, означает, что они находятся в пределах объема включенного файла.
Поскольку у вас уже было place
и start_time
в массиве $data
, я просто передал это прямо в функцию. Возможно, вам захочется знать, что это приведет к извлечению всех ключей в $data
– вы можете или не захотите этого.
Обратите внимание, что теперь ваш файл шаблона обрабатывается как файл PHP, поэтому применяются все те же оговорки и правила синтаксиса. Вы не должны подвергать его редактированию внешним миром, и вы должны использовать <?php echo $place ?>
Для вывода переменных, как в любом файле PHP.
Пара способов сделать это:
Шаблон маркера
<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;
в$var1 = 'Value 1'; $var2 = 'Value 2'; ob_start(); include('path/to/template.php'); $content = ob_get_clean(); $mail->Body = $content;
Вы можете поместить переменные в 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 }
Это настройка, которая сработала для меня. Возможно, это не СУХОЙ, но он работает.
Используя метод маркеров prodigitalson, для меня работало следующее. PHP-код:
$e = "gsmith@gmail.com"; $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
в моем случае – (последний не работал вообще).