• Publicidad

Can't call method "auth" on an undefined value

Aquí encontrarás todo lo que sea específicamente acerca de módulos de Perl. Ya sea que estás compartiendo tu módulo, un manual o simplemente tienes una duda acerca de alguno.

Can't call method "auth" on an undefined value

Notapor rqbit » 2014-02-05 18:39 @818

Buenas tardes...

He consultado este foro por mucho tiempo y siempre consigo las soluciones en él. Aunque no estaba registrado. nuestro amigo Google siempre te trae por acá.

Soy programador de Perl y tengo mi rutina de envío de correos de una form simple y precisa con autenticación usando el módulo
Net::SMTP::SSL.

Les puedo decir que me funciona a la perfección tanto autenticando y enviando correos desde mi servidor personal usando como transporte a Gmail o usando el host de mi proveedor de servicio de hospedaje. Repito y recalco que la rutina funciona perfecto corriendo en mi servidor personal.

El problema se traduce al momento de llevar la rutina al servidor donde está alojado el sistema que estoy desarrollando. Es un servidor donde el cliente adquirió su hospedaje.

Al momento de intentar correr la rutina desde el servidor se produce el siguiente error:

Can't call method "auth" on an undefined value

y no envía el correo ni usando el servidor de Gmail o el servidor del propio ISP. Contactando al servicio de soporte del servidor de hospedaje el mismo indica que todo está bien pero yo sigo sin poder usar la rutina.

He leído infinidad de temas pero ninguno da con mi problema, que como indico funciona en mi servidor personal pero al colocarlo en el servidor del cliente da ese error.

He leído mucho las indicaciones del usuario explorer y siempre ha dado con muchas soluciones, espero me oriente al respecto o cualquier otro miembro del foro y lo agradecería.

Gracias
rqbit
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2014-02-05 18:10 @799

Publicidad

Re: Can't call method "auth" on an undefined value

Notapor explorer » 2014-02-05 19:36 @858

Bienvenido a los foros de Perl en Español, rqbit.

No muestras el código, pero el problema que indicas es muy común.

El error se produce porque llamas a la función o método donde vas a autenticarte, pero resulta que la variable que almacenaría el objeto Net::SMTP que creaste unas líneas antes, no contiene nada. Mejor dicho, contendrá el valor 'undef'.

Y eso es porque en el momento de la conexión, Net::SMTP no ha podido realizarla, y devuelve un 'undef' para indicar esa circunstancia.

Debes modificar el código para contemplar ese caso:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $smtp = Net::SMTP->new('servidor.com', Port=> 25, Debug=>1);
  2.  
  3. die "ERROR: Fallo en la conexión" if not $smtp;                    # salimos si algo salió mal
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Además, hemos puesto la opción 'Debug => 1', con lo que se activa la depuración. Net::SMTP escupirá en la salida estándar mensajes con la actividad (lo que está haciendo) para conectarse al servidor. Con suerte, verás en qué paso y por qué se no es posible la conexión.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Can't call method "auth" on an undefined value

Notapor rqbit » 2014-02-05 19:56 @872

¡¡¡Hola, explorer!!! Gracias por responder.

El código que funciona en mi servidor es este:

!/usr/bin/perl
use warnings;
use strict;
use DBI;
use CGI;
use Net::SMTP::SSL;

my $cgi=new CGI;

my $asunto_msg = $cgi->param('Asunto');
my $cuerpo_msg = $cgi->param('msg');
my $de_quien = $cgi->param('Nombre');
my $a_mail = $cgi->param('Email');


my $asunto = $de_quien.' ha contactado a Cresco';
my $user = '[email protected]';
my $pass = '********';
my $server = 'casiquiare.tepuyserver.net';
my $to = '[email protected]';
my $from_email = 'Webmaster Cresco <[email protected]>';
my $subject = $de_quien.' ha contactado a Cresco';
my $smtps = Net::SMTP::SSL->new($server, Port => 465, DEBUG => 1, )
or warn "$!\n";

# authenticate
defined ($smtps->auth($user, $pass))
or die "No puede Autenticar: $!\n";

# Envia data Preliminar
$smtps->mail("$from_email\n");
$smtps->to("$to\n");
#$smtps->cc("$toc\n");
$smtps->data();

