如何获取mail()函数的错误消息?

Roh*_*han 71 php email

我一直在使用PHP mail()函数.

如果邮件因任何原因没有发送,我想回复错误信息.我该怎么办?

就像是

$this_mail = mail('example@example.com', 'My Subject', $message);

if($this_mail) echo 'sent!';
else echo error_message;
Run Code Online (Sandbox Code Playgroud)

谢谢!

小智 108

返回false error_get_last()时可以使用mail().

$success = mail('example@example.com', 'My Subject', $message);
if (!$success) {
    $errorMessage = error_get_last()['message'];
}
Run Code Online (Sandbox Code Playgroud)

有了print_r(error_get_last()),你得到这样的东西:

[type] => 2
[message] => mail():无法连接到"xxxx"端口25的邮件服务器,验证php.ini中的"SMTP"和"smtp_port"设置或使用ini_set()
[file] = > C:\ www\X\X.php
[line] => 2

  • 我认为这仅在您使用 SMTP (Windows?) 时才有效。在 Linux 上,如果您使用“sendmail”,则“mail()”函数只返回该命令的退出状态:https://github.com/php/php-src/blob/PHP-5.6.25/ext/standard/ mail.c#L404 没有可靠的方法来获取错误消息。我试过这个脚本:https://gist.github.com/njam/a34ecd9ef195c37c8354ab58f7bfcc9b (5认同)
  • @ashleedawg - 我什至不知道这怎么得到这么多的赞成票。我从未见过 error_get_last() 与 php 的本机 mail() 函数一起使用。事实上,我只是勉强设置了一封错误的邮件,并再次尝试了一次,只是为了确定一下;我一无所获。 (5认同)

Ser*_*min 15

在php中发送邮件不是一步到位的过程.mail()返回true/false,但即使返回true,也不意味着将要发送消息.所有mail()都将消息添加到队列中(使用sendmail或您在php.ini中设置的任何内容)

没有可靠的方法来检查消息是否已在php中发送.您将不得不查看邮件服务器日志.

  • 邮件日志在哪里? (3认同)

Acc*_*t م 6

就我而言,无论我做什么,我都无法在我的 PHP 脚本中收到错误消息 ( error_get_last(), 或ini_set('display_errors',1);) 不显示错误消息

根据这篇文章

$mail 的返回值仅指您服务器的邮件系统是否接受了要传递的邮件,并且不会也不可能以任何方式知道您是否提供了有效的参数。例如,如果 sendmail 加载失败(例如,如果它没有正确安装),则返回值为 false,但如果 sendmail 加载正确但收件人地址不存在,则返回 true。

我确认了这一点,因为在尝试mail()在我的 PHP 脚本中使用失败后sendmail,我的机器上没有安装它,但是 php.ini 变量sendmail_path/usr/sbin/sendmail -t -i

1- 我从我的包管理器安装了 sendmail shell> dnf install sendmail

2-我开始了 shell> service sendmail start

3- 现在,如果任何 PHPmail()函数失败,我会sendmail/var/mail/目录下找到记录的程序错误。每个用户 1 个文件

例如,这个片段取自我的 /var/mail/root文件

The original message was received at Sun, 29 Jul 2018 22:37:51 +0200
from localhost [127.0.0.1]
   ----- The following addresses had permanent fatal errors -----
<no-one@errorerrorerrorerror51248562221e542.com>
    (reason: 550 Host unknown)
Run Code Online (Sandbox Code Playgroud)

我的系统是带有 apache2.4 和 PHP 7.2 的 linux Fedora 28


小智 5

没有与该mail()函数相关的错误消息。仅返回truefalse表示电子邮件是否被接受投递。不是最终是否送达,而是域名是否存在以及地址是否是格式有效的电子邮件地址。