插件窝 干货文章 使用PHPMailer实现PHP发邮件功能

使用PHPMailer实现PHP发邮件功能

PHPMailer 邮件 1545    来源:插件窝    2019-05-28

第一步:

打开网址https://github.com/PHPMailer/PHPMailer/ 下载PHPMailer(或者composer 下载:composer require phpmailer/phpmailer ),PHPMailer 需要 PHP 的 sockets 扩展支持,而登录 QQ 邮箱 SMTP 服务器则必须通过 SSL 加密的, PHP 还得包含 openssl 的支持。

1569741191(1).jpg

第二步:使用 phpinfo() 函数查看 socket 和 openssl 扩展信息(wamp server 默认启用了该扩展)。

openssl 如果没有开启请打开php.ini文件进行开启

首先检查php.ini中;extension=php_openssl.dll是否存在, 如果存在的话去掉前面的注释符‘;’, 如果不存在这行,那么添加extension=php_openssl.dll。

1569741305444695.jpg

PHPMailer 核心文件

1569741278(1).jpg

第三步:QQ 邮箱设置

所有的主流邮箱都支持 SMTP 协议,但并非所有邮箱都默认开启,您可以在邮箱的设置里面手动开启。

第三方服务在提供了账号和密码之后就可以登录 SMTP 服务器,通过它来控制邮件的中转方式。

第四步:开启 SMTP 服务

1569741418938097.jpg

选择 IMAP/SMTP 服务,点击开启服务

第五步:验证密保

1569741468(1).jpg

发送短信“配置邮件客户端”至1069-0700-69

第六步:获取授权码

1569741492(1).jpg

SMTP 服务器认证密码,需要妥善保管(PS:密码直接没有空格)

第七步:PHP发送邮件

基本代码

下面的代码演示了 PHPMailer 的使用方法,注意 PHPMailer 实例的配置过程。

 

// 引入PHPMailer的核心文件
require_once("PHPMailer/class.phpmailer.php");
require_once("PHPMailer/class.smtp.php");

// 实例化PHPMailer核心类
$mail = new PHPMailer();
// 是否启用smtp的debug进行调试 开发环境建议开启 生产环境注释掉即可 默认关闭debug调试模式
$mail->SMTPDebug = 1;
// 使用smtp鉴权方式发送邮件
$mail->isSMTP();
// smtp需要鉴权 这个必须是true
$mail->SMTPAuth = true;
// 链接qq域名邮箱的服务器地址
$mail->Host = 'smtp.qq.com';
// 设置使用ssl加密方式登录鉴权
$mail->SMTPSecure = 'ssl';
// 设置ssl连接smtp服务器的远程服务器端口号
$mail->Port = 465;
// 设置发送的邮件的编码
$mail->CharSet = 'UTF-8';
// 设置发件人昵称 显示在收件人邮件的发件人邮箱地址前的发件人姓名
$mail->FromName = '发件人昵称';
// smtp登录的账号 QQ邮箱即可
$mail->Username = '12345678@qq.com';
// smtp登录的密码 使用生成的授权码
$mail->Password = '**********';
// 设置发件人邮箱地址 同登录账号
$mail->From = '12345678@qq.com';
// 邮件正文是否为html编码 注意此处是一个方法
$mail->isHTML(true);
// 设置收件人邮箱地址
$mail->addAddress('87654321@qq.com');
// 添加多个收件人 则多次调用方法即可
$mail->addAddress('87654321@163.com');
// 添加该邮件的主题
$mail->Subject = '邮件主题';
// 添加邮件正文
$mail->Body = '<h1>Hello World</h1>';
// 为该邮件添加附件
$mail->addAttachment('./example.pdf');
// 发送邮件 返回状态
$status = $mail->send();

我在thinkphp5.1中使用代码

/**
*发送邮件方法
*@param $to:接收者 $title:标题 $content:邮件内容
*@return bool true:发送成功 false:发送失败
*/
protected function sendMail($to,$title,$content){
   $setting = Setting::where('name','email')->value('data');//站点配置的指定邮箱信息
   $setting = json_decode($setting,true);
   //实例化PHPMailer核心类
   $mail = new PHPMailer();

   //是否启用smtp的debug进行调试 开发环境建议开启 生产环境注释掉即可 默认关闭debug调试模式
   //$mail->SMTPDebug = 1;

   //使用smtp鉴权方式发送邮件
   $mail->isSMTP();

   //smtp需要鉴权 这个必须是true
   $mail->SMTPAuth=true;

   //链接qq域名邮箱的服务器地址
   $mail->Host = 'smtp.163.com';//$setting['smtp_host']

   //设置使用ssl加密方式登录鉴权
   $mail->SMTPSecure = 'ssl';

   //设置ssl连接smtp服务器的远程服务器端口号,以前的默认是25,
   //但是现在新的好像已经不可用了 可选465或587
   $mail->Port = 465;//$setting['port'];

   //设置smtp的helo消息头 这个可有可无 内容任意
   // $mail->Helo = 'Hello smtp.qq.com Server';

   //设置发件人的主机域 可有可无 默认为localhost 内容任意,建议使用你的域名
   $mail->Hostname = request()->domain();

   //设置发送的邮件的编码 可选GB2312 我喜欢utf-8 据说utf8在某些客户端收信下会乱码
   $mail->CharSet = 'UTF-8';

   //设置发件人姓名(昵称) 任意内容,显示在收件人邮件的发件人邮箱地址前的发件人姓名
   $mail->FromName = '插件窝';//$setting['nickname'];

   //smtp登录的账号 这里填入字符串格式的qq号即可
   $mail->Username = '18825070172@163.com';//$setting['username'];

   //smtp登录的密码 使用生成的授权码(就刚才叫你保存的最新的授权码)
   $mail->Password = 'a123456';//$setting['password'];

   //设置发件人邮箱地址 这里填入上述提到的“发件人邮箱”
   $mail->From = '18825070172@163.com';//$setting['username'];

   //邮件正文是否为html编码 注意此处是一个方法 不再是属性 true或false
   $mail->isHTML(true);

   //设置收件人邮箱地址 该方法有两个参数 第一个参数为收件人邮箱地址 第二参数为给该地址设置的昵称
   //不同的邮箱系统会自动进行处理变动 这里第二个参数的意义不大
   $mail->addAddress($to,'插件窝注册邮箱验证码');

   //添加多个收件人 则多次调用方法即可
   // $mail->addAddress('xxx@163.com','lsgo在线通知');

   //添加该邮件的主题
   $mail->Subject = $title;

   //添加邮件正文 上方将isHTML设置成了true,则可以是完整的html字符串
   // 如:使用file_get_contents函数读取本地的html文件
   $mail->Body = $content;

   //为该邮件添加附件 该方法也有两个参数 第一个参数为附件存放的目录(相对目录、或绝对目录均可)
   // 第二参数为在邮件附件中该附件的名称
   // $mail->addAttachment('./d.jpg','mm.jpg');
   //同样该方法可以多次调用 上传多个附件
   // $mail->addAttachment('./Jlib-1.1.0.js','Jlib.js');

   $status = $mail->send();

   //简单的判断与提示信息
   if($status) {
       return true;
   }else{
       return  $mail->ErrorInfo;
   }
}