PHP mail()函数返回false,但没有错误
我正在使用php的mail()函数进行电子邮件输入联系表单到相应人员的简单过程。奇怪的是,表单总是用来处理电子邮件,但有一天这一切都停止了,现在函数返回false,但根本没有提供任何错误。PHP mail()函数返回false,但没有错误
该网站位于共享主机。当被问及这一点,他们推荐我用的SMTP中继xx.xxx.x.xxx
纠正我,如果我错了,但邮件()函数没有提供规定的这样做呢?当然,主机需要配置正确的继电器吗?
我的问题是这样的:这似乎是一个错误的主机配置,或者它是我的代码?下面是我用的邮件代码示例:
$to = "[email protected]"; //to who?
$subject = "Website Contact: $mysubject";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "From: $fname<$email1>\r\n";
$headers .= "Reply-To: $email1\r\n";
$headers .= "Return-Path:$email1\r\n";
$headers .= "Content-Type: text/html; charset=UTF-8\r\n";
$headers .= "Content-Transfer-Encoding: quoted-printable\r\n";
$msg2 = nl2br($msg);
$send = mail($to, $subject, $msg2, $headers); //process mail
if(!$send):
//error stuff here
endif;
非常感谢, 西蒙
@eisberg - 我用这样的自定义错误处理程序:
//error handler function
function customError($errno, $errstr){
$err = "\n".date('Y-m-d H:m:s')." Error: [$errno] $errstr";
$fh = fopen("errlog.txt", 'a+');
fwrite($fh, $err);
fclose($fh);
}
set_error_handler("customError", E_ALL);
会那意味着我需要将set_error_handler("customError", E_ALL);
更改为set_error_handler("customError", -1);
?
听起来像你的主机禁用mail()
,你应该考虑使用SMTP发送邮件,一个好的PHP邮件类如SwiftMailer将允许你通过SMTP轻松发送邮件。
感谢您的有用资源。它肯定似乎是一个更好的方法,全面。至少我可以依靠客户端SMTP帐户的详细信息来反对依靠一个共享服务器,这是一个错误的地狱。再次感谢。 – SimonDowdles 2011-03-31 07:28:35
mail()函数返回false,但没有错误
欢迎PHP!
这似乎是一个错误的主机配置,或者它是我的代码?
谁知道? mail()
是一个黑盒,当出现问题时,您将无法找到有用的信息。
当被问及此,他们建议我使用SMTP中继...
事实上,你应该。仔细看看SwiftMailer,这是一个优秀的,全面的现代PHP邮件库,可以直接与SMTP服务器通信。它擅长构建MIME消息,就像你上面似乎一直苦苦思索的一样。
其他热门选项包括PEAR's Mail,Zend Framework's Zend_Mail,和经典的经典,PHPMailer。
+1推荐SwiftMailer,毫无疑问是最完整的PHP Mailer库,并且正在开发中! – ChrisR 2011-03-31 07:28:33
黑框黑,哈哈。 – 2011-03-31 07:30:45
SwiftMailer是我决定运行的,看看lib和docs,它和使用php的mail()函数一样简单! – SimonDowdles 2011-03-31 07:41:34
更可能是主机配置。我认为(但可能是错误的),mail()使用服务器邮件命令。因此,如果服务器上没有安装sendmail/postfix/ssmtp或其他MTA,则无法工作。
如果他们告诉你直接访问SMTP服务器,你应该使用另一个实现SMTP协议和Mail类的库来构建邮件并直接通过SMTP发送(在PEAR或Zend Framework PHP类中,你会发现它)
你应该看看邮件日志。他们持有答案。虽然你可能不得不与你的托管公司搏斗。
我们甚至不去那里,他们说“他们不能直接访问他们”,这意味着他们可能正在销售位于世界另一端的服务器上的主机空间,他们实际上不知道他们在做什么。 SMTP的方法将是。 – SimonDowdles 2011-03-31 07:36:27
@webfac在这种情况下,SMTP就好了:) – vbence 2011-03-31 07:52:51
检查是否允许网站通过从终端发送 getsebool httpd_can_sendmail
发送邮件。如果输出为
httpd_can_sendmail --> off
通过发出setsebool httpd_can_sendmail 1
命令给https发送邮件的权限。您必须拥有发行这些命令的root权限。
我有类似的问题,我的网站是由共享托管服务托管。我可以通过修复标题来找出问题。问题是:
$ headers。=“From:$ fname \ r \ n”;
您在from字段中使用了用户电子邮件。我的主机只接受带有此域的域名的电子邮件。所以我用它替换它:
$headers = "From: [email protected]" ."\r\n" ;
它解决了问题! PHP邮件()后,工作正常。
尝试** error_reporting(-1); **上面的代码。我希望你得到一个可用的消息。来源:http://php.net/manual/en/function.error-reporting.php – eisberg 2011-03-31 07:39:50
@eisberg - 我有一个自定义错误函数记录所有错误(E_ALL)文件,仍然没有!它挑起最挑剔的错误,但仍然没有任何邮件()相关。 – SimonDowdles 2011-03-31 07:47:45
'E_ALL'在所有PHP版本中都不是'-1':-) – eisberg 2011-03-31 07:50:47