php mailer和html包含php变量

时间:2011-07-14 04:02:46

标签: php mailer

您好我正在尝试使用php邮件程序类发送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>

4 个答案:

答案 0 :(得分:21)

是的,很容易使用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)的执行范围在该函数的范围内(没有变量可立即使用)除了super globals

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

    由于place数组中已经有start_time$data,我只是直接将其传递给函数。您可能需要注意,这将提取$data中的所有密钥 - 您可能会也可能不希望这样。

  • 请注意,现在您的模板文件正在作为PHP文件处理,因此所有相同的警告和语法规则都适用。您应公开它以供外界编辑,您必须使用<?php echo $place ?>输出变量,就像在任何PHP文件中一样。

答案 1 :(得分:11)

有几种方法可以做到:

令牌模板

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

Buffer Mailer

$var1 = 'Value 1';
$var2 = 'Value 2';
ob_start();
include('path/to/template.php');
$content = ob_get_clean();
$mail->Body = $content;

答案 2 :(得分: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
}

这是适合我的设置。它也许并不干,但它确实有效。

答案 3 :(得分:1)

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