【问题标题】:Form fails to send mail表单无法发送邮件
【发布时间】:2022-01-18 19:25:10
【问题描述】:

我正在尝试确定为什么我们没有收到来自我们网站表单的邮件。

我们托管公司的所有权发生了变化,表格停止工作,新管理层似乎一无所知。

我可以看到的文件中没有错误日志,也没有 php.ini 文件。这是phpinfo:http://www.fryermachine.com/phpinfo.php.

这是 mail() 代码...

    <?php

error_reporting(-1);
ini_set('display_errors', 'On');
set_error_handler("var_dump");

if ($_POST['submit']) {
$to = 'service@fryermachine.com';
//$to = 'brinster@digitmedia.com';
$subject = 'Support email from FryerMachine.com';
$message = "FIRST NAME: " . $_POST['First_Name'] . "\r\n" . "LAST NAME: " . $_POST['Last_Name'] . "\r\n" . "COMPANY: " . $_POST['Company'] . "\r\n" .  "PHONE: " . $_POST['Phone'] . "\r\n" . "EMAIL: " . $_POST['Email'] . "\r\n" .  "MODEL: " . $_POST['Model'] . "\r\n" . "SN: " . $_POST['SN'] . "\r\n" . "CONTROL: " . $_POST['Control'] . "\r\n" ."MESSAGE: " . $_POST['Message'] . "\r\n";

$headers = 'From: service@fryermachine.com';

if (!mail($to,$subject,$message,$headers)) {
echo "<p>There was a problem submitting your form.  Please <a href=\"mailto:info@fryermachine.com\">contact us</a>.</p>";
} else { 
echo "<div class=\"thanks\"><p>Thank you for your inquiry.  We will respond as soon as possible.</p></div>";
} ?>

使用这个...

    error_reporting(-1);
ini_set('display_errors', 'On');
set_error_handler("var_dump");

我得到这个输出。虽然我看到了表单的所有变量,但我没有看到任何错误。

Copyright © int(2) string(386) "date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone." string(42) "/virtual/home/fryer/public_html/footer.php" int(7) array(8) { ["_GET"]=> array(0) { } ["_POST"]=> array(11) { ["First_Name"]=> string(5) "Barry" ["Last_Name"]=> string(8) "Brinster" ["Company"]=> string(10) "Digitmedia" ["Phone"]=> string(10) "6093674793" ["Email"]=> string(23) "brinster@digitmedia.com" ["Model"]=> string(7) "3242342" ["SN"]=> string(5) "23232" ["Control"]=> string(4) "3232" ["Message"]=> string(4) "test" ["g-recaptcha-response"]=> string(484) "03AGdBq26aa_IGjWkjBx6AD-3vknIRZd953gdoDBunlELaN_OHWODA7SkGVHoqIlHUHFKnAvxUJMnLS0m4rHo0uiCWoCeo2f_IFF_Oe99OLEEMbLJqpPqfm6Fo2JQQOIP7M41LucLyMBiGgelN9Mk8hz8JP2ZUNOOzRcw5bjwh-0deSUm6jEbELYM29hAuO_G9h0rpoeA51cB4GF6hgVCsXmf2DUB_7Jz2W4Ir3RcBqtu2kBPlszfc9vODzRAgyE9p2t_Iaw4GjTQ6gTn5xEl4nDj7fYJNGKlpcK9s6472jbqeO_fHPxoufHWFk82yJqzzYfHYnBo5zgS1AZcgYuBPfLgoRhqtOS4U2XpxxYLp0_UPFMQEt73N3FbMACh6IqywJTCP7NVWBw7VGhpFBVhe6yXeYG8XTEMPCkXAIsf4yhKvIbOV0-aAld5_qWXEoFScm3H8fr1f1U61uAa48UYXVcIKIcaHvtJ0qA" ["submit"]=> string(6) "Submit" } ["_COOKIE"]=> array(3) { ["_ga"]=> string(27) "GA1.2.1114367905.1611002481" ["_gid"]=> string(27) "GA1.2.2097634062.1639520206" ["_gat_gtag_UA_80412166_1"]=> string(1) "1" } ["_FILES"]=> array(0) { } ["to"]=> string(24) "service@fryermachine.com" ["subject"]=> string(35) "Support email from FryerMachine.com" ["message"]=> string(169) "FIRST NAME: Barry LAST NAME: Brinster COMPANY: Digitmedia PHONE: 6093674793 EMAIL: brinster@digitmedia.com MODEL: 3242342 SN: 23232 CONTROL: 3232 MESSAGE: test " ["headers"]=> string(30) "From: service@fryermachine.com" } 2021 Fryer Machine Systems, Inc.

【问题讨论】:

标签: php sendmail


【解决方案1】:

编辑: 我发现this other SO post解释了许多可能的事情,这些事情肯定会补充和扩展我的答案: PHP mail function doesn't complete sending of e-mail


看起来您的服务器 MTA(邮件传输代理)正确接收邮件,但无法重新发送。所以你应该修复它添加一个正确的Return-path 邮件标题或检查主托管帐户收件箱。

简短说明:

为了获得 MTA 错误,您应该以这种方式使用第 5 个mail() 参数来设置正确的Return-path 邮件头:

mail($to,$subject,$message,$headers,'-fexample@email.com')

其中 example@email.com 应该是一个有效的电子邮件,其 MX dns 域记录设置在同一服务器中,以避免再次尝试将其重新发送到服务器之外,如果失败则保留在邮件队列中的几天循环,直到它可以被自动删除或重新发送到根服务器邮件帐户。

这可以帮助您正确接收 MTA 错误并了解报告的 MTA 错误并根据它们修复问题。

长解释:

尽管您设置了 error_reporting 和 display_errors 来显示 PHP 错误,但使用 mail() 却没有收到 PHP 错误,这是怎么回事?

嗯,这肯定意味着没有没有

那么,会发生什么?

mail() 函数能够正确地将其发送到 MTA 队列,然后您的 MTA 管理它尝试将其发送到邮件标头中设置的目标。

但是,如果您的 MTA 无法发送它,那么它会使用 Return-path 标头中设置的值将邮件返回给假定的发件人,并附上错误描述,这将有助于解决问题。

那么,他们现在在哪里?

在某些主机中,Return-path 标头会自动设置为 account@hostname,其中:

  • account:它是您的 linux 用户帐户的名称,也用于 /home/account,例如 myaccount(所以 /home/myaccount )
  • 主机名:服务器主机名,如vps007.hostingcompany.com

所以最终的Return-path 标头在此示例数据中将如下所示:

Return-path: <myacccount@vps007.hostingcompany.com>

该电子邮件的收件箱(在我们的示例中:myacccount@vps007.hostingcompany.com)通常根本不存在,但一些服务器会管理这些电子邮件,将它们重定向到主用户托管帐户的收件箱,将它们存储在那里,可以在 /home/myaccount/mail/new 中(例如在 cPanel 中)。

托管用户很少检查该收件箱,因为他们中的大多数人不知道它的存在或如何访问它。

因为邮件只存储在自己的 MTA 服务器上,并且主要用于发送与帐户相关的服务器错误消息,因此该文件夹占用的空间很少,并且长时间没有人注意到它。

例如,在 cPanel 中,您可以通过 webmail 轻松地通过其面板与他们联系。 (我真的不知道其他虚拟主机面板,但他们曾经做过类似的事情)。

在其他服务器中,所有这些电子邮件都可能以服务器根邮件收件箱结尾,如果您在共享主机中并且您的托管人员应该管理它们,则无法到达。

顺便说一句,如果您尝试将电子邮件从服务器外部发送到此类帐户电子邮件,例如 myacccount@vps007.hostingcompany.com,它们通常不会被 MTA 过滤器接受。

【讨论】:

    猜你喜欢
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    相关资源
    最近更新 更多