• 将PHPMailer整合到ThinkPHP 3.2 中实现SMTP发送邮件


    本内容转载出处:http://my.oschina.net/BearCatYN/blog/299192 并对以下内容做了一处说明。

    ThinkPHP没有邮件发送的功能,于是,我就想了想,就将PHPMailer整合到ThinkPHP中吧。

    PHPMailer是不符合ThinkPHP规范的插件程序,所以,我们需要先将PHPMailer程序放到ThinkPHP的 Library/Vendor目录下,我这里是最新版的ThinkPHP 3.2,如果是是ThinkPHP 3.2之前的版本,可能就是Lib目录了。Vendor目录专门用于存放非标准ThinkPHP插件的目录,如下:

    PHPMailer整合到ThinkPHP中的存放目录

    接下来为了方便发送邮件,我们可以定义一个专门发送邮件的函数sendMail(),这个函数可以只接受邮件发送的最基本的参数,发送到哪个邮 箱$id,邮件的主题$subject,邮件的内容$content。不过为了方便我们修改SMTP邮件发送服务器,我们先在config.php文件中 定义好邮件发送服务器,内容如下:

    config.php

     1 <?php
     2 return array(   
     3     // 配置邮件发送服务器
     4     'MAIL_SMTP'                     =>TRUE,
     5     'MAIL_HOST'                     =>'邮件发送SMTP服务器',
     6     'MAIL_SMTPAUTH'                 =>TRUE,
     7     'MAIL_USERNAME'                 =>'SMTP服务器登陆用户名',
     8     'MAIL_PASSWORD'                 =>'SMTP服务器登陆密码',
     9     'MAIL_SECURE'                   =>'tls', //注此功能需要在php.ini文件中开启extension=php_openssl.dll功能支持(本人在这里吃了一个亏)
    10     'MAIL_CHARSET'                  =>'utf-8',
    11     'MAIL_ISHTML'                   =>TRUE,
    12 );
    13 ?>

    具体的配置可以根据自己的需要添加。根据PHPMailer的规则自己定义就可以了,然后再在定义函数中使用大C(‘CONF_NAME’)方法来调用就可以了。

    再接下来就需要在common文件夹下的function.php文件中定义邮件发送函数sendMail(),如果function.php文件 不存在的话新建一个就可以了。而且这个function.php文件中的方法可以在全局使用,不需要先引入function.php文件。

    在方法中需要引入PHPMailer时,不是通过import关键字来实现的,而是通过公共方法vendor()方法来实现的。具体内容如下:

    view source

     1 <?php
     2 /**
     3  * 邮件发送函数
     4  */
     5 function sendMail($to, $subject, $content) {
     6     vendor('PHPMailer.class#PHPMailer');
     7     $mail = new PHPMailer();
     8     // 装配邮件服务器
     9     if (C('MAIL_SMTP')) {
    10         $mail->IsSMTP();
    11     }
    12     $mail->Host = C('MAIL_HOST');
    13     $mail->SMTPAuth = C('MAIL_SMTPAUTH');
    14     $mail->Username = C('MAIL_USERNAME');
    15     $mail->Password = C('MAIL_PASSWORD');
    16     $mail->SMTPSecure = C('MAIL_SECURE');
    17     $mail->CharSet = C('MAIL_CHARSET');
    18     // 装配邮件头信息
    19     $mail->From = C('MAIL_USERNAME');
    20     $mail->AddAddress($to);
    21     $mail->FromName = '憨豆儿笑园';
    22     $mail->IsHTML(C('MAIL_ISHTML'));
    23     // 装配邮件正文信息
    24     $mail->Subject = $subject;
    25     $mail->Body = $content;
    26     // 发送邮件
    27     if (!$mail->Send()) {
    28         return FALSE;
    29     } else {
    30         return TRUE;
    31     }
    32 }
    33 ?>

    到这一步,我们已经将PHPMailer整合到了ThinkPHP中了,现在可以在程序中任何地方使用sendMail()方法就行了,不需要引入function.php文件,因为ThinkPHP会自动到这个文件中寻找。

    ThinkPHP 3.2中vendor()方法的深入研究及PHPMailer的正确扩展

    当我们想在ThinkPHP中引入第三方扩展,而第三方扩展又没有按照ThinkPHP的规范在编写的时候时,就需要将第三方扩展放置到Library/Vendor目录下,当然,这是针对ThinkPHP 3.2而言,低版本则根据情况来看了。

    然后需要在Controller或function中使用第三方扩展时,就可以直接使用vendor()方法来进行引用了。

    不过当我将PHPMailer放在Vendor目录下后(具体可以参考前面的一篇博客:http://www.xcoder.cn/index.php/archives/889),在本机运行得好好得,最近将程序上传到服务器上时,直接提示

    Class ‘PHPMailer’ not found

    然后又在本机运行,还是正确!通过前面这片博客可以知道,我是通过

    vendor('PHPMailer.class#PHPMailer');

    这行代码将PHPMailer引入的。既然提示找不到PHPMailer类,说明没有被正确引入。这是为什么呢?就粗略看了一下vendor()方 法的源码,这才发现其实vendor()方法也就是对import()方法进行了一次参数组装,然后还是交给了import()方法处理。

    查看import()方法的源码又发现,在import()方法中,对于上面传入参数的解析其实就是将’.’替换成’/’,将’#’替换成 了’.’,baseurl则由vendor()方法自动补充上了,指向Vendor目录。所以上面vendor()方法中的参数最终还是被解析成了如下目 录:

    Library/Vendor/PHPMailer/class.PHPMailer.php

    而PHPMailer的入口文件的实际目录地址为:

    Library/Vendor/phpmailer/class.phpmailer.php

    内容都一样的嘛!不过我用的是Linux的服务器,所以对大小写是严格区分的,这样当然不能成功导入这个类。而解决办法就是将vendor()引入改为:

    vendor(‘phpmailer.class#phpmailer’)

    另外对于PHPMailer使用时还要注意一点,PHPMailer如果使用SMTP方式发送邮件,需要PHP对fsockopen的支持,所以我们需要修改php.ini中disable_functions中将fscokopen删除,否则会出现运行错误:

    fsockopen() has been disabled

    通过PHPMailer的ErrorInfo属性可以获取到!

  • 相关阅读:
    18.centos7基础学习与积累-004-分区理论
    绑定省份到select控件
    c#编写1-2+3-4……m
    在写按时间段查询的sql语句的时候 一般我们会这么写查询条件:
    二进制移位运算
    构造datatable临时数据
    svn代表四种检出深度
    关于TTS SpeechVoiceSpeakFlags几个值的中文意思?
    user32.dll中的所有函数
    xaml 微软帮助 url
  • 原文地址:https://www.cnblogs.com/cnxiaol/p/5625354.html
Copyright © 2020-2023  润新知