编辑

编辑

我刚刚在我的其中一台计算机上安装了新版 Ubuntu 14.04 Server。我安装了所有东西,让它像典型的 Web 服务器一样运行(包括 PHP)。我的问题是,我有一个用 PHP 编写的联系表单,正在我的网站上运行,其中有一个故障保护,以防提交表单时出现问题,而这正是正在发生的事情。该脚本在任何其他服务器上运行良好。但在我的服务器上,每次我尝试提交表单时,它都会转到我的消息失败函数。我碰巧认为这是我服务器上的 PHP 配置方式有问题。有什么想法吗?

如果有人想测试的话,下面是 PHP 脚本:

<?php
$field_name = trim($_POST['cf_name']);
$field_email = trim($_POST['cf_email']);
$field_subject = trim($_POST['cf_subject']);
$field_message = trim($_POST['cf_message']);

if (empty($field_name) && empty($field_email) && empty($field_subject) && empty($field_message) && !preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/", $field_email))
{
    ?>
    <script language="javascript" type="text/javascript">
        alert('One or more fields are invalid. Please fill out any empty fields and make sure your email address is valid.');
        window.location = 'contact.html';
    </script>
    <?php 
}

else if(empty($field_name))
{ 
    ?>
    <script language="javascript" type="text/javascript">
        alert('Please type in your name.');
        window.location = 'contact.html';
    </script>
    <?php
}

else if(empty($field_email))
{ 
    ?>
    <script language="javascript" type="text/javascript">
        alert('Please type an email address.');
        window.location = 'contact.html';
    </script>
    <?php
}

else if(empty($field_subject))
{
    ?>
    <script language="javascript" type="text/javascript">
        alert('Please type a subject.');
        window.location = 'contact.html';
    </script>
    <?php
}

else if(empty($field_message))
{ 
    ?>
    <script language="javascript" type="text/javascript">
        alert('Please type a message.');
        window.location = 'contact.html';
    </script>
    <?php
}

else if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/", $field_email))
{
    ?>
    <script language="javascript" type="text/javascript">
        alert('Please enter a valid email address.');
        window.location = 'contact.html';
    </script>
    <?php 
}

else
{
    $mail_to = '[email protected]';

    $subject = "New message from...";

    $body_message .= 'A message from a user of...'."\n\n";
    $body_message .= 'From: '.$field_name."\n";
    $body_message .= 'E-mail: '.$field_email."\n";
    $body_message .= 'Subject: '.$field_subject."\n";
    $body_message .= 'Message: '.$field_message;

    $headers = "From:";

    $mail_status = mail($mail_to, $subject, $body_message, $headers);

    if ($mail_status) { 
        ?>
        <script language="javascript" type="text/javascript">
            alert('Thanks for contacting me! I will respond as soon as possible.');
            window.location = 'contact.html';
        </script>
        <?php 
    } else { 
        ?>
        <!-- This is triggering every time I submit the form -->
        <script language="javascript" type="text/javascript">
            alert('Message failed. Please try again later.');
            window.location = 'contact.html';
        </script>
        <?php 
    }
} 
?>

编辑

托管方面一切运行良好。

答案1

您可以在这里查看 PHP mail() 失败状态的含义:

http://php.net/manual/en/function.mail.php

如果邮件成功接受并传送,则返回 TRUE,否则返回 FALSE。

返回值如果为 false 则表示该邮件未被您的 MTA 接受传送。

在本地 Linux 服务器上,如果您没有进行其他配置更改,PHP 可能会尝试使用该sendmail命令提交邮件。此命令由许多不同的 MTA 提供,例如 postfix 或经典 sendmail 本身。

如果您的 Ubuntu 仅进行了最小安装,则可能根本没有安装 MTA。否则,您可能有一个 MTA,但可能未配置为能够发送外发邮件。

或者,您的计算机可能没有端口 25 访问互联网。消费者级连接通常会阻止端口 25 上的传出连接,从而有效地阻止这些计算机发送传出电子邮件。


如果您不想在服务器上本地设置完整的邮件服务器 (MTA) 或者您的 ISP 政策禁止您这样做,您可以通过另一台服务器(例如您的 ISP 的服务器)中继邮件。

为此,您需要安装本地 MTA,但将其配置为仅通过另一台服务器中继所有外发邮件,而不是尝试直接传递它。

有各种轻量级 MTA,它们的存在只是为了弥合本地 sendmail 功能和远程 SMTP 服务器之间的差距,但最好安装一个具有适当排队功能的 MTA,如 postfix,即使您不会使用 postfix 的大多数功能。

如果您安装了 postfix,那么这相对容易,因为 Ubuntu 在安装时会为您提供一个菜单(如果您错过了菜单,您可以sudo dpkg-reconfigure postfix稍后使用它再次执行此操作,尽管这会问您更多问题)。您可能需要 Ubuntu 所称的“卫星主机”,并且您希望成为无邮件的最终目的地(例如,postfix 配置中的“mydestination”或“relay_domains”下没有任何内容,并使用“relayhost”来引用外部 SMTP 服务器)。

相关内容