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í?
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.php
vaya 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.php
vaya 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
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
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 asirestore_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!
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