PHP: помощь по почте PEAR

Я попробовал пакет почтовых груш. Он успешно отправляет электронное письмо, но дает мне следующую ошибку:

Strict Standards: Non-static method Mail::factory() should not be called statically, assuming $this from incompatible context in C:\Program Files (x86)\Apache Software Foundation\Apache2.2\htdocs\ClientPortal\classes\SupportTickets.php on line 356

Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Mail\smtp.php on line 365

Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 386

Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 391

Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 398

Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 441

Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 230

Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 445

Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Mail\smtp.php on line 376

Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 526

Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 230

Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 529

Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 532

Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 441

Strict Standards: Non-static method PEAR::isError() should not be called statically,  assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 230

Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 445

Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 550

Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 694

Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 230

Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 698

Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 706


Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 230

Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 1017

Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 415

Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 230


Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\Program Files (x86)\Apache Software Foundation\Apache2.2\htdocs\ClientPortal\classes\SupportTickets.php on line 364
Message successfully sent!

Здесь мой код:

function submitTicket(){

     $from = "Billy Jones <[email protected]>";
     $to = "helpdesk <[email protected]>";
     $subject = "Email Test!";
     $body = "email test body";

     $host = "***";
     $username = "***";
     $password = "**********";

     $headers = array ('From' => $from,
       'To' => $to,
       'Subject' => $subject);
     $smtp = Mail::factory('smtp',
       array ('host' => $host,
         'auth' => true,
         'username' => $username,
         'password' => $password));

     $mail = $smtp->send($to, $headers, $body);

     if (PEAR::isError($mail)) {
       echo("<p>" . $mail->getMessage() . "</p>");
      } else {
       echo("<p>Message successfully sent!</p>");
      }

}

Может кто-нибудь помочь мне здесь?

Ответ 1

Я задал тот же вопрос и нашел реальное решение (вместо ошибок маскировки). Прочтите ответ на вопрос ниже для получения более подробной информации, но в основном просто следуйте трем изменениям ниже.

Как не вызвать функцию статически в php?


Найдите php/pear/Mail.php, перейдите к строке 74 и измените:

function &factory($driver, $params = array())

к

static function &factory($driver, $params = array())

Также в php/pear/Mail.php перейдите к строке 253 и измените:

$addresses = Mail_RFC822::parseAddressList($recipients, 'localhost', false);

к

$Mail_RFC822 = new Mail_RFC822();
$addresses = $Mail_RFC822->parseAddressList($recipients, 'localhost', false);

Найдите php/pear/PEAR.php, перейдите к строке 250 и измените:

function isError($data, $code = null)

к

static function isError($data, $code = null)

Спасибо за Amal за то, что вы указали, как это исправить!

Ответ 2

Строгие ошибки не мешают работе кода.

Просто установите настройку сообщения об ошибках на E_ALL & ~E_STRICT, и они волшебным образом исчезнут.

Ответ 3

@require_once "Mail.php";
$headers = array ('From' => $from,'To' => $to,'Subject' => $subject);
$smtp = @Mail::factory('smtp', array ('host' => $host,'port' => $port,'auth' => true,
        'username' => $UName,'password' => $UPass));

$mail = @$smtp->send($to, $headers, $body);

if (@PEAR::isError($mail))
{   echo("<p>".$mail->getMessage()."</p>"); }
else
{   echo("<p>Message successfully sent!</p>");  }

Посмотрите: я использовал знак @ перед некоторыми переменными и методами. И таким образом вы можете отправлять электронную почту с помощью php5. Это старый подход, но он должен работать. Хотя вас могут спросить о включении ssl в конфигурации, но это кусок пирога. Наслаждаться. И, конечно же, более полная, но последняя и отличная техника использует SwiftMailer.

Ответ 4

Начиная с PHP 5, вызов нестатического метода другого класса из нестатического метода другого класса ist verboten под E_STRICT. Когда был создан пакет PEAR_Mail, это был несколько неясный метапрограммный хак в PHP. Таким образом, PEAR_Mail печально известно об этом.

Метод PEAR::isError(), вероятно, должен был быть статическим методом, но он не является и предполагает контекст экземпляра с большим количеством $this. PEAR_Mail называет его статически в контексте своего собственного экземпляра, поэтому PHP указывает значение $this... Это все виды плохих новостей.

PEAR_Mail::factory() следует определять как static, но не по причинам, известным только оригинальным авторам. Он будет ВСЕГДА генерировать предупреждающее сообщение "нестатический метод" до тех пор, пока код не будет исправлен.

Примечание: PEAR_Mail не было затронуто с 2010 года. Пожалуйста, не используйте его...! Для альтернатив используйте Google, Luke!