PHP: ayuda de correo PEAR

9 minutos de lectura

avatar de usuario
iamjonesy

Estoy probando el paquete pera de correo. Envía con éxito un correo electrónico pero me da el siguiente error:

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!

Aquí está mi código:

function submitTicket(){

     $from = "Billy Jones <billy.jones@networkroi.co.uk>";
     $to = "helpdesk <helpdesk@networkroi.co.uk>";
     $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>");
      }

}

¿Puede alguien ayudarme aquí?

  • No estoy seguro, ya que normalmente instalé los paquetes PEAR manualmente, pero al menos el paquete Net_SMTP se puede encontrar aquí para la instalación manual: pera.php.net/package/Net_SMTP

    – Máx.

    28 de octubre de 2010 a las 16:27


  • gracias eso funciono! ¡pero ahora tengo diferentes errores aunque el correo electrónico se envió correctamente! he actualizado mi pregunta

    – iamjonesy

    28/10/2010 a las 16:30

  • ¿Se envía el correo electrónico? Parece que la firma del método de PEAR::isError carece del atributo estático, lo que significa que generará un error E_STRICT si se accede de forma estática a través de PEAR::isError. Puede actualizar su nivel de informe de error (ya sea en php.ini o en su script php usando ini_set) a E_ALL ^ ​​E_STRICT y ver si funciona.

    – Máx.

    28 de octubre de 2010 a las 17:11

  • Jeje, genial, debería haber escrito una respuesta a esto para recibir los puntos de repetición. 😉 Me alegro de que funcione. 🙂

    – Máx.

    29 de octubre de 2010 a las 17:13

  • Esto me ayudó, no cierre la pregunta, ya que estoy seguro de que ayudará a los futuros usuarios de Google con este error, Max debería hacer que su comentario sea una respuesta,

    –Doug Molineux

    23 de noviembre de 2011 a las 22:44

avatar de usuario
Arian Faurtosh

Hice la misma pregunta aquí y encontré una solución real (en lugar de enmascarar errores). Lea la respuesta a la pregunta a continuación para obtener más detalles, pero básicamente siga las tres ediciones a continuación.

¿Cómo no llamar a una función estáticamente en php?


Encontrar php/pear/Mail.phpvaya a la línea 74 y cambie:

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

a

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

También en php/pear/Mail.php vaya a la línea 253 y cambie:

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

a

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

Encontrar php/pear/PEAR.phpvaya a la línea 250 y cambie:

function isError($data, $code = null)

a

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

¡Gracias por Amal por mostrar cómo solucionar esto!

  • @ekerner Es gracioso que digas que… la raíz del problema es la pera. Movieron su repositorio a github y abandonaron la biblioteca del sitio web. La versión actualizada de Pear es exactamente estos cambios, línea por línea. Entonces, si terminas actualizando Pear, estos cambios se mantendrán. Para algunas personas es más fácil hacer unas pocas líneas de edición que actualizar un sistema antiguo completo. Además, pera ha sido abandonada por compresor y otras librerías que hacen un trabajo mucho mejor.

    – Arian Faurtosh

    26 de julio de 2014 a las 15:53


  • @Arian Justo lo suficiente, buen argumento. Aunque si estas ediciones están en la última actualización, sugeriría simplemente actualizar PEAR.

    – ekerner

    27 de julio de 2014 a las 15:18

  • @MarcF No realmente, usé PHP 5.5.12 pero todavía tengo este problema también

    – sk juli kaká

    21 de agosto de 2014 a las 8:31

  • @skjulikaka Creo que MarcF quiso decir que esta solución funciona para PHP 5.5, no que este problema esté solucionado.

    – Arian Faurtosh

    25 de agosto de 2014 a las 1:05

  • He instalado mail en pear, pero no encuentro PEAR.php, ¿dónde está? dios mío

    – andrefadila

    26 de julio de 2015 a las 14:55

avatar de usuario
cweiske

Los errores estrictos no impiden que el código funcione.

Simplemente establezca la configuración de informe de errores en E_ALL & ~E_STRICT y desaparecerán mágicamente.

  • ¿Se supone que esto funciona con php 5.3 y 5.4? En PHP 5.4 E_STRICT es parte de E_ALL. Estoy usando 5.3.9 y los mensajes de error estrictos no se suprimen cuando se usa error_reporting (E_ALL ^ ​​E_STRICT). ¿Es seguro usarlo de todos modos?

    -Nicsoft

    10 de marzo de 2012 a las 12:15

  • Estoy confundido por esta respuesta. Por alguna razón cuando suprimí el error. No enviaría el correo electrónico. ¿Algunas ideas?

    – RichardW11

    18 de abril de 2012 a las 15:43


  • El mismo problema que RichardW11, la supresión de errores detiene el envío del correo electrónico…. 🙁 Si tan solo hubiera una respuesta real para esta pregunta

    – Coomie

    16 de julio de 2012 a las 3:19

  • Siento que debería haber una mejor respuesta que esta, ¿se supone que el paquete de correo genera estos errores? ¿No sería mejor simplemente llamarlo no estático?

    – vadear

    29/04/2013 a las 18:25

  • Esto es tan bueno como decir “¡Apague la computadora, entonces nunca verá errores de ningún tipo!”

    – Error de sintaxis

    19 de diciembre de 2014 a las 2:11

avatar de usuario
Abdul Jabbar

@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>");  }

Mira: yo usé el @ firme antes de algunas de las variables y métodos. Y de esta manera puedes enviar correos electrónicos usando php5. Este es un enfoque antiguo, pero debería funcionar. Aunque es posible que se le pregunte acerca de habilitar ssl en la configuración, pero eso es pan comido. Disfrutar. Y, por supuesto, la última y gran técnica alternativa es usar SwiftMailer .

  • Solo funcionaría si no tiene un controlador de errores configurado así set_error_handler(function... si lo tienes restauralo asi restore_error_handler(); y luego llamar a las funciones problemáticas

    – Yevgeniy Afanasyev

    1 de febrero de 2018 a las 0:00

A partir de PHP 5, llamar a un método no estático de otra clase desde dentro del método no estático de otro la clase está prohibida bajo E_STRICT. Cuando el PEAR_Mail fue creado, este fue un truco de metaprogramación algo oscuro en PHP. De este modo PEAR_Mail es notorio por esto.

El método PEAR::isError() probablemente debería ha sido un método estático, pero no lo es y asume un contexto de instancia con muchos $this lanzado alrededor. PEAR_Mail lo llama estáticamente dentro de su propio contexto de instancia, por lo que PHP infiere el valor de $this… Que es todo tipo de malas noticias.

PEAR_Mail::factory() debería definirse como static pero no es por razones conocidas solo por los autores originales. Va a SIEMPRE generar ese mensaje de advertencia de “método no estático” hasta que se parchee el código.

Nota: PEAR_Mail no se ha tocado desde 2010. ¡Por favor, no lo use…! Para alternativas, usa Google, Luke!

¿Ha sido útil esta solución?