在美国godaddy虚拟主机上用php发邮件应该注意的问题
2013-05-17 22:58
323 查看
这几天一直在写一个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),在这篇日志里,说不需要发送邮件的邮箱账号和密码,但是经过我的测试,还是需要的,我的发送邮件部分的代码如下(只是截取了很小一部分,代码不能直接运行,请自行修改):
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服务器,不过这也只是我的猜想,如果大家还有什么想法,可以留言,一起讨论一下
相关文章推荐
- 选购美国虚拟主机需要注意的几个问题
- Linux Apache+Proftpd构建虚拟主机时要注意的几个安全问题
- 学习php应该注意哪些问题
- 美国虚拟主机类型介绍―世界上最流行的php虚拟主机
- php虚拟主机session失效/无法跨页传递问题解决
- 个人虚拟主机选择应该考虑的七个问题
- 天下数据总结个人博客选择虚拟主机该注意的问题
- PHP处理回车换行时应该注意的一个问题
- header("Location:login.php")应该注意的几个问题
- phpstudy 虚拟主机域名配置注意问题
- PHP中级篇 Apache配置httpd-vhosts虚拟主机总结及注意事项[OK]
- PHP中级篇 Apache配置httpd-vhosts虚拟主机总结及注意事项
- PHP中级篇 Apache配置httpd-vhosts虚拟主机总结及注意事项(转载)
- 关于发邮件的问题 JavaEE 5和 J2EE 1.4应该注意的问题
- php大文件上传时,应该注意的问题
- 选择虚拟主机应该考虑的七个问题
- 虚拟主机Web应用开发时应该注意到的安全问题
- PHP中级篇 Apache配置httpd-vhosts虚拟主机总结及注意事项[OK]
- PHP中级篇:Apache配置httpd-vhosts虚拟主机总结及注意事项【OK】
- 关于局域网电脑通过IP地址访问虚拟主机上的PHP WEB服务的问题