php mailer и html включает переменные php

Здравствуйте, я пытаюсь отправлять электронные письма в формате html, используя класс php mailer. Проблема в том, что я хотел бы включить переменные php в свою электронную почту, используя include, чтобы все было организовано. Вот мой 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>

person tytyguy    schedule 14.07.2011    source источник
comment
Работает ли это, если вы сделаете его event.php, а затем правильно разграничите эхо для переменных?   -  person Aaron Ray    schedule 14.07.2011
comment
@Aaron Аарон Это все равно просто получит содержимое файла. include/require — единственный способ выполнить файл PHP.   -  person Nicole    schedule 14.07.2011
comment
Да, я думаю, я думаю о том, чтобы захватить страницу с cURL, которая должна выполнить php внутри цели.   -  person Aaron Ray    schedule 14.07.2011
comment
@Aaron Правда, если вы нажмете на него как на удаленный URL-адрес, но затем он будет в своем собственном запросе, а затем также станет общедоступным, что означает, что у вас нет доступа к тем же переменным, которые вы уже настроили, и вам придется иметь дело с любыми возможными атаками путем внедрения .   -  person Nicole    schedule 14.07.2011


Ответы (4)


Да, очень просто с помощью 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, слегка измененной для включения массива переменных.

  • Важно: поскольку ваше включение обрабатывается внутри функции, область выполнения файла шаблона PHP (/emails/event.php) находится в области действия этой функции (никаких переменных, доступных непосредственно, кроме суперглобальные переменные

  • Вот почему я добавил extract($variablesToMakeLocal), он извлекает все ключи массива из $variablesToMakeLocal как переменные в области действия функции, что, в свою очередь, означает, что они находятся в пределах области действия включаемого файла.

    Поскольку у вас уже были place и start_time в массиве $data, я просто передал их прямо в функцию. Возможно, вы захотите знать, что это извлечет все ключи в пределах $data, которые вам могут понадобиться или не понадобиться.

  • Обратите внимание, что теперь ваш файл шаблона обрабатывается как файл PHP, поэтому применяются все те же предостережения и правила синтаксиса. Вы не должны не открывать его для редактирования внешним миром, и вы должны использовать <?php echo $place ?> для вывода переменных, как и в любом файле PHP.

person Nicole    schedule 14.07.2011
comment
я вхожу в это, зная, что это может быть глупый вопрос, но я все равно спрошу: правильно ли предположить, что массив $_SESSION (или $_POST) НЕ нужно передавать в $variablesToMakeLocal? - person WhiteRau; 31.01.2012
comment
@WhiteRau - правильно, к ним можно получить доступ в любом случае (они суперглобальные значения ), хотя я, вероятно, предпочел бы передать его, чтобы я мог заранее очистить данные и сделать функцию более переносимой (т. е. использовать с данными из других источников вместо шаблона или функции, всегда использующей $_SESSION. - person Nicole; 31.01.2012
comment
Я не уверен, как заставить это работать. Я установил $varsToMakeLocal = array('$toMail' => $toEmail, '$toName' => $toName); и я пытаюсь использовать ваш $mail-›Body = $this-›get_include_contents($htmlfile, $varsToMakeLocal); но почта цела и переменные не заменяются. - person Jorrick Sleijster; 10.11.2016

Пара способов сделать это:

Шаблон токена

<p> Some cool text %var1%,, %var2%,etc...</p>

Рассылка токенов

$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;
person prodigitalson    schedule 14.07.2011

Вы можете поместить переменные в электронное письмо в формате 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
}

Это установка, которая работала для меня. Возможно, это не СУХОЕ, но оно работает.

person silverliebt    schedule 09.10.2013
comment
Это оказалось единственным решением, которое сработало для меня. Спасибо. - person awl19; 19.11.2015

Используя метод токена prodigitalson, у меня сработало следующее. Код 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 (последний вообще не работал).

person Nick    schedule 19.04.2013