我具有以下邮件发送功能:
function SendMailUtf8($to, $subject, $message) {
require_once "Mail.php";
$from = "mydomain <myuser@mydomain.com>";
$host = "mydomain.com";
$username = "myuser";
$password = "mypassword";
$headers = array ('From' => $from, 'To' => $to, 'Content-Type' => 'text/html; charset=UTF-8', 'X-Mailer' => 'PHP/'.phpversion(), 'Reply-To' => 'myuser@mydomain.com', 'Subject' => '=?UTF-8?B?'.base64_encode($subject).'?=');
//this line is where the error is thrown
$smtp = Mail::factory('smtp', array ('host' => $host, 'auth' => true, 'username' => $username, 'password' => $password));
$mail = $smtp->send($to, $headers, $message);
if (PEAR::isError($mail)) {
return "Error: Mail not sent. Message: " . $mail->getMessage();
} else {
return "OK";
}
}
除了我已设置自己的错误处理功能的页面以外,此功能可以从任何地方正确调用而没有任何错误:
function Func_ErrorHandler($errno, $errstr, $errfile, $errline, array $errcontext) {
if (error_reporting() == 0) {
return false;
}
if ($errno > 0) {
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
}
,并显示以下错误消息:
带有消息“非静态方法Mail :: factory()的未捕获异常” ErrorException”不应被静态调用
失败的示例代码:
set_error_handler("Func_ErrorHandler");
$MAILto = "info@mydomain.com";
$MAILsubject = "subject";
$MAILmessage = "message";
$sRet = SendMailUtf8($MAILto, $MAILsubject, $MAILmessage);
如果我将set_error_handler("Func_ErrorHandler");
行注释掉,那没有问题。为什么会发生这种情况,我该如何解决?
谢谢。
编辑:Mail.php https://paste.ee/p/LOyBf
答案 0 :(得分:3)
您的错误处理程序正常工作。没问题。
非静态方法Mail :: factory()不应被静态调用
此消息表示发生STRICT级别错误。而且,如果您的错误报告设置排除了此级别的错误,您将看不到任何内容。例如,如果将error_reporting
设置为E_ALL & ~E_DEPRECATED & ~E_STRICT
,则将排除所有STRICT级别的错误。但是,您的错误处理程序会将所有错误转换为异常,因此,如果启用它,则您将STRICT级别的错误视为异常。
您有几种方法可以解决此问题:
1。确保使用软件包中的最新版本并更正文件(可能是其他类,而不是预期的类)。以前有这个问题,但是was fixed。
2。您可以创建对象并将该方法用作非静态
$mail = new Mail();
$mail->factory(/*some parameters*/);
3。您可以使用error control operator @
来抑制代码中的任何错误
$mail = @Mail::factory(/*some parameters*/)
但这是错误的方法,它会引起更多问题,因为所有错误都会被忽略。我添加了它以获取完整信息。
4。您可以configure the error handler忽略STRICT级别的错误
set_error_handler("Func_ErrorHandler", E_ALL & ~E_DEPRECATED & ~E_STRICT);