您好我正在尝试使用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>
答案 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
- (后者根本不起作用)。