Yii2发邮件

8 篇文章 0 订阅

Yii2 权威指南 中对发送邮件有详细的说明, 主要是配置文件中 transport部分没有说明,这里记录一下.
一. 配置
在配置文件web.php components中配置,

'mailer' => [
	'class' => 'yii\swiftmailer\Mailer',
	'viewPath' => 'mail', //邮件模板文件存放位置,默认在项目下的mail文件夹下
	'useFiletransport' => false, //false:发送邮件,true:只生成邮件在runtime文件夹下
	'transport' => [
		'class' => 'Swift_SmtpTransport', //
		'host' => 'smtp.163.com', // 163邮箱的SMTP服务器
		'username' => '你的163邮箱', 
		'password' => '你的163smtp授权码',
		'port' => '465', // SSL协议端口号
		'encryption' => 'ssl' //加密协议
	],
	'messageConfig' => [
		'charset' => 'UTF-8',
		'from' => ['xxx@163.com'=>'admin'], //设置发件人名为admin
	],
]

二. 基本用法
配置了mailer组件后,可以使用如下代码发送邮件:

Yii::$app->mailer->composer()
->setFrom('xxx@163.com') // 如果在上面的配置中messageConfig选项设置了,这里就不需要
->setTo('xx@xx.com')
->setSubject('邮件主题') 
->setTextBody('邮件文本内容')
->setHtmlBody('包含html标签的内容')
->send();

可以使用更复杂的逻辑发送邮件:

$message = Yii::$app->mailer->compose();
if(Yii::$app->user->isGust){
	$message->setFrom('from@emai.com');
}else{
	$message->setFrom(Yii::$app->user->identity->email);
}
$message->setTo()
->setSubject()
->setTextBody()
->setHtmlBody()
->send();

三. 一次发送多个邮件

$messages = [];
foreach($users as $user){
	$messages[] = Yii::$app->mailer->compose()
	//...
	->setTo($user->email);
}
Yii::$app->mailer->sendMultiple($messages);

四. 撰写邮件内容
Yii 允许通过特殊的视图文件来撰写实际的邮件内容。默认情况下, 这些文件应该位于 “@app/mail” 路径。可以在配置文件中修改viewPath修改.
邮件视图文件和普通视图文件一样可以设置公共布局文件,默认布局文件存放在@app/mail/layouts文件夹下, 默认布局文件名为html.php.
一个布局文件内容如下:

<?php
use yii\helpers\Html;

/* @var $this \yii\web\View view component instance */
/* @var $message \yii\mail\MessageInterface the message being composed */
/* @var $content string main view render result */
?>
<?php $this->beginPage() ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=<?= Yii::$app->charset ?>" />
    <title><?= Html::encode($this->title) ?></title>
    <?php $this->head() ?>
</head>
<body>
    <?php $this->beginBody() ?>
    <?= $content ?>
    <?php $this->endBody() ?>
</body>
</html>
<?php $this->endPage() ?>

现在可以在@app/mail文件夹下创建我们要发送的邮件视图文件, 一个简单的邮件视图文件:seekpassword.php

<?php
use yii\helpers\Url;
use yii\helpers\Html;
?>
<h2>管理员密码修改</h2>
<p>尊敬的<?= Html::encode($adminuser); ?>您好:</p>
<p>请点击以下链接修改管理员密码</p>
<?php $url = Yii::$app->urlManager->createAbsoluteUrl(['/admin/manager/seekpass','adminuser'=>$adminuser,'timestamp'=>$timestamp,'token'=>$token]) ?>
<a href="<?php echo $url; ?>">修改管理员密码</a>
<p>此邮件为系统邮件,请勿回复</p>

现在可以将邮件视图文件传递到compose()方法中:

Yii::$app->mailer->compose('seekpassword') // 渲染一个视图作为邮件内容
    ->setFrom('from@domain.com')
    ->setTo('to@domain.com')
    ->setSubject('Message subject')
    ->send();

可以在compose()方法中传递视图所需要的参数:

 $mailer = Yii::$app->mailer->compose('seekpassword',[
     'adminuser' => $this->adminuser,
     'timestamp' => $time,
     'token' => $token
 ]);
 $mailer->setTo($this->adminemail);
 $mailer->setSubject('管理员密码修改');
 if($mailer->send()){
     return true;
 }

五. 发送文件附件
可以使用attach()和attachContent()方法来添加附件信息:

$message = Yii::$app->mailer->compose();

// 附件来自本地文件
$message->attach('/path/to/source/file.pdf');

// 动态创建一个文件附件
$message->attachContent('Attachment content', ['fileName' => 'attach.txt', 'contentType' => 'text/plain']);

六. 嵌入图片
可以在邮件视图文件中使用embed()方法将图片插入到邮件内容中,embed()方法会返回图片ID:

Yii::$app->mailer->compose('embed-email',['imageFileName' => '/path/to/image.jpg'])
/...
->send();

然后在视图文件embed-email.php中, 可以使用如下代码:

<img src="<?= $message->embed($imageFileName);?>" >

七. 测试邮件发送
修改配置文件中的 useFileTransport为true, 这样将不会直接发送邮件, 而是以文件的形式保存在@runtime/mail文件夹下, 这个路径可以通过fileTransportPath修改.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值