邮件类phpmailer完美集成!(提供namespace和vendor版)
一、准备
1.Thinkphp框架3.2.3(其他版本也可以,这里是举例)
2.phpmailer 在git上获取最新版即可:https://github.com/PHPMailer/PHPMailer
二、必要的修改(命名空间namespace版和vendor版我都介绍一下,并提供代码下载)
(一)namespace版的修改过程(我测试的结果,这个版本性能略好一些,更通用)
1、在Library下新建文件夹,如 PHPMailer; 在下载的phpmailer压缩包中,找到:class.phpmailer.php 和 class.smtp.php 两个文件;复制过来;然后,分别重命名为: PHPMailer.class.php 和 SMTP.class.php;


2、在两个文件中,添加namespace即可:
(1)在SMTP.class.php、PHPMailer.class.php两个文件中, 在最上面添加:
namespace LaneLead\PHPMailer; //这里根据你文件夹位置写
(2)在PHPMailer.class.php文件中
找到 "class phpmailerException extends Exception" 替换为 "class phpmailerException extends \Think\Exception"
至此,修改完毕,和其他类库一样正常使用即可;如:$mail = new \LaneLead\PHPMailer\PHPMailer(); 后续使用,还有一个关键地方,稍后指出。
(二)vendor版修改过程(这个方式只能在functions函数文件中使用,在Controller中无法使用,Thinkphp3.2版,都有这样的缺点)
1、在下载的phpmailer压缩包中,找到:class.phpmailer.php 和 class.smtp.php 两个文件;复制到Library/Vendor/phpmailer文件夹中,文件名简单修改为“phpmailer.class.php 和 smtp.class.php”。(这里不修改也完全可以,修改的目的是为了使用import方法导入的时候方便,改一下也比较美观,呵呵)
2、class.phpmailer.php文件中,找到“ $this->smtp = new SMTP; ”,在上面添加一句: require_once('smtp.class.php');
至此,修改完毕,使用vendor导入即可使用;如:
//vendor模式
vendor('phpmailer.phpmailer#class');
$mail = new PHPMailer();
三、定义使用函数 send_email (这个和网上其他文章类似,不过注意我的下面的加粗说明部分,这是成功的关键!)
//作者:深蓝 QQ:1668142999 TEL:13884867561 主页:www.lanelead.com 公司:蓝锂网络
//功能函数 - 发送email
//参数: $toemail - 要发送到的email地址, 多个使用一维数组即可; $subject - email标题; $body - email主体内容
function send_email($toemail, $subject, $body) {
//示例化PHPMailer核心类
//vendor模式
vendor('phpmailer.phpmailer#class');
$mail = new PHPMailer();
//nameplace 模式;
//$mail = new \LaneLead\PHPMailer\PHPMailer();
//是否启用smtp的debug进行调试 开发环境建议开启 生产环境注释掉即可 默认关闭debug调试模式
$mail->SMTPDebug = 0;
//使用smtp鉴权方式发送邮件,当然你可以选择pop方式 sendmail方式等 本文不做详解
//可以参考http://phpmailer.github.io/PHPMailer/当中的详细介绍
$mail->isSMTP();
//加密方式 "ssl" or "tls"
$mail->SMTPSecure = C('email_config.secure'); //这里要注意, QQ发送邮件使用的ssl方式,如果不设置, 则会失败! 请认真查看下面的配置文件!!!
//smtp需要鉴权 这个必须是true
$mail->SMTPAuth=true;
//链接qq域名邮箱的服务器地址
$mail->Host = C('email_config.host');
//设置ssl连接smtp服务器的远程服务器端口号 可选465或587
$mail->Port = C('email_config.port');
//smtp登录的账号 这里填入字符串格式的qq号即可
$mail->Username =C('email_config.username');
//smtp登录的密码 这里填入“独立密码” 若为设置“独立密码”则填入登录qq的密码 建议设置“独立密码”
$mail->Password = C('email_config.psw');
//设置发件人邮箱地址 这里填入上述提到的“发件人邮箱”
$mail->From = C('email_config.From');
//设置发件人姓名(昵称) 任意内容,显示在收件人邮件的发件人邮箱地址前的发件人姓名
$mail->FromName = C('email_config.FromName');
//设置发送的邮件的编码 可选GB2312 我喜欢utf-8 据说utf8在某些客户端收信下会乱码
$mail->CharSet = 'UTF-8';
//邮件正文是否为html编码 注意此处是一个方法 不再是属性 true或false
$mail->isHTML(true);
//设置收件人邮箱地址 该方法有两个参数 第一个参数为收件人邮箱地址 第二参数为给该地址设置的昵称 不同的邮箱系统会自动进行处理变动 这里第二个参数的意义不大
// 添加收件人地址,可以多次使用来添加多个收件人
if(is_array($toemail)){
foreach($toemail as $to_email){
$mail->AddAddress($to_email);
}
}else{
$mail->AddAddress($toemail);
}
//添加该邮件的主题
$mail->Subject = $subject;
//添加邮件正文 上方将isHTML设置成了true,则可以是完整的html字符串 如:使用file_get_contents函数读取本地的html文件
$mail->Body = $body;
//为该邮件添加附件 该方法也有两个参数 第一个参数为附件存放的目录(相对目录、或绝对目录均可) 第二参数为在邮件附件中该附件的名称
//$mail->addAttachment('./d.jpg','mm.jpg');
//同样该方法可以多次调用 上传多个附件
//$mail->addAttachment('./Jlib-1.1.0.js','Jlib.js');
//dump($mail);exit;
//发送命令 返回布尔值
//PS:经过测试,要是收件人不存在,若不出现错误依然返回true 也就是说在发送之前 自己需要些方法实现检测该邮箱是否真实有效
$status = $mail->send();
//简单的判断与提示信息
if($status) {
//echo 'success';
return true;
}else{
//dump($mail->ErrorInfo);
return false;
}
} 里面的配置,我写在了config文件中,大家可以参考: //email发信设置 可以在后台进行设置
'email_config' => array(
'secure' => 'ssl', //链接加密方式 Options: "", "ssl" or "tls"; 为空时, 端口一般是25; ssl , 端口一般为 465 ;
'host' => 'smtp.qq.com', //SMTP 服务器
'port' => '465', //SMTP 端口, 一般为25, QQ为465或587
'username' =>'请填写你自己的', //邮箱帐号
'psw' => '请填写你自己的', //邮箱密码 QQ使用SMTP授权码 uwrfbgqqfodjfaea
'From' => '请填写你自己的', //发件人地址
'FromName' => '请填写你自己的', //发件人姓名
),调用就很简单了, 如:send_email('要发送的email', '标题', '邮件正文');
四、总结几个成功的关键点,也是网上其他文章没有的地方(我用的是QQ邮箱发送邮件)
1、php必须开启:php_openssl
2、$mail->SMTPSecure = C('email_config.secure');//如果是QQ邮箱,必须设置为 ssl ; 并且下面的端口, 同步设置为 465 ; 否则一定不成功!
3、登陆的邮箱密码,不是QQ密码,而是“授权码”

