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

这几天一直在写一个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和 p fsockopen的区别,可以去PHP的官网查看,但是一般来说,不推荐 p fsockopen函数创建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服务器,不过这也只是我的猜想,如果大家还有什么想法,可以留言,一起讨论一下

你可能感兴趣的:(PHP,Linux,PHP,虚拟主机,邮件)