尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

thinkPHP配置邮箱发送邮件、验证码

thinkPHP配置邮箱发送邮件、验证码
📅 发布时间:2026/6/20 4:32:36

一、安装邮件驱动

composer require phpmailer/phpmailer
# 或使用 ThinkPHP 官方邮件库
composer require topthink/think-mailer

 

二、配置邮箱参数

1. 创建或者修改配置文件 config/mail.php

<?php
return [
// 默认使用的邮箱驱动
'default' => env('mail.driver', 'smtp'),

// SMTP 配置
'smtp' => [
// SMTP服务器地址
'host' => env('mail.host', 'smtp.qq.com'),
// 端口
'port' => env('mail.port', 465),
// 加密方式 ssl/tls
'encryption' => env('mail.encryption', 'ssl'),
// 邮箱账号
'username' => env('mail.username', ''),
// 邮箱密码或授权码
'password' => env('mail.password', ''),
// 发件人名称
'from_name' => env('mail.from_name', 'Your App Name'),
],

// 验证码配置
'code' => [
'expire' => 300, // 验证码有效期(秒)
'length' => 6, // 验证码长度
]
];

 

2. 在 .env文件中配置(配置的邮箱不同具体内容也不同)

例如谷歌邮箱、QQ邮箱、企业邮箱配置参考:https://www.cnblogs.com/youantianqin/p/18936653

[MAIL]
DRIVER = smtp
HOST = smtp.qq.com
PORT = 587
ENCRYPTION = tls
USERNAME = your_email@qq.com
PASSWORD = your_auth_code
FROM_NAME = Your App

 

三.创建邮件服务类app/service/MailService.php

<?php
declare (strict_types = 1);

namespace app\service;

use think\facade\Cache;
use think\facade\Config;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

class MailService
{
// 生成验证码
public function generateCode(string $email): string
{
$length = Config::get('mail.code.length', 6);
$code = '';
for ($i = 0; $i < $length; $i++) {
$code .= mt_rand(0, 9);
}

$key = 'mail_code:' . $email;
$expire = Config::get('mail.code.expire', 300);

Cache::set($key, $code, $expire);

return $code;
}

// 验证验证码
public function verifyCode(string $email, string $code): bool
{
$key = 'mail_code:' . $email;
$cachedCode = Cache::get($key);

if (!$cachedCode || $cachedCode !== $code) {
return false;
}

// 验证通过后删除验证码
Cache::delete($key);
return true;
}

// 发送验证码邮件
public function sendCode(string $email, string $code): bool
{
$config = Config::get('mail.smtp');

$mail = new PHPMailer(true);

try {
// 服务器配置
$mail->isSMTP();
$mail->CharSet = 'UTF-8';
$mail->Host = $config['host'];
$mail->SMTPAuth = true;
$mail->Username = $config['username'];
$mail->Password = $config['password'];
$mail->SMTPSecure = $config['encryption'];
$mail->Port = $config['port'];

// 发件人
$mail->setFrom($config['username'], $config['from_name']);
// 收件人
$mail->addAddress($email);

// 邮件内容
$mail->isHTML(true);
$mail->Subject = '验证码邮件';

$content = $this->getEmailTemplate($code);
$mail->Body = $content;
$mail->AltBody = '您的验证码是:' . $code . ',有效期5分钟';

return $mail->send();
} catch (Exception $e) {
// 记录日志
\think\facade\Log::error('邮件发送失败:' . $mail->ErrorInfo);
return false;
}
}

// 获取邮件模板
protected function getEmailTemplate(string $code): string
{
return <<<HTML
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>验证码邮件</title>
<style>
.container { max-width: 600px; margin: 0 auto; padding: 20px; }
.code { font-size: 24px; color: #1890ff; font-weight: bold; }
.tip { color: #999; font-size: 14px; }
</style>
</head>
<body>
<div class="container">
<h2>邮箱验证码</h2>
<p>您好!</p>
<p>您的验证码是:<span class="code">{$code}</span></p>
<p class="tip">验证码有效期5分钟,请勿泄露给他人。</p>
<p>如果不是您本人操作,请忽略此邮件。</p>
</div>
</body>
</html>
HTML;
}
}

四、创建控制器index/controller/Email.php  (具体位置可自定义)

<?php

namespace app\index\controller;

use library\Controller;
//use think\facade\Request;
//use think\db;
use emailService\MailService;
use think\facade\Validate;
//邮箱操作接口
class Email extends Controller
{
// 发送验证码
public function sendCode()
{
$email = $this->request->param('email');

// 验证邮箱格式
$validate = Validate::rule([
'email' => 'require|email'
]);

if (!$validate->check(['email' => $email])) {
return json(['code' => 400, 'msg' => '邮箱格式错误']);
}

// 防刷验证
$key = 'send_limit:' . $email;
if (cache($key)) {
return json(['code' => 400, 'msg' => '发送过于频繁,请稍后再试']);
}

$mailService = new MailService();

// 生成验证码
$code = $mailService->generateCode($email);

// 发送邮件
$result = $mailService->sendCode($email, $code);

if ($result) {
// 设置发送限制,60秒内只能发送一次
cache($key, 1, 60);

return json([
'code' => 200,
'msg' => '验证码发送成功',
'data' => ['email' => $email]
]);
}

return json(['code' => 500, 'msg' => '验证码发送失败']);
}

// 验证验证码
public function verifyCode()
{
$email = $this->request->param('email');
$code = $this->request->param('code');

$validate = Validate::rule([
'email' => 'require|email',
'code' => 'require|length:6'
]);

if (!$validate->check([
'email' => $email,
'code' => $code
])) {
return json(['code' => 400, 'msg' => '参数错误']);
}

$mailService = new MailService();
$result = $mailService->verifyCode($email, $code);

if ($result) {
return json([
'code' => 200,
'msg' => '验证成功'
]);
}

return json(['code' => 400, 'msg' => '验证码错误或已过期']);
}

}

五、使用postman等api测试工具或者前端请求这个发送邮件接口,提示发送成功,邮箱收到验证码即为配置成功。

image

 

每天进步一点点

相关新闻

  • 2025期刊发表星级服务TOP5口碑推荐:期刊发表服务选择哪家好 - mypinpai
  • 告别“裸奔”代码:用 Pydantic 让你的 Python 数据固若金汤
  • 2025浮动连接器十大知名品牌高速连接器公司实力排行榜 - 工业推荐榜

最新新闻

  • 2026年热门的义乌拼箱代理/义乌货运代理哪家专业 - 品牌宣传支持者
  • 从FWHM到σ:高斯波形解析中的关键几何关系与物理意义
  • C++栈与堆内存对比
  • 2026年知名的环保帆布袋/龙港帆布袋定制公司选择指南 - 品牌宣传支持者
  • 2026年口碑好的白市驿亲子烧烤游玩/重庆亲子户外休闲/重庆亲子研学基地/重庆农耕体验亲子农家乐哪家值得去 - 行业平台推荐
  • 2026永康全屋定制口碑爆棚的真相

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号