邮件发送功能在项目中还是非常常用的,比如用户注册发送验证码,用户发送留言邮件,事件提醒功能等。今天我们就用thinkphp5整合PHPMailer扩展来实现邮件发送功能。
1、QQ邮箱设置
想要在第三方登录QQ邮箱发送邮件,首先得开启QQ邮箱的SMTP服务,并设置第三方登录授权码
2、下载PHPMail扩展
扩展下载地址:https://github.com/PHPMailer/PHPMailer
在下载的文件的解压缩包中只有这几个文件是我们需要的:Exception.php,PHPMailer.php,POP3.php,SMTP.php
extend\PHPMailer\src :
3、将PHPMail扩展放到我们的Thinkphp5项目中
在 extend 下新建一个文件夹 PHPMailer,将第二步提到的4个php文件放到 PHPMailer 文件夹内,并将这4个php文件的命名空间都改成
namespace PHPMailer;
4、开始代码实现发送邮件
PHPMail扩展放入项目后就可以开始写代码实现邮件发送功能了:
use PHPMailer\PHPMailer; //引入PHPmailer扩展类 /** * @param $toEMail 接收人的邮箱号 * @param $toName 接收人名字 * @param $content 邮件内容 * @throws \PHPMailer\Exception */ public function sendMail($toEMail=null,$toName=null, $content=null) { $phpMaid = new PHPMailer(); $sendmail = EMAIL_ADMIN; //发件人邮箱,可以通过常量配置,或者通过配置文件配置 $sendmailpswd = EMAIL_PASSWORD; //客户端授权密码,第一步QQ邮箱开启SMTP服务时设置的授权码 $send_name = '心月IT博客';// 设置发件人信息,如邮件格式说明中的发件人, $phpMaid->isSMTP();// 使用SMTP服务 $phpMaid->CharSet = "utf8";// 编码格式为utf8,不设置编码的话,中文会出现乱码 $phpMaid->Host = "SMTP.qq.com";// 发送方的SMTP服务器地址 $phpMaid->SMTPAuth = true;// 是否使用身份验证 $phpMaid->Username = $sendmail;//// 发送方的 $phpMaid->Password = $sendmailpswd;//客户端授权密码,而不是邮箱的登录密码! $phpMaid->SMTPSecure = "ssl";// 使用ssl协议方式 $phpMaid->Port = 465;// sina端口110或25) //qq 465 587 $phpMaid->setFrom($sendmail, $send_name);// 设置发件人信息,如邮件格式说明中的发件人, $phpMaid->addAddress($toemail, $to_name);// 设置收件人信息,如邮件格式说明中的收件人, $phpMaid->addReplyTo($sendmail, $send_name);// 设置回复人信息,指的是收件人收到邮件后,如果要回复,回复邮件将发送到的邮箱地址 $phpMaid->Subject = "这是邮件的标题!";// 邮件标题 $phpMaid->Body = $content; // 邮件正文 //$mail->AltBody = "This is the plain text纯文本";// 这个是设置纯文本方式显示的正文内容,如果不支持Html方式,就会用到这个,基本无用 if(!$phpMaid->send()){ echo "邮件发送失败,发送失败原因:".$phpMaid->ErrorInfo.date('Y-m-d H:i:s',time()); }else{ echo "邮件发送成功:".date('Y-m-d H:i:s',time()); } }
接下来通过执行 sendMail 函数验证能否成功发送邮件:
(注意下函数的3个参数,可以先在函数中定死这3个参数的值,等测试成功后再换成参数)
QQ邮箱成功接收到邮件,说明代码没问题。
【开发中的坑】
如果遇到 Extension missing: openssl 问题,这是因为php的openssl扩展没开启,在php.ini配置文件中开启 它,然后重启服务器。
如果遇到 SMTP connect() failed ,账号登录失败的原因,检查下发件人的邮箱账号和授权码是否设置正确。
PHPMail发送邮件的流程大致就是这样的,在实际项目中可能会有多处需要发送邮件,因此我们可以把它封装成一个在整个项目流程中都能调用到的方法,然后把可能变动的信息设置成参数,在需要发送邮件的地方,只需调用这个发送邮件的方法并传入相关参数即可。