#Envia Encabezado
$smtps->datasend("From: $from_email\n");
$smtps->datasend("To: $to\n");
$smtps->datasend("Subject: $asunto\n");
$smtps->datasend("Reply-To: $a_mail\n");
$smtps->datasend("MIME-Version: 1.0\n");
$smtps->datasend("Content-Type: text/html\n");
$smtps->datasend("\n");

$smtps->datasend("<strong>Enviado por: </strong> $de_quien <p> <strong>Titulo del Mensaje: </strong> $asunto_msg <p> $cuerpo_msg");
$smtps->datasend("\n");
$smtps->dataend();
$smtps->quit();

Esta rutina envía perfectamente colocando el servidor que está allí donde está alojada la rutina, pero desde mi servidor al pasar la rutina al servidor es el error indicado.


De antemano, muchas gracias por tu atención.
rqbit
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2014-02-05 18:10 @799

Re: Can't call method "auth" on an undefined value

Notapor explorer » 2014-02-05 20:08 @881

Debes cambiar DEBUG por Debug. Y ejecutarlo desde la línea de comandos o ver lo que sale en el registro de actividad log del servidor web. Como es un CGI, usa CGI::Carp para que los errores salgan en la página web.

El código, en sí, no tiene problemas (te funciona en otro sitio). El problema es saber por qué el servidor de correo no deja conectarse con tu programa.

Con la opción de depurado verás qué es lo que pasa. Deberás ver en pantalla salidas parecidas a las que salen al final de este hilo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Can't call method "auth" on an undefined value

Notapor rqbit » 2014-02-05 20:51 @910

Amigo explorer...

Se generó un archivo cgiemail. Te copio algo del contenido:
Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. REQUEST_METHOD400 REQUEST_METHOD not set.GETQUERY_STRING400 REQUEST_METHOD is GET, but QUERY_STRING is not set.CONTENT_LENGTH503 Couldn't allocate %d bytes of memory.SCRIPT_NAMEcgiemail%s: read() returned 0.
  2. 400 Could not read form input.PATH_TRANSLATED%a, %d %b %Y %H:%M:%S %Z%x400 Exceeded %d fields.cgierrmsgcgierrinfocgirelease1.6cgidatesource=    %s
  3. maxstorage=     %d
  4. maxfields=      %d
  5. nfields=        %d
  6. Field %s=       %s
  7. &amp;&lt;&gt;&quot;%c%%%02x%H%U - r500 Could not open templateTemplate filename hidden for security reasons500 Could not open temporary file./tmp500 Empty template file%required400 Required field left blank403 Variable Name too long...403 Format String too long403 No variable substitutions in template -oi -t/usr/local/cpanel/bin/sendmailcgiemail-mailoptsync -odi -f w500 Could not open sendmail pipeREMOTE_HOSTREMOTE_ADDRReceived: from SERVER_NAME by  with HTTP;
  8.         X-Mailer: cgiemail HTTP_REFERER
  9.         (form="")
  10.         (action="PATH_INFO")
  11. 500 sendmail exit %d - check httpd error logs500 sendmail exit %d with error messagefailure:/Content-Type: text/html
  12.  
  13. Content-Type: text/html
  14. Status: %s
  15.  
  16. <HEAD><TITLE>Error</TITLE></HEAD><BODY><H1>Error</H1>%s<P><BLOCKQUOTE><STRONG><SAMP></SAMP></STRONG><P><PRE></PRE></BLOCKQUOTE>addendum<P><EM>cgiemail </EM></BODY>Location: %s
  17.  
  18. success<HEAD><TITLE>Success</TITLE></HEAD><BODY>%s<P><HR>debug-source<HR></PRE><P>http://web.mit.edu/wwwdev/cgiemail/nopath.htmlNo email was sent due to an error.The following email message was sent.Form was not processed due to an error.Processed form looks like this:incoming.txt500 Could not stat file500 File is symbolic link500 File is hard linka500 Write to file failed500 Could not append file500 No write access to fileThe following information was written:/var/cpanel/cgiemail-disabledContent-Type: text/html
  19. Status: 403
  20.  
  21. <html>
  22. <head><title>CGIEcho disabled</title></head>
  23. <body>CGIEmail is disabled on this system</body>;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Me pregunto, por parte del ISP, ¿es posible que algún módulo no esté instalado?

