尽管这个答案有一部分只适用于
mail()
函数本身,其中许多故障排除步骤可以应用于任何PHP邮件系统。
确保已启用错误报告并设置为报告所有错误
错误报告对于消除代码中的错误和PHP遇到的一般错误是必不可少的。需要启用错误报告才能接收这些错误。将以下代码放在PHP文件的顶部(或主配置文件中)将启用错误报告。
error_reporting(-1);
ini_set('display_errors', 'On');
set_error_handler("var_dump");
确保
这可能看起来很愚蠢,但一个常见的错误是忘记实际放置
邮件()
在代码中的函数。确保它在那里并且没有被注释掉。
确保
函数调用正确
bool mail(字符串$to,字符串$subject,字符串$message[,字符串$additional\u headers[,字符串$additional\u parameters]])
mail函数接受三个必需的参数,还可以选择第四个和第五个参数。如果你打电话给
邮件()
如果你打电话给
如果没有正确顺序的正确参数,它也将失败。
检查服务器的邮件日志
logs
. 里面将是服务器报告的错误消息,如果有的话,与您试图发送电子邮件有关。
检查端口连接故障
大多数主机提供商都会屏蔽这些电子邮件端口,以保护其网络不发送任何垃圾邮件。
端口25或587用于普通/TLS连接,端口465用于SSL连接。对于大多数用户,建议使用端口587以避免某些主机提供商设置的速率限制。
如果您的代码包含
@mail(...)
然后,您可能会隐藏重要的错误消息,这将有助于您调试。拆下
@
看看有没有报错。
检查
邮件()
返回值
退换商品
TRUE
FALSE
否则。重要的是要注意,仅仅因为邮件被接受交付,并不意味着邮件将实际到达预定的目的地。
如果你收到
返回值您知道错误在于服务器接受您的邮件。这可能不是编码问题,而是服务器配置问题。你需要和你的系统管理员谈谈,找出发生这种情况的原因。
如果你收到
返回值它并不意味着你的电子邮件一定会被发送。它是通过相应的PHP处理程序成功地发送到服务器上的。在PHP的控制之外还有更多的故障点会导致电子邮件无法发送。
错误的
真的
做
一定意味着你的邮件发送成功了。这一点值得注意!
许多共享网络主机,特别是免费网络主机提供商,要么不允许从他们的服务器发送电子邮件,要么限制在任何给定的时间段内可以发送的数量。这是由于他们努力限制垃圾邮件发送者利用他们更便宜的服务。
如果您认为您的主机有电子邮件限制或阻止发送电子邮件,请查看他们的常见问题,看看他们是否列出了任何此类限制。否则,您可能需要联系他们的支持,以验证是否有任何限制周围的电子邮件发送。
检查垃圾邮件文件夹;防止电子邮件被标记为垃圾邮件
通常情况下,由于各种原因,通过PHP(和其他服务器端编程语言)发送的电子邮件最终会出现在收件人的垃圾邮件文件夹中。在对代码进行故障排除之前,请始终检查那里。
为了避免通过PHP发送的邮件被发送到收件人的垃圾邮件文件夹中,您可以通过PHP代码和其他方式执行各种操作,以最大限度地减少电子邮件被标记为垃圾邮件的可能性。好提示来自
Michiel de Mare
使用电子邮件身份验证方法,例如
SPF
,和
DKIM
Check
reverse DNS
确保邮件服务器的IP地址指向用于发送邮件的域名。
确保回复地址是有效的现有地址。
在“收件人”字段中使用收件人的真实全名,而不仅仅是电子邮件地址(例如。
"John Smith"
监控你的虐待账户,比如滥用@yourdomain.com以及postmaster@yourdomain.com。这意味着-确保这些帐户存在,阅读发送给他们的内容,并对投诉采取行动。
最后,让它
很容易退订。否则,您的用户将按取消订阅
垃圾邮件
一些垃圾邮件软件会拒绝邮件,如果它缺少常见的标题,如“发件人”和“回复收件人”:
$headers = array("From: from@example.com",
"Reply-To: replyto@example.com",
"X-Mailer: PHP/" . PHP_VERSION
);
$headers = implode("\r\n", $headers);
mail($to, $subject, $message, $headers);
确保邮件头没有语法错误
无效的头和没有头一样糟糕。一个不正确的字符可能是所有需要脱轨您的电子邮件。仔细检查以确保语法正确无误
不
为您捕捉这些错误。
$headers = array("From from@example.com", // missing colon
"Reply To: replyto@example.com", // missing hyphen
"X-Mailer: "PHP"/" . PHP_VERSION // bad quotes
);
别用假货
From:
虽然邮件必须有发件人,但不能仅使用
价值观。特别是用户提供的发件人地址是阻止邮件的可靠方法:
$headers = array("From: $_POST[contactform_sender_email]"); // No!
原因:你的网站或发送邮件的服务器没有被列入SPF/DKIM白名单,假装对@hotmail或@gmail地址负责。它甚至可以悄悄地将邮件与
发件人:
确保收件人值正确
$to = 'user@example.com';
// other variables ....
mail($recipient, $subject, $message, $headers); // $recipient should be $to
另一种测试方法是将收件人值硬编码到
函数调用:
mail('user@example.com', $subject, $message, $headers);
这适用于所有
邮件()
参数。
发送到多个帐户
在不同的电子邮件提供商
. 如果您的电子邮件没有到达用户的Gmail帐户,请将相同的电子邮件发送到Yahoo帐户、Hotmail帐户和常规POP3帐户(如ISP提供的电子邮件帐户)。
如果电子邮件到达所有或部分其他电子邮件帐户,您知道您的代码正在发送电子邮件,但很可能是电子邮件帐户提供商出于某种原因阻止了它们。如果电子邮件没有到达任何电子邮件帐户,则问题更有可能与您的代码有关。
POST
$_POST
查找窗体值。如果你把它设置为
GET
或者根本没有设置,一定要使用
$_GET
查找窗体值。
确认你的状态
action
值指向正确的位置
确认你的状态
行动
确保Web主机支持发送电子邮件
一些网络托管提供商不允许或不允许通过其服务器发送电子邮件。原因可能会有所不同,但如果他们已禁用邮件发送,您将需要使用另一种方法,使用第三方为您发送这些电子邮件。
发送给他们的技术支持的电子邮件(在访问了他们的在线支持或常见问题解答之后)应说明您的服务器上是否提供了电子邮件功能。
确保
localhost
已配置邮件服务器
如果您正在本地工作站上使用WAMP、MAMP或XAMPP进行开发,则您的工作站上可能没有安装电子邮件服务器。如果没有,PHP默认情况下无法发送邮件。
您可以通过安装一个基本邮件服务器来克服这个问题。对于Windows,您可以使用免费的
Mercury Mail
启用PHP的自定义
mail.log
ini_set("mail.log", "/tmp/mail.log");
ini_set("mail.add_x_header", TRUE);
通过邮件测试服务进行检查
您可以使用各种传递和垃圾邮件检查服务来测试MTA/webserver设置。通常,您会将邮件探测发送到:他们的地址,然后获取传递报告和更具体的故障或分析:
邮件()
功能是方便的,往往能完成工作,但它
has its shortcomings
. 幸运的是,有一些替代方案提供了更多的功能和灵活性,包括处理上述许多问题:
所有这些都可以与专业的SMTP服务器/服务提供商结合使用。(因为在电子邮件设置/可配置性方面,典型的08/15共享网络托管计划是碰运气的。)