邮件类phpmailer完美集成!(提供namespace和vendor版)

浏览:1866 最后更新:2017-05-26 12:53 分类:类库 关键字: phpmailer 邮件
最近在项目中使用发送邮件功能, 当然首选php中最优秀的PHPMailer了。下面说一下我的集成过程(ThinkPHP3.2.3为例,当然,其他版本的集成类似,只是调用方法不一样而已)【集成过程参考了网上的一些文章,如果使用最新版phpmailer,根据网上的文章,绝对成功不了!这也是我写这篇文章的主要目的,希望大家少走弯路,节约开发时间!作者:深蓝 主页:http://www.lanelead.com 公司:蓝锂网络】
一、准备
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
评论( 相关
后面还有条评论,点击查看>>