邮件 - 通过模板渲染邮件内容 ¶
作者: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' => '玩具车',
]);