邮件 - 通过模板渲染邮件内容

  • 作者:KK

  • 发表日期:2016.9.7


发邮件时要调用email对象的setHtmlBody设置一些HTML代码来表达漂亮的邮件排版内容,可是一封真正能给用户看的邮件岂止这丁点HTML内容呢,绝对是一大坨的,肯定不方便写在调用邮件的PHP源代码里了

我们可以设置一个邮件的模板,编写下HTML代码让它来读取这个些作为邮件内容


先给mailer组件配置htmlLayout属性为一个layout模板(和视图的layout一样,中间放个echo $content

先在@app/views/mail目录下增加一个test.php文件作为邮件内容模板,里面写上你的测试HTML内容,接着创建邮件实例时就传入模板参数即可,这样:

$email = Yii::$app->mailer->compose('@app/views/mail/test'); //省略PHP文件后缀

完整示例:

$email = Yii::$app->mailer->compose('@app/views/mail/test');
$email->setTo('接收者的邮箱');
$email->setSubject('学习发邮件用的');
Yii::$app->mailer->send($email);

这个就不需要调用setHtmlBody了,因为上面compose构建邮件时就已经通过指定的模板渲染出HtmlBody了

其实那个compose方法传入模板名称的话,就像控制器的render方法一样把指定模板渲染后得到HTML字符串

但是你收到邮件后会发觉,好像除了你的测试内容以外还有别的HTML呀,比如一些页脚链接之类的

其实它根本就像控制器render一样,渲染完你指定的模板后,它又将你的模板内容套到一个layout里了,这个layout就在mailer组件配置的htmlLayout属性里面配置了

你可以看看配置文件所配置的值指向了哪个layout

而另外你会发现mailer组件还有个textLayout属性,这里暂时不解释这个,当你想发送纯文本邮件的时候再自行深入学习Yii官方的邮件教程吧(某些邮件阅读器会将HTML内容过滤掉,或者读取纯文本显示)


将变量传给模板

也是和render方法一样,第二个参数传入一个数组,key就是模板里的变量名,value就是变量的值,如下:

$email = Yii::$app->mailer->compose('@app/views/mail/test', [
	'var1' => '小明',
	'var2' => '玩具车',
]);

然后模板里大概就是

<div>
	<h2><?php echo $var1; ?> 同学你好!</h2>
	<p>恭喜你获得奖品 <?php echo $var2; ?> 一个!奖品已寄出,请注意查收哦!</p>
</div>

渲染模板时不使用layout

Yii::$app->mailer->htmlLayout = false;	//通过赋值为false表示不使用layout渲染
$email = Yii::$app->mailer->compose('@app/views/mail/test', [
	'var1' => '小明',
	'var2' => '玩具车',
]);