【问题标题】:php mailer and html includes with php variablesphp mailer 和 html 包含 php 变量
【发布时间】:2011-10-05 00:35:57
【问题描述】:

您好,我正在尝试使用 php mailer 类发送 html 电子邮件。问题是我想在我的电子邮件中包含 php 变量,同时使用包含来保持事情井井有条。这是我的 php 邮件程序....

 $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

我的问题是,是否可以在 event.html 中有 php 变量?我试过这个没有运气(下面是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>

【问题讨论】:

  • 如果你把它设为“event.php”,然后为变量正确分隔回声,它会起作用吗?
  • @Aaron 那仍然会简单地获取文件的内容。 include/require 是执行 PHP 文件的唯一方法。
  • 是的,我想我正在考虑使用 cURL 抓取页面,它应该在目标中执行 php。
  • @Aaron 是的,如果您将它作为远程 URL 进行访问,但它是在它自己的请求中,然后它也是公共的,这意味着您无法访问您已经设置的相同变量并且您必须处理任何可能的注入攻击。

标签: php mailer


【解决方案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 documentation 提供,稍作修改以包含变量数组。

  • 重要提示:由于您的 include 是在函数内处理的,因此 PHP 模板文件 (/emails/event.php) 的执行范围在该函数的范围内(除了 @ 之外没有立即可用的变量987654323@

  • 这就是我添加extract($variablesToMakeLocal) 的原因——它从$variablesToMakeLocal 中提取所有数组键作为函数范围内的变量,这反过来意味着它们在所包含文件的范围内。

    由于$data 数组中已经有placestart_time,我只是将其直接传递给函数。您可能想知道,这将提取 $data 中的所有键——您可能想要也可能不想要。

  • 请注意,现在您的模板文件正在作为 PHP 文件处理,因此所有相同的注意事项和语法规则都适用。你应该将它暴露给外界编辑,你必须使用&lt;?php echo $place ?&gt;来输出变量,就像在任何PHP文件中一样。

【讨论】:

  • 我知道这可能是一个愚蠢的问题,但我还是要问:假设$_SESSION(或$_POST)数组不需要传递给$variablesToMakeLocal?
  • @WhiteRau - 正确,无论如何都可以访问它们(它们是superglobals),但我可能会选择传入它以便我可以事先清理数据,因此功能可能更多可移植的(即与其他来源的数据一起使用,而不是模板或函数,总是使用$_SESSION
  • 我不确定如何让它工作。我设置了 $varsToMakeLocal = array('$toMail' => $toEmail, '$toName' => $toName);我尝试使用您的 $mail->Body = $this->get_include_contents($htmlfile, $varsToMakeLocal);但邮件完好无损,变量没有被替换。
【解决方案2】:

几种方法:

令牌模板

<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;

【讨论】:

    【解决方案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】:

    使用 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_replacestrtr 效果更好 - (后者根本不起作用)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-18
      • 1970-01-01
      • 2014-09-24
      • 2012-11-03
      • 1970-01-01
      • 2011-01-10
      • 2011-05-23
      • 1970-01-01
      相关资源
      最近更新 更多