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

本文转载自:http://blog.csdn.net/faith306/article/details/8942228

这几天一直在写一个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服务器,不过这也只是我的猜想,如果大家还有什么想法,可以留言,一起讨论一下

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用 Akismet 来减少垃圾评论。了解我们如何处理您的评论数据