PHP mail()函数在web-host上不起作用

时间:2010-07-16 15:04:46

标签: php apache email apache-config

我在使用php mail()函数发送电子邮件时遇到问题。我知道我的PHP脚本有效,因为我在另一个网络托管公司有一个相同的副本,它在那里工作。

我认为这与网络托管公司本身有关。你们中的任何人都知道我需要做些什么才能让它发挥作用吗?我需要告诉他们安装吗?我认为他们正在使用Apache。

谢谢, 阿米特

为澄清起见,这是邮件脚本。

<?php

$to = 'my@email.com';
$subject = 'Contact from your website';

$message = 
'Below are details from the Contact Us Form ' . "\n\n" . 
'Name: ' . $_REQUEST['name'] . "\n\n" . 
'Telephone Number: ' . $_REQUEST['phone'] . "\n\n" . 
'E-mail address: ' . $_REQUEST['email'] . "\n\n" . 
'Comments: ' . $_REQUEST['comments'];

$email = $_REQUEST['email'];
$headers = 'From: ' . $email . "\r\n" .
            'Reply-To: ' . $email . "\r\n" .
          'X-Mailer: PHP/' . phpversion();
$headers .= "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type: text/plain; charset=ISO-8859-1";       

//SPAM CHECK
$str = $_REQUEST['spam'];
$strE = $_REQUEST['email'];

if( $str != "10" || $strE == "")
{
    echo "<div align='center' style='color:red'>One or more of the form fields were incorrect, you will be redirected to the contact page within 3 seconds.</div>";
?><meta http-equiv="refresh" content="3;URL=http://engineercreativity.com/samples/biz/contact"><!-- EDIT THIS -->

<?php   
} else {
    mail ($to, $subject, $message, $headers);
?>
<meta http-equiv="refresh" content="0;URL=http://engineercreativity.com/thankyou.html"> <!-- EDIT THIS AS WELL -->
<!--
<div class="text" align="center" style="text-align: center; color: green;">
<br/>
Thank you for contacting us!
<br/>
The message was succesfully sent!
</div>
-->
<?php
} 
?> 

5 个答案:

答案 0 :(得分:2)

您是否对邮件功能进行了任何检查?如果它成功执行它应该返回true - 知道这将有助于我们减少您可能没有收到邮件的其他可能原因,例如过滤器,服务器或smtp配置等。做类似的事情:

if (mail($to, $subject, $body, $header)) {
echo("<p>Message successfully sent!</p>");
} else {
echo("<p>Message delivery failed...</p>");
}

应该给你一个更好的主意,如果由于某种原因该功能不存在,应该彻底死亡。 Php的邮件功能在免费的网络主机上非常挑剔,因为它通常被滥用于垃圾邮件目的。

发布完整标题也可以帮助合法邮件通过垃圾邮件测试。

   $headers = "Return-path: <sendingemail@test.com>\n";
                $headers .= "Reply-to: <sendingemail@test.com>"."\n";
                $headers .= "Content-Type: text/html; charset=windows-1252\n";
                $headers .= "Content-Transfer-Encoding: 7bit\n";
                $headers .= "From: <sendingemail@test.com>\n";
                $headers .= "X-Priority: 3\n";
                $headers .= "MIME-Version: 1.0\n";
                $headers .= "Organization: My Organization\r\n"; 
                $headers .= "\n\n";

答案 1 :(得分:2)

如果是专用服务器,请确保安装了postFix Mail(http://www.postfix.org/

我今天遇到了这个错误,因为SMTP服务器不可用(我默认假设它,但不是)

答案 2 :(得分:1)

写一个非常简单的脚本,比如

<?php
mail('your_mail@example.com', 'test subject', 'test msg') or die('no mail()');
echo 'mail sent.';

执行它,并确保垃圾邮件过滤器没有捕获邮件(如果您负担得起,设置自己的域/ DNS服务器,netcat -l -p 25就足够了。)

如果不起作用,请与您的网络托管服务商的支持人员联系。他们有常见问题或任何其他文件吗?

答案 3 :(得分:1)

无论解决方案是什么,请检查mail()的输出。

最常见的解决方案

询问您的托管公司当前的网络托管服务商是否设置了SMTP以从您的脚本中继邮件。如果他们说“不”,那么他们可能有另一个SMTP主机供您使用,如smtp.example.com,或者您必须使用另一个SMTP中继(请与您当前的电子邮件提供商联系)。

<强>替代

您正在与之交谈的SMTP服务器可能无法理解您的脚本所说的内容。我已经看到过我的邮件脚本可以使用Postfix而不是qmail的情况。使用第三方电子邮件库很容易解决这个问题:那里有很多,但我最喜欢的是Flourish(http://flourishlib.com/docs/fEmail)。

答案 4 :(得分:0)

php的mail()函数,只会将你的邮件发送到垃圾邮件。而是使用SMTP php邮件程序功能。

为什么我们应该使用SMTP代替PHP mail():

SMTP 登录邮件服务器上的实际帐户,并通过SMTP将邮件发送到其他邮件服务器。如果邮件服务器配置正确,您的邮件将从邮件服务器上的实际帐户发送,并且不会被标记为垃圾邮件。

在大多数情况下,使用sendmail发送带有mail()函数的

邮件。没有进行身份验证,如果您在额外标头中使用“发件人:”,它几乎总是被标记为垃圾邮件。

这是因为如果你看一下gmail中的原始电子邮件文件,你会看到发送的标题。您实际上是从user@serverhostname.tld发送的,而不是像您告诉邮件功能那样的someone@example.com。 如果您使用SMTP并查看原始邮件,则电子邮件实际上是从someone@example.com发送的

您可以从以下网址下载SMTP课程:

  1. https://code.google.com/a/apache-extras.org/p/phpmailer/source/browse/trunk/class.smtp.php?r=170
  2. http://www.phpclasses.org/package/14-PHP-Sends-e-mail-messages-via-SMTP-protocol.html