yii发邮件可以调用yii自带的邮件类,只需要自己有一个邮箱然后做一些相关的配置然后调用即可。
我这里以163网易邮箱为例。
设置邮箱
进入邮箱主页面 设置->POP3/SMTP/IMAP
进入POP3/SMTP/IMAP 把邮箱服务器打开然后点 确定
进入 客户端授权密码
输入手机验证码后点确定,跳转到输入授权密码这个授权密码就好像你的支付密码一样很重要一定要记住。
配置web.php
然后配置web.php 文件位置就在 yii根目录下的config文件夹下 ./config/web.php
加上下图红框内的配置
下面是完整配置
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
// send all mails to a file by default. You have to set
// 'useFileTransport' to false and configure a transport
// for the mailer to send real emails.
'useFileTransport' => false,
'transport' => [
'class' => 'Swift_SmtpTransport', //这里不用管
'host' => 'smtp.163.com', //邮箱服务器地址
'username' => '18648000000@163.com', //用户名
'password' => '123456789000', //授权码
'port' => '465', //端口465就可以
'encryption' => 'ssl', //因为选择的是465所以这里填ssl因为这个会更安全 ,如果端口是25那这里要填 tls
],
]
控制器
发送
$model−>seekPass($post)$model−>seekPass($post); 调用模型seekPass()方法,所有的发送操作都在这个方法里
//发送邮件
public function actionSeekpassword()
{
$this->layout = false;
$model = new Admin;
//判断是否POST提交
if (Yii::$app->request->isPost){
//接收post数据
$post = Yii::$app->request->post();
//调用model,
if ($model->seekPass($post)) {
Yii::$app->session->setFlash('info', '电子邮件已经发送成功,请查收');
}
}
return $this->render("seekpassword", ['model' => $model]);
}
控制器完整代码
<?php
namespace app\modules\controllers;
use yii\web\Controller;
use app\modules\models\Admin;
use Yii; //引入Yii类
class PublicController extends Controller
{
//发送邮件
public function actionSeekpassword()
{
$this->layout = false;
$model = new Admin;
//判断是否POST提交
if (Yii::$app->request->isPost){
//接收post数据
$post = Yii::$app->request->post();
//调用model,
if ($model->seekPass($post)) {
Yii::$app->session->setFlash('info', '电子邮件已经发送成功,请查收');
}
}
return $this->render("seekpassword", ['model' => $model]);
}
//邮箱找回密码
public function actionMailchangepass()
{
$this->layout = false;
//接收时间戳
$time = Yii::$app->request->get("timestamp");
//接收用户名
$adminuser = Yii::$app->request->get("adminuser");
//接收token
$token = Yii::$app->request->get("token");
$model = new Admin;
//用同样的方法 把接收到的用户名和时间生成Token。
$myToken = $model->createToken($adminuser, $time);
//验证token
if ($token != $myToken){
//验证没通过,直接调到登录界面
$this->redirect(['public/login']);
Yii::$app->end();
}
//计算是否超时
if (time() - $time > 3000){
//超时直接跳到登录界面
$this->redirect(['public/login']);
Yii::$app->end();
}
//如果是post数据
if (Yii::$app->request->isPost){
$post = Yii::$app->request->post();
if ($model->changePass($post)) {
Yii::$app->session->setFlash('info', '密码修改成功');
}
}
$model->adminuser = $adminuser;
return $this->render("mailchangepass", ['model' => $model]);
}
}
模型类
邮箱模板:
Yii::$app->mailer->compose(模板名, [模板参数]);
例:
Yii::$app->mailer->compose('seekpass', ['adminuser' => $data['Admin']['adminuser'], 'time' => $time, 'token' => $token])
发送邮箱:
$mailer->setFrom(发件人的邮箱地址);
例:
$mailer->setFrom("18648000000@163.com"); //发件人
接收的邮箱地址:
$mailer->setTo(收件人邮箱地址);
例:
$mailer->setTo("14315*****@qq.com"); //收件人
发送
seekPass()seekPass()方法
//发送邮件找回密码
public function seekPass($data)
{ //场景属性
$this->scenario = "seekpass";
//验证
if ($this->load($data) && $this->validate()) {
//时间
$time = time();
//签名函数
$token = $this->createToken($data['Admin']['adminuser'], $time);
//邮件内容
//seekpass 邮箱模板 ,模板的位置是 mail/seekpass.php
$mailer = Yii::$app->mailer->compose('seekpass', ['adminuser' => $data['Admin']['adminuser'], 'time' => $time, 'token' => $token]);
$mailer->setFrom("18648000000@163.com"); //发件人
$mailer->setTo($data['Admin']['adminemail']); //收件人
$mailer->setSubject("商城-找回密码"); //邮件标题
if ($mailer->send()){
return true;
}
}
return false;
}
模型完整代码
<?php
namespace app\modules\models;
use yii\db\ActiveRecord;
use Yii;
class Admin extends ActiveRecord
{
public $rememberMe = true;
public $repass;
public static function tableName()
{
return "{{%admin}}";
}
public function attributeLabels()
{
return [
'adminuser' => '管理员账号',
'adminemail' => '管理员邮箱',
'adminpass' => '管理员密码',
'repass' => '确认密码',
];
}
//验证信息
public function rules()
{
return [
//验证 adminuser
// 'on' =>['seekpass',....] 指定场景,表示在on数组内的场景都会用到这条验证。
['adminuser', 'required', 'message' => '管理员账号不能为空', 'on' => ['seekpass', 'changepass']],
['adminpass', 'required', 'message' => '管理员密码不能为空', 'on' => ['changepass']],
['adminemail', 'required', 'message' => '电子邮箱不能为空', 'on' => ['seekpass']],
['adminemail', 'email', 'message' => '电子邮箱格式不正确', 'on' => ['seekpass']],
['adminemail', 'validateEmail', 'on' => 'seekpass'],
['repass', 'required', 'message' => '确认密码不能为空', 'on' => ['changepass']],
['repass', 'compare', 'compareAttribute' => 'adminpass', 'message' => '两次密码输入不一致', 'on' => ['changepass']],
];
}
//邮箱验证
public function validateEmail()
{ //如果验证没有错误
if (!$this->hasErrors()) {
$data = self::find()->where('adminuser = :user and adminemail = :email', [':user' => $this->adminuser, ':email' => $this->adminemail])->one();
if (is_null($data)) {
//定义错误信息
$this->addError("adminemail", "管理员电子邮箱不匹配");
}
}
}
//发送邮件找回密码
public function seekPass($data)
{ //场景属性
$this->scenario = "seekpass";
//验证
if ($this->load($data) && $this->validate()) {
//做点有意义的事
//时间
$time = time();
//签名函数
$token = $this->createToken($data['Admin']['adminuser'], $time);
//邮件内容
//seekpass 邮箱模板 ,模板的位置是 mail/seekpass.php
$mailer = Yii::$app->mailer->compose('seekpass', ['adminuser' => $data['Admin']['adminuser'], 'time' => $time, 'token' => $token]);
$mailer->setFrom("18648000000@163.com"); //发件人
$mailer->setTo($data['Admin']['adminemail']); //收件人
$mailer->setSubject("慕课商城-找回密码"); //邮件标题
if ($mailer->send()){
return true;
}
}
return false;
}
// 签名
public function createToken($adminuser, $time)
{
return md5(md5($adminuser).base64_encode(Yii::$app->request->userIP).md5($time));
}
//修改密码
public function changePass($data)
{ //场景属性
$this->scenario = "changepass";
if ($this->load($data) && $this->validate()){
return (bool)$this->updateAll(['adminpass' => md5($this->adminpass)], 'adminuser = :user', [':user' => $this->adminuser]);
}
return false;
}
}
邮箱信息内容模板
邮箱模板需要在mail目录下创建
mail/seekpass.php
生成URL地址连带参数
Yii::$app->urlManager->createAbsoluteUrl(['admin/manage/mailchangepass', 'timestamp' => $time, 'adminuser' => $adminuser, 'token' => $token]);
<p>尊敬的<?php echo $adminuser; ?>,您好:</p>
<p>您的找回密码链接如下:</p>
<?php $url = Yii::$app->urlManager->createAbsoluteUrl(['admin/manage/mailchangepass', 'timestamp' => $time, 'adminuser' => $adminuser, 'token' => $token]); ?>
<p><a href="<?php echo $url; ?>"><?php echo $url; ?></a></p>
<p>该链接5分钟内有效,请勿传递给别人!</p>
<p>该邮件为系统自动发送,请勿回复!</p>
html发送信息到邮箱模板
接收成功信息提示
Yii::$app->session->getFlash('info');
生成type=text 的input
<?php echo $form->field($model, 'adminuser')->textInput(["class" => "span12", "placeholder" => "管理员账号"]); ?>
form表单开始
{error}
是每个input的验证错误信息
<?php $form = ActiveForm::begin([
'fieldConfig' => [
'template' => '{error}{input}',
],
]); ?>
form表单结束
<?php ActiveForm::end(); ?>
<?php
//引入form表单组件
use yii\bootstrap\ActiveForm;
//引入html组件
use yii\helpers\Html;
?>
<!DOCTYPE html>
<html class="login-bg">
<head>
<title>后台管理</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<!-- bootstrap -->
<link href="assets/admin/css/bootstrap/bootstrap.css" rel="stylesheet" />
<link href="assets/admin/css/bootstrap/bootstrap-responsive.css" rel="stylesheet" />
<link href="assets/admin/css/bootstrap/bootstrap-overrides.css" type="text/css" rel="stylesheet" />
<!-- global styles -->
<link rel="stylesheet" type="text/css" href="assets/admin/css/layout.css" />
<link rel="stylesheet" type="text/css" href="assets/admin/css/elements.css" />
<link rel="stylesheet" type="text/css" href="assets/admin/css/icons.css" />
<!-- libraries -->
<link rel="stylesheet" type="text/css" href="assets/admin/css/lib/font-awesome.css" />
<!-- this page specific styles -->
<link rel="stylesheet" href="assets/admin/css/compiled/signin.css" type="text/css" media="screen" />
<!-- open sans font -->
<!--[if lt IE 9]>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
<body>
<div class="row-fluid login-wrapper">
<!-- yii\helpers\Url::to 生成URL地址 -->
<a class="brand" href="<?php echo yii\helpers\Url::to(['/index/index']) ?>"></a>
<!-- form 开始标签 {error} 验证错误信息-->
<?php $form = ActiveForm::begin([
'fieldConfig' => [
'template' => '{error}{input}',
],
]); ?>
<div class="span4 box">
<div class="content-wrap">
<h6> 找回密码</h6>
<!--发送成功信息-->
<?php if (Yii::$app->session->hasFlash('info')) {
echo Yii::$app->session->getFlash('info');
} ?>
<!--发送成功信息-->
<!-- 生成 text input -->
<?php echo $form->field($model, 'adminuser')->textInput(["class" => "span12", "placeholder" => "管理员账号"]); ?>
<?php echo $form->field($model, 'adminemail')->textInput(["class" => "span12", "placeholder" => "管理员电子邮箱"]); ?>
<!-- yii\helpers\Url::to 生成URL地址到 public/login -->
<a href="<?php echo yii\helpers\Url::to(['public/login']); ?>" class="forgot">返回登录</a>
<!--生成Button 按钮组件-->
<?php echo Html::submitButton('找回密码', ["class" => "btn-glow primary login"]); ?>
</div>
</div>
<?php ActiveForm::end(); ?>
<!--form 结束标签 -->
</div>
<!-- scripts -->
<script src="assets/admin/js/jquery-latest.js"></script>
<script src="assets/admin/js/bootstrap.min.js"></script>
<script src="assets/admin/js/theme.js"></script>
<!-- pre load bg imgs -->
<script type="text/javascript">
$(function () {
// bg switcher
var $btns = $(".bg-switch .bg");
$btns.click(function (e) {
e.preventDefault();
$btns.removeClass("active");
$(this).addClass("active");
var bg = $(this).data("img");
$("html").css("background-image", "url('img/bgs/" + bg + "')");
});
});
</script>
</body>
</html>
发送成功后
html修改密码模板
<?php
//引入form组件
use yii\bootstrap\ActiveForm;
//引入html组件
use yii\helpers\Html;
?>
<!DOCTYPE html>
<html class="login-bg">
<head>
<title> 后台管理</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<!-- bootstrap -->
<link href="assets/admin/css/bootstrap/bootstrap.css" rel="stylesheet" />
<link href="assets/admin/css/bootstrap/bootstrap-responsive.css" rel="stylesheet" />
<link href="assets/admin/css/bootstrap/bootstrap-overrides.css" type="text/css" rel="stylesheet" />
<!-- global styles -->
<link rel="stylesheet" type="text/css" href="assets/admin/css/layout.css" />
<link rel="stylesheet" type="text/css" href="assets/admin/css/elements.css" />
<link rel="stylesheet" type="text/css" href="assets/admin/css/icons.css" />
<!-- libraries -->
<link rel="stylesheet" type="text/css" href="assets/admin/css/lib/font-awesome.css" />
<!-- this page specific styles -->
<link rel="stylesheet" href="assets/admin/css/compiled/signin.css" type="text/css" media="screen" />
<!-- open sans font -->
<!--[if lt IE 9]>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
<body>
<div class="row-fluid login-wrapper">
<!-- 生成URL地址 -->
<a class="brand" href="<?php echo yii\helpers\Url::to(['/index/index']) ?>"></a>
<!--form 开始 {error} 错误验证信息 -->
<?php $form = ActiveForm::begin([
'fieldConfig' => [
'template' => '{error}{input}',
],
]); ?>
<div class="span4 box">
<div class="content-wrap">
<h6> 修改密码</h6>
<?php
//修改成功信息
if (Yii::$app->session->hasFlash('info')) {
echo Yii::$app->session->getFlash('info');
}
?>
<!-- 生成 text input -->
<?php echo $form->field($model, 'adminuser')->hiddenInput(); ?>
<!-- 生成 type=password input -->
<?php echo $form->field($model, 'adminpass')->passwordInput(["class" => "span12", "placeholder" => "新密码"]); ?>
<?php echo $form->field($model, 'repass')->passwordInput(["class" => "span12", "placeholder" => "确认密码"]); ?>
<!-- yii\helpers\Url::to 生成URL地址到 public/login -->
<a href="<?php echo yii\helpers\Url::to(['public/login']); ?>" class="forgot">返回登录</a>
<?php echo Html::submitButton('修改', ["class" => "btn-glow primary login"]); ?>
</div>
</div>
<!--form 结束 -->
<?php ActiveForm::end(); ?>
</div>
<!-- scripts -->
<script src="assets/admin/js/jquery-latest.js"></script>
<script src="assets/admin/js/bootstrap.min.js"></script>
<script src="assets/admin/js/theme.js"></script>
<!-- pre load bg imgs -->
<script type="text/javascript">
$(function () {
// bg switcher
var $btns = $(".bg-switch .bg");
$btns.click(function (e) {
e.preventDefault();
$btns.removeClass("active");
$(this).addClass("active");
var bg = $(this).data("img");
$("html").css("background-image", "url('img/bgs/" + bg + "')");
});
});
</script>
</body>
</html>