tp5.1 使用 phpmailer 发送电子邮件
简介
phpMailer 是一个非常强大的 ph p发送邮件类,可以设定发送邮件地址、回复地址、邮件主题、html网页,上传附件,并且使用起来非常方便。
github:https://github.com/PHPMailer/PHPMailer/
phpMailer 的特点:
- 在邮件中包含多个 TO、CC、BCC 和 REPLY-TO。
- 平台应用广泛,支持的 SMTP 服务器包括 Sendmail、qmail、Postfix、Gmail、Imail、Exchange 等等。
- 支持嵌入图像,附件,HTML 邮件。
- 可靠的强大的调试功能。
- 支持 SMTP 认证。
- 自定义邮件头。
- 支持 8bit、base64、binary 和 quoted-printable 编码。
安装
使用 composer 安装:
composer require phpmailer/phpmailer
邮件服务配置
发送之前需要拥有自己的邮件服务器,测试的时候其实用自己申请的免费邮箱最方便了,不需要自己再搭建服务器了,可能要配置邮箱的SMTP服务,大部分公共邮箱(163、qq等)为了安全默认是关闭的。
网易邮箱配置如下图:
QQ 邮箱相关配置如下图:
邮箱 | POP3服务器(端口995) | SMTP服务器(端口465或587) |
---|---|---|
qq.com | pop.qq.com | smtp.qq.com |
这里以163邮箱配置作为示例
设置邮箱客户端授权码
找到设置
开启服务
开启服务器之后会有显示,注意授权码只显示一次,开启过程中注意保存
对PHPMailer类库使用进行封装
在extends下 创建\mail\Mail.php
文件内容如下
<?php
namespace mail;
//引入邮件类,tp5.1只要有命名空间会自动加载
use PHPMailer\PHPMailer\PHPMailer;
class Mail
{
//服务器配置,一般是默认配置
private $CharSet ="UTF-8"; //设定邮件编码
private $SMTPDebug = 0; // 调试模式输出
private $isSMTP = true; // 使用SMTP
private $Host = 'smtp.163.com'; // SMTP服务器
private $SMTPAuth = true; // 允许 SMTP 认证
private $Username = '邮箱用户名'; // SMTP 用户名 即邮箱的用户名
private $Password = '密码或者授权码'; // SMTP 密码 部分邮箱是授权码(例如163邮箱)
private $SMTPSecure = 'ssl'; // 允许 TLS 或者ssl协议
private $Port = 465; // 服务器端口 25 或者465 具体要看邮箱服务器支持
//修改成自己的邮箱
private $From = 'xxx@163.com'; //发件人邮箱
private $FromName = 'makalo'; //发件人的用户昵称
//邮件对象
private $mail;
//一般只有用户名和密码还有端口会变动,所以这三个参数可以创建对象动态指定,也可以直接写死
public function __construct($Username = '', $Password = '', $Port = ''){
if(!empty($Username)){
$this->Username = $Username;
}
if(!empty($Password)){
$this->Password = $Password;
}
if(!empty($Port)){
$this->Port = $Port;
}
//为true表示启用异常
$mail = new PHPMailer(true);
//服务器配置
$mail->CharSet = $this->CharSet; //设定邮件编码
$mail->SMTPDebug = $this->SMTPDebug; // 调试模式输出
if($this->isSMTP === true){
$mail->isSMTP(); // 使用SMTP
}
$mail->Host = $this->Host; // SMTP服务器
$mail->SMTPAuth = $this->SMTPAuth; // 允许 SMTP 认证
$mail->Username = $this->Username; // SMTP 用户名 即邮箱的用户名
$mail->Password = $this->Password; // SMTP 密码 部分邮箱是授权码(例如163邮箱)
$mail->SMTPSecure = $this->SMTPSecure; // 允许 TLS 或者ssl协议
$mail->Port = $this->Port; // 服务器端口 25 或者465 具体要看邮箱服务器支持
$mail->setFrom($this->From, $this->FromName); //发件人
$this->mail = $mail;
}
/**
* 发送邮件
* @param array $sendAddress 收件人地址数组, 如果为单值数组则只写入收件地址,如果为键值数组则还写入收件人名称
* @param array $Attachment 附件数组,如果为单值数组则为添加附件,如果为键值数组则添加附件并且重命名
* @param bool $isHtml 是否以html文档格式发送
* @param string $Subject 邮件主题
* @param string $Body 邮件内容,如果以html格式可以写入html
* @param string $AltBody 如果为单值数组则只写入收件地址,如果为键值数组则还写入收件人名称
* @param array $CC 抄送地址数组, 如果为单值数组则只写入收件地址,如果为键值数组则还写入收件人名称
* @param array $BCC 密送地址数组,如果为单值数组则只写入收件地址,如果为键值数组则还写入收件人名称
* @return bool 是否发送成功
*/
public function sendEMail($sendAddress = [],$Subject = '', $Body = '', $AltBody = '', $Attachment = [] ,$isHtml = true,$CC = [], $BCC = []){
try {
//必填参数校验
if(empty($sendAddress) || empty($Subject) || empty($Body)){
return false;
}
//收件人
foreach ($sendAddress as $key => $value) {
if (is_int($key)) {
// 处理单值
$this->mail->addAddress($value);
} else {
// 处理键值
$this->mail->addAddress($value, $key);
}
}
//附件
if(!empty($Attachment)){
foreach ($Attachment as $key => $value) {
if (is_int($key)) {
// 处理单值
$this->mail->addAttachment($value);
} else {
// 处理键值
$this->mail->addAttachment($value, $key);
}
}
}
//抄送
if(!empty($CC)){
//抄送不为空
foreach ($CC as $key => $value) {
if (is_int($key)) {
// 处理单值
$this->mail->addCC($value);
} else {
// 处理键值
$this->mail->addCC($value, $key);
}
}
}
//密送
if(!empty($BCC)){
//密送不为空
foreach ($CC as $key => $value) {
if (is_int($key)) {
// 处理单值
$this->mail->addBCC($value);
} else {
// 处理键值
$this->mail->addBCC($value, $key);
}
}
}
//回复的时候回复给哪个邮箱 建议和发件人一致
$this->mail->addReplyTo($this->From, $this->FromName);
//Content
// 是否以HTML文档格式发送 发送后客户端可直接显示对应HTML内容
$this->mail->isHTML($isHtml);
//邮件主题
$this->mail->Subject = $Subject;
//邮件内容
$this->mail->Body = $Body;
//如果邮件客户端不支持HTML则显示此内容
$this->mail->AltBody = $AltBody;
//发送
$this->mail->send();
return true;
} catch (\Exception $e) {
echo '邮件发送失败: ', $this->mail->ErrorInfo;
return false;
}
}
}
测试
不带附件
//不带附件
Route::any('test24', function (){
$mail = new Mail('makaloxx@163.com', 'EKYBQxxxANDPISHR');
$res = $mail->sendEMail(['makaloxxx@foxmail.com'], '测试邮件主题'. time(), '<h1>这里是邮件内容</h1>' . date('Y-m-d H:i:s'),'如果邮件客户端不支持HTML则显示此内容');
dump($res);
});
结果
带附件
//带附件
Route::any('test25', function (){
$mail = new Mail('makaloxxx@163.com', 'EKYBxxxPISHR');
$Attachment = [
//直接添加附件
Env::get("root_path") . "test.png",
//添加附件并重命名
'change_name.png' => Env::get("root_path") . "test.png"
];
$res = $mail->sendEMail(
['makalochen@foxmail.com'], '测试邮件主题'. time(),
'<h1>这里是邮件内容</h1>' . date('Y-m-d H:i:s'),
'如果邮件客户端不支持HTML则显示此内容',
$Attachment
);
dump($res);
});
效果
参考:https://www.runoob.com/w3cnote/php-phpmailer.html