TP5.1+PHPMailer实现邮件发送功能

php内置了 mail() 函数来实现邮件的发送,但是需要 smtp 服务器,这里的只有两种选择,一是选择自己搭建,二是寻找网上一些其他的免费的 smtp 服务器,但是这里又有一个限制,就是所选择的smtp服务器不能有验证,但是现在网上已经找不到或者说很难找到有不需要验证的smtp服务器了,这样一来,选择就只有自己搭建了。
php 内置的 mail() 函数实现邮件发送比较麻烦,还有一种选择就是 php 邮件发送的类库,配合qq,163这种免费的邮箱来实现邮件的发送

PHP 邮件发送类库的话选择 PHPMailer ,这个也是应用很广的一个类库 GitHub地址 https://github.com/PHPMailer/PHPMailer

将类库下载到 thinkphp 的 vendor 目录下,注意这里要使用 composer 来安装,否则 tp 无法自动加载,安装方法[composer require phpmailer/phpmailer]在 PHPmailer 的手册中有介绍

安装完成后,在 tp 的 application 目录下创建模块,控制器,方法,方法中的代码示例如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
$mail = new PHPMailer();
$mail->SMTPDebug = 1; //开启调试
// 使用smtp鉴权方式发送邮件
$mail->isSMTP();
//是否使用SMTP身份验证,这里要设置为true,默认为 flase
$mail->SMTPAuth = true;
// 链接qq域名邮箱的服务器地址
$mail->Host = 'smtp.qq.com';
// 设置SMTP的加密方式为ssl
$mail->SMTPSecure = 'ssl';
// 设置ssl连接smtp服务器的远程服务器端口号
$mail->Port = 465;
// 设置发送的消息的字符集
$mail->CharSet = 'UTF-8';
// 设置发件人昵称 显示在收件人邮件的发件人邮箱地址前的发件人姓名
$mail->FromName = '测试昵称';
// smtp登录的账号 QQ邮箱即可
$mail->Username = '[email protected]';
// smtp登录的密码 使用生成的授权码
$mail->Password = 'xxxxxxxxxxxx';
// 设置发件人邮箱地址 同登录账号
$mail->From = '[email protected]';
// 邮件正文是否为html编码 注意此处是一个方法
$mail->isHTML(true);
// 设置收件人邮箱地址
$mail->addAddress('[email protected]');
// 添加多个收件人 则多次调用方法即可
//$mail->addAddress('[email protected]');
// 添加该邮件的主题
$mail->Subject = '邮件主题';
// 添加邮件正文,如果为html消息,则需在前面先调用isHTML方法
$mail->Body = '<h1>晚上好!!</h1>';
// 为该邮件添加附件 本地路径
//$mail->addAttachment('xxxxxx');
// 发送邮件 返回状态
$status = $mail->send();
dump($status);

在此之前需要引入命名空间

use PHPMailer\PHPMailer\PHPMailer;

我们可重新封装该类,在自己封装好的类放置与 tp 的 extend 目录下,注意此目录下的类无法自动加载,我们需要添加自动加载方法或手动包含

封装示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<?php	
namespace extend;
use PHPMailer\PHPMailer\PHPMailer;

class Qmail
{
public static $FromName = "xxx"; //发件人名称
public static $UserName = "[email protected]"; //smtp登录账号,即QQ邮箱
public static $Password = "xxxxxxxxxx"; //smtp登录的密码 使用生成的授权码
private $Address; //收件人邮箱地址
private $Subject; //邮件主题
private $Body; //邮件正文
private $Attachment; //附件
private $SmtpDebug; //是否开启调试模式,默认不开启
private $mail;

public function qsend(){
//开启调试模式
$this->mail->SMTPDebug = $this->SmtpDebug;
// 使用smtp鉴权方式发送邮件
$this->mail->isSMTP();
//是否使用SMTP身份验证,这里要设置为true,默认为 flase
$this->mail->SMTPAuth = true;
// 链接qq域名邮箱的服务器地址
$this->mail->Host = 'smtp.qq.com';
// 设置SMTP的加密方式为ssl
$this->mail->SMTPSecure = 'ssl';
// 设置ssl连接smtp服务器的远程服务器端口号
$this->mail->Port = 465;
// 设置发送的消息的字符集
$this->mail->CharSet = 'UTF-8';
// 设置发件人昵称 显示在收件人邮件的发件人邮箱地址前的发件人姓名
$this->mail->FromName = self::$FromName;
// smtp登录的账号 QQ邮箱即可
$this->mail->Username = self::$UserName;
// smtp登录的密码 使用生成的授权码
$this->mail->Password = self::$Password;
// 设置发件人邮箱地址 同登录账号
$this->mail->From = self::$UserName;
// 设置收件人邮箱地址
foreach ($this->Address as $arr){
$this->mail->addAddress($arr);
}
// 添加该邮件的主题
$this->mail->Subject = $this->Subject;
// 添加邮件正文,如果为html消息,则需在前面先调用isHTML方法
$this->mail->Body = $this->Body;
//发送邮件
return $this->mail->send();
}
public function __construct($Subject,$Body,array $Address,$SmtpDebug=0,$IsHtml = true)
{
$this->mail = new PHPMailer();
$this->Subject = $Subject;
$this->Body = $Body;
$this->Address = $Address;
$this->SmtpDebug = $SmtpDebug;
$this->mail->isHTML($IsHtml); //设置邮件内容是否为html消息
}

public function Attachment($path){
// 为该邮件添加附件 本地路径
$this->mail->addAttachment($path);
}
}

这里讲一个骚操作,用 php 实现每天定制给女朋友发短信,如果女朋友有139邮箱邮箱,因为139邮箱有收到邮件自动短信提醒的功能,这样就可以通过每天定时发送邮件到139邮箱,然后139邮箱会自动发送短信到手机进行提示,有一个缺点就是提示短信的内容有字数限制。