在美国godaddy虚拟主机上用php发邮件应该注意的问题

来源:互联网 发布:ubuntu windows 10 编辑:程序博客网 时间:2024/04/30 10:58
这几天一直在写一个php发送邮件的功能,在本机测试的时候一直很正常,但是放在服务器上测试的时候,就总提示Error: Could not connect to SMTP host.
首先说一下,我用的是phpmailer这个第三方的开源项目作为发邮件的基类,通过实例化PHPMailer对象采用SMTP协议来发送邮件。php发送邮件的原理是通过php向邮件服务器创建一个socket,然后再根据smtp协议传输邮箱账号、密码、要发送到的邮箱地址、抄送、主题、内容、附件等等,其实phpmailer还是很好用的。
刚开始出现这个问题的时候,上网查了,说是可能是Apache禁用了php创建socket用到的fsockopen函数被禁用了,可以换成pfsockopen函数,我换了之后,还是没用,后来我通过function_exists函数检测了一下,发现fsockopen并没有被禁用,这里推荐一篇日志,讲了这种情况的解决办法(http://bbs.tianya.cn/post-414-46078-1.shtml),至于fsockopen和pfsockopen的区别,可以去PHP的官网查看,但是一般来说,不推荐pfsockopen函数创建socket
之后我继续在网上找,发现了一个最有可能的问题,就是linux下的selinux安全机制,selinux在默认状态下,不会允许Apache创建一个连接外部服务器的socket,如果想要创建socket,必须要配置一下,或者要root权限才可以,这里推荐一篇日志,讲了这种情况的解决办法(http://hi.baidu.com/kinomn/item/e81fd5ee77a913245b2d6425),关于selinux的知识,也请自行Google。
现在说说我是怎么解决的。其实很简单,就是将代码中的SMTP服务器的地址,改成godaddy虚拟主机供应商自己的SMTP服务器即可(relay-hosting.secureserver.net)也是看了一篇日志才知道的,这里给出地址(http://www.melongda.com.cn/News/Staff_Blog/Web_Software_Development/show_83.html),在这篇日志里,说不需要发送邮件的邮箱账号和密码,但是经过我的测试,还是需要的,我的发送邮件部分的代码如下(只是截取了很小一部分,代码不能直接运行,请自行修改):
        $mail = new PHPMailer(TRUE);        //用SMTP协议发送        $mail -> IsSMTP();        try {            // 设置调试等级            // 1 = errors and messages            // 2 = messages only            //$mail -> SMTPDebug = 2;            // 是否启用SMTP认证            $mail -> SMTPAuth = TRUE;            //设置SMTP服务器            $mail -> Host = "relay-hosting.secureserver.net";            //发件邮箱地址            $mail -> Username = "****@****.com";            //发件邮箱密码            $mail -> Password = "*********";            //发件邮箱地址和名字            $mail -> SetFrom('****@****.com', 'SSSSS');            //回信地址            $mail -> AddReplyTo("****@****.com", "SSSSS");            //自动换行字符数            $mail -> WordWrap = 50;            //主题            $mail -> Subject = $subject;            //$mail -> AltBody = "To view the message, please use an HTML compatible email viewer!";            //邮件正文            $mail -> MsgHTML($message);            // 收件邮箱地址            $mail -> AddAddress($to_mail);            $mail -> Send();            //发送成功    echo "发送成功";        } catch (phpmailerException $e) {            echo "phpmailerException:" . $e -> errorMessage();            //Pretty error messages from PHPMailer        } catch (Exception $e) {            echo "Exception:" . $e -> getMessage();            //Boring error messages from anything else!        }
后来和项目组的同学还有老师讨论了一下,可能是因为godaddy虚拟主机供应商害怕遭受垃圾邮件的攻击,或者自己成为肉机,所以才要如此严格限制socket的安全,根据我的猜想,他们所做的邮件服务器可能起到的只是一个检查、转发作用,他们应该是在获得你提交的信息之后,通过你的发送邮件的邮箱账号,再将你提交给他的内容,提交给真正的发邮件的那个SMTP服务器,不过这也只是我的猜想,如果大家还有什么想法,可以留言,一起讨论一下

原创粉丝点击