我一直在使用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
Ser*_*min 15
在php中发送邮件不是一步到位的过程.mail()返回true/false,但即使返回true,也不意味着将要发送消息.所有mail()都将消息添加到队列中(使用sendmail或您在php.ini中设置的任何内容)
没有可靠的方法来检查消息是否已在php中发送.您将不得不查看邮件服务器日志.
就我而言,无论我做什么,我都无法在我的 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