Al no poder llamar a auth(), ¿será que no lo consigue en niguna parte?

Es probable que el módulo padre Net::SMTP no esté instalado?

¿Qué me dices?

Gracias
rqbit
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2014-02-05 18:10 @799

Re: Can't call method "auth" on an undefined value

Notapor explorer » 2014-02-06 06:29 @312

Eso que sale no tiene nada que ver con el tema... hace referencia a cgiemail, que debe ser un CGI que viene preinstalado en el alojamiento que tienes contratado. Pero no es el nombre de tu formulario, ¿no?

Hay una forma de saber si ese módulo está instalado o no.

Puedes hacer la prueba siguiente: sube al servidor mi CGI mínimo y lo pruebas. Si sale correcto, funciona bien el servicio CGI. Luego, lo modificas para agregarle una línea así:

use Net::SMTP;

Y lo vuelves a probar. Si no sale ningún error, es que sí está instalado.

Lo mismo vale para cualquier otro módulo.

A propósito... si tu proveedor de alojamiento te da un programa ya hecho, pues puedes aprovecharlo :)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Can't call method "auth" on an undefined value

Notapor rqbit » 2014-02-06 09:40 @444

Buenos días...

Gracias, explorer.

Tienes razón con lo del cgiemail: no tiene nada que ver, no sé por qué se generó en ese directorio.

Probé tu rutina mínimo, y sí funciona bien; sí está instalado y cualquiera de los módulos que utiliza Net::SMTP.

Es una gran frustración no saber qué es lo que está incorrecto, pero insisto, que es parte del proveedor.

No puedo desgastarme en algo que funciona y en el proveedor no.

Te consulto: ¿me podrías sugerir algún otro módulo para envío de correo que involucre otro tipo de librerías y con el cual pueda enviar correo TLS/SSL autenticado?

Y muchas gracias de antemano.
rqbit
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2014-02-05 18:10 @799

Re: Can't call method "auth" on an undefined value

Notapor explorer » 2014-02-06 11:16 @511

Coloca la línea CGI::Carp en tu programa, y ejecútalo. Si salen errores o avisos, procedentes de la opción Debug, pues saldrán en la página web.

Debes mirar también los archivos de registro de actividad web (log) porque ahí también tendrás muchas pistas. En concreto, mira el error.log.

Otro módulo no resolverá tu problema, si antes no sabemos qué problema es.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Can't call method "auth" on an undefined value

Notapor rqbit » 2014-02-06 11:44 @531

Ya he realizado pruebas al colocar CGI::Carp. Éste no me arroja ningún mensaje de error.
Los log de errores del servidor está limpios. No hay nada.

He realizado las siguientes pruebas:
1. Llevar al código solo hasta la instrucción donde se define el constructor y
$smtps = Net::SMTP::SSL->new($server,
Port => 465,
Debug => 1,
) or warn "$!\n";
print "Fin de la rutina";

y colocando en comentario el resto del código.

La salida es solo la instrucción de impresión del mensaje, es decir, hasta allí funciona todo bien.


2. Siguiendo los pasos de anterior descomento la línea que dice
$smtps->quit();

y el resultado ahora es:
Can't call method "quit" on an undefined value at prueba3.pl line 43.

y no
Can't call method "auth" on an undefined value line 37.

que es el primer llamado de la rutina a un método
defined ($smtps->auth($user, $pass))


Es decir, no pueden llamar a ninguno de los métodos de la librería Net::SMTP, es como, que el módulo está pero no hay ningún método dentro de él.

Esto es lo que me tiene desconcertado... no tener indicadores que sirvan de guía.

¿Qué opinas al respecto?

¿Es posible que el objeto de Net::SMTP esté mal definido instalado o corrupto?

Gracias de antemano.
rqbit
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2014-02-05 18:10 @799

Re: Can't call method "auth" on an undefined value

Notapor explorer » 2014-02-06 16:05 @712

Mejor que vuelvas a publicar tu código, para ver cómo lo tienes ahora.

El por qué continúa después del new(), es porque hemos quedado en poner un warn(). Si lo cambias por un die(), entonces el programa morirá, y con la ayuda de CGI::Carp, el error saldrá en pantalla.

Y me extraña que los registros de actividad estén "limpios".
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Módulos

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 4 invitados