# .composer下載PHPMailer包
# 2.封裝發送郵件功能
把這個函數丟到`app/common.php`公共的函數文件中去
~~~php
//郵件發送
if (!function_exists('sendmail')) {
function sendmail($address, $title, $body)
{
$mail = new \PHPMailer\PHPMailer\PHPMailer(true);
try {
$mail->SMTPDebug = 0;
$mail->isSMTP();
$mail->CharSet = "UTF-8"; //utf-8;
$mail->Encoding = "base64";
$mail->Host = env('mail.host');
$mail->SMTPAuth = true;
$mail->Username = env('mail.username');
$mail->Password = env('mail.password');
$mail->SMTPSecure = env('mail.encryption');
$mail->Port = env('mail.port');
//Recipients
$mail->setFrom(env('mail.from_address'), env('mail.from_name'));
//接收人
$mail->addAddress($address);
//回復的時候回復給哪個郵箱 建議和發件人一致
$mail->addReplyTo(env('mail.from_address'), 'info');
//Content
$mail->isHTML(true);
//防止中文亂碼
$mail->Subject = "=?UTF-8?B?" . base64_encode($title) . "?=";
$mail->Body = $body;
$mail->AltBody = '您的郵箱客戶端不支持顯示HTML內容';
$mail->send();
return true;
} catch (Exception $e) {
return $e;
}
}
}
~~~
`.env`配置文件
最新的88郵箱配置smtp地址是smtp.88.com 端口465
~~~ini
[MAIL]
HOST = smtp.88.com
PORT = 465
USERNAME = xxxx
PASSWORD = xxxxx
ENCRYPTION = ssl
FROM_ADDRESS = xxxx
FROM_NAME = xxx
~~~
# 3.使用
~~~bash
sendmail('xxx@xx.xx', '系統通知', '<h1>你好啊</h1>');
~~~
# 拓展:使用think-queue消息隊列發送郵件
~~~php
//前面的注冊邏輯省略...
//緩存key(此處可以替換為redis等nosql緩存產品)
//參數說明
//參數1:緩存標志register_email_code_+用戶注冊入庫時返回的主鍵id作為緩存key
//參數2:uuid當作緩存值進行緩存
//參數3:緩存過期時間(這里我從我的配置文件中讀取,你可以直接設置值,單位:秒),24 * 60 * 60
cache("register_email_code_" . $user->id, $uuid, config('my.email_register.expire'));
//異步發送郵箱
//把需要的數據傳遞過去
Queue::push(RegEmailActiveJob::class, [
'user_id' => $user->id,
//昵稱
'nickname' => $user->profile->nickname,
//uuid
'uuid' => $uuid,
//發給誰
'email' => $user->email
]);
~~~
生成RegEmailActiveJob異步任務
~~~php
<?php
namespace app\job;
use think\queue\Job;
class RegEmailActiveJob
{
public function fire(Job $job, $data)
{
$user_id = $data['user_id'];
$nickname = $data['nickname'];
$uuid = $data['uuid'];
$email = $data['email'];
$link = env('app.host') . '/validate/email?user_id=' . $user_id . '&code=' . $uuid;
//smarty替換變量后返回html內容
$html = app('smarty')->fetch('index/email/regEmailActive.tpl', compact('nickname', 'link'));
//發送郵件
sendmail($email, config('my.email_register.title'), $html);
if ($job->attempts() > 3) {
//通過這個方法可以檢查這個任務已經重試了幾次了
// Log::info("超過三次");
}
//如果任務執行成功后 記得刪除任務,不然這個任務會重復執行,直到達到最大重試次數后失敗后,執行failed方法
$job->delete();
// 也可以重新發布這個任務
//$job->release(0); //$delay為延遲時間
}
public function failed($data)
{
// ...任務達到最大重試次數后,失敗了
}
}
~~~
uuid生成方法
~~~perl
//生成uuid
if (!function_exists('uuid')) {
function uuid($prefix = '')
{
$chars = md5(uniqid(mt_rand(), true));
$uuid = substr($chars, 0, 8);
$uuid .= substr($chars, 8, 4);
$uuid .= substr($chars, 12, 4);
$uuid .= substr($chars, 16, 4);
$uuid .= substr($chars, 20, 12);
return $prefix . $uuid;
}
}
~~~
# 發送成功后用戶點擊連接的處理
驗證成功后你可以直接登錄,你也可以跳轉回登錄頁,讓用戶登錄
~~~php
//郵箱注冊鏈接回調
public function email(Request $request)
{
//接收參數
$user_id = $request->get('user_id');
$code = $request->get('code');
if ($user_id === null || $code === null) {
return $this->smarty->display('index/error/error.tpl', [
'msg' => '激活地址非法',
'code' => 500
]);
}
//判斷緩存中取出來的是否和傳遞過來的是否相等
if (cache('register_email_code_' . $user_id) != $code) {
return $this->smarty->display('index/error/error.tpl', [
'msg' => '激活地址已失效',
'code' => 500
]);
}
//上面那一步過不來就等于是非法了,到這一步其實就已經可以直接更新狀態了
$user = User::with(['profile'])->find($user_id);
$user->status = 1;
$user->save();
//讓緩存失效
cache('register_email_code_' . $user_id, null);
//直接登錄
session('index_user', $user);
return redirect((string)url('/'))->with('success', '登錄成功');
}
~~~
- thinkphp6執行流程(一)
- php中use關鍵字用法詳解
- Thinkphp6使用騰訊云發送短信步驟
- 路由配置
- Thinkphp6,static靜態資源訪問路徑問題
- ThinkPHP6.0+ 使用Redis 原始用法
- smarty在thinkphp6.0中的最佳實踐
- Thinkphp6.0 搜索器使用方法
- 從已有安裝包(vendor)恢復 composer.json
- tp6with的用法,表間關聯查詢
- thinkphp6.x多對多如何添加中間表限制條件
- thinkphp6 安裝JWT
- 緩存類型
- 請求信息和HTTP頭信息
- 模型事件用法
- 助手函數匯總
- tp6集成Alipay 手機和電腦端支付的方法
- thinkphp6使用jwt
- 6.0session cookie cache
- tp6筆記
- TP6(thinkphp6)隊列與延時隊列
- thinkphp6 command(自定義指令)
- command(自定義指令)
- 本地文件上傳
- 緩存
- 響應
- 公共函數配置
- 七牛云+文件上傳
- thinkphp6:訪問多個redis數據源(thinkphp6.0.5 / php 7.4.9)
- 富文本編輯器wangEditor3
- IP黑名單
- 增刪改查 +文件上傳
- workerman 定時器操作控制器的方法
- 上傳文件到阿里云oss
- 短信或者郵箱驗證碼防刷代碼
- thinkphp6:訪問redis6(thinkphp 6.0.9/php 8.0.14)
- 實現關聯多個id以逗號分開查詢數據
- thinkphp6實現郵箱注冊功能的細節和代碼(點擊鏈接激活方式)
- 用mpdf生成pdf文件(php 8.1.1 / thinkphp v6.0.10LTS )
- 生成帶logo的二維碼(php 8.1.1 / thinkphp v6.0.10LTS )
- mysql數據庫使用事務(php 8.1.1 / thinkphp v6.0.10LTS)
- 一,創建過濾IP的中間件
- 源碼解析請求流程
- 驗證碼生成
- 權限管理
- 自定義異常類
- 事件監聽event-listene
- 安裝與使用think-addons
- 事件與多應用
- Workerman 基本使用
- 查詢用戶列表按拼音字母排序
- 擴展包合集
- 查詢用戶數據,但是可以通過輸入用戶昵稱來搜索用戶同時還要統計用戶的文章和粉絲數
- 根據圖片的minetype類型獲取文件真實拓展名思路
- 到處excel
- 用imagemagick庫生成縮略圖
- 生成zip壓縮包并下載
- API 多版本控制
- 用redis+lua做限流(php 8.1.1 / thinkphp v6.0.10LTS )
- 【thinkphp6源碼分析三】 APP類之父, 容器Container類
- thinkphp6表單重復提交解決辦法
- 小程序授權
- 最簡單的thinkphp6導出Excel
- 根據訪問設備不同訪問不同模塊
- 服務系統
- 前置/后置中間件
- 給接口api做簽名驗證(php 8.1.1 / thinkphp v6.0.10LTS )
- 6實現郵箱注冊功能的細節和代碼(點擊鏈接激活方式)
- 使用前后端分離的驗證碼(thinkphp 6.0.9/php 8.0.14/vue 3.2.26)
- 前后端分離:用jwt+middleware做用戶登錄驗證(php 8.1.1 / thinkphp v6.0.10LTS )
- vue前后端分離多圖上傳
- thinkphp 分組、頁面跳轉與ajax
- thinkphp6 常用方法文檔
- 手冊里沒有的一些用法
- Swagger 3 API 注釋
- PHP 秒級定時任務
- thinkphp6集成gatewayWorker(workerman)實現實時監聽
- thinkphp6按月新增數據表
- 使用redis 實現消息隊列
- api接口 統一結果返回處理類
- 使用swoole+thinkphp6.0+redis 結合開發的登錄模塊
- 給接口api做簽名驗證
- ThinkPHP6.0 + UniApp 實現小程序的 微信登錄
- ThinkPHP6.0 + Vue + ElementUI + axios 的環境安裝到實現 CURD 操作!
- 異常$e
- 參數請求驗證自定義和異常錯誤自定義