五、关于作者
我正在以Thinkphp3.2.3为核心框架,开发一套CMS系统,主要包括以下功能:
1、基本CMS功能
自定义内容模型、自定义表单(拖拽式动态生成表单、自定义字段式生成表单两个模式)自定义会员模型、完善的后台权限控制、插件机制等基础模块;功能方面,参考过OneThink,但比OneThink强一些,自定义方面更加灵活;
2、万能采集模块(智能采集、后台运行、可视化规则编辑、私密SEO伪原创算法),理论上支持任意CMS系统,即:可以入库其他CMS系统,只需要添加合适的接口即可。
3、集成微信公众号管理(多帐号)
将电脑版文章数据,可选择将精华部分同步推送至微信公众号;其他公众号的基本管理,功能部分参考过WeiPHP系统,但是仅仅是参考功能而已,代码完全不一样。
4、同步生成手机版(WAP)
5、整个系统采用了Bootstrap作为前端框架,后台采用Thinkphp3.23(二次开发了几个文件)
系统还没有全部完成(完成了大概80%),借此机会,也发出一个请求:希望有技术,有兴趣的朋友,参与进来,一起把系统做的更加完善!
有兴趣的请加我的QQ:1668142999 TEL:13884867561
我用我自己开发的系统,已经完成了一个项目,大家可以稍微参考下,因为是政府站,后台部分无法开放体验,还请见谅。http://www.dysajj.gov.cn
