• Publicidad

Enviar email desde CGI::Application

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Enviar email desde CGI::Application

Notapor fjmn2001 » 2012-06-08 03:26 @184

¡Saludos! Estoy usando un ejemplo que vi en el foro para realizar envío de correos desde CGI::Application, pero tengo un error

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. # MODO RECUPERAR CONTRASEÑA #
  2. sub index_recuperar_contrasena{
  3.         # 1.- Cargo todas mis librerías en la variable self.
  4.         my  $self = shift;
  5.  
  6.         # 2.- Recibo el query que viene desde el navegador y lo guardo en la variable q
  7.         my $q = $self->query();
  8.  
  9.         # 3.- Asigno variables a cada uno de los parámetros que recibo desde el navegador.
  10.         my $email = $q->param("email");
  11.  
  12.         # 4.- Asigno la plantilla que procesara el modo cambiar contraseña
  13.         my $file = "rm/index/form_recuperar_contrasena";
  14.  
  15.         # 5.- Creo una variable que contendrá un hash con todos los datos que procesara mi plantilla.
  16.         my $vars;
  17.  
  18.         # 6.- Verifico si el email recibido no se encuentra registrado en la base de datos
  19.         my $email_valido = $self->usuario_verificar_email($self, $email);
  20.         if(!@$email_valido){
  21.                 #6.a.1.- Mando un mensaje indicando que ese correo no se encuentra registrado.
  22.                 $$vars{"recuperar_contrasena_mensaje"} = "Tu correo no se encuentra registrado en nuestra base de datos.";
  23.         }else{
  24.                 #6.b.1.-Creo un id para la recuperación de contraseña
  25.                 my $time     = time()."".(time()+10)."".(time()-10);
  26.                 my $recovery = crypt($time,"recovery");
  27.                
  28.                 #6.b.2.-Guardo el id de la recuperación de contraseña en la base de datos
  29.                 #$self->usuario_guardar_recovery($self, $email, $recovery);
  30.                
  31.                 #6.b.3.-Genero el enlace para recuperación de contraseña.
  32.                 my $enlace = "http://conecta.zapto.org/tierra_activa?rm=index&email=".$email."&id=".$recovery."&modo=recovery";
  33.                
  34.                 #6.b.4.-Genero el mensaje que enviare al correo electrónico.
  35.                 my $mensaje = "Saludos!!! Debes visitar el siguiente enlace para que ingreses tu nueva contraseña\n\n".$enlace;
  36.                
  37.                 #6.b.5.-Envío el correo
  38.                 my $enviar_correo = enviar_correo($self, $email, "Recuperación de Contraseña - Tierra Activa", $mensaje);
  39.                
  40.                 #6.b.6.-Mando un mensaje indicando que el enlace de recuperación ha sido enviado al correo
  41.                 $$vars{"recuperar_contrasena_mensaje"} = "Se ha enviado un enlace a tu correo para que solicites una nueva contraseña";
  42.         }
  43.  
  44.         #7.- Retorno la plantilla con todas las variables procesadas.
  45.         return $self->processtmpl($file,$vars);
  46. }
  47.  
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


En el paso 6.b.5 envío en correo usando esta función
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. # ACCION - ENVIAR CORREO ELECTRÓNICO
  2. sub enviar_correo{
  3.         my ($self, $email, $asunto, $mensaje) = @_;
  4.  
  5.         use Email::Send::SMTP::Gmail;
  6.  
  7.         my $mail=Email::Send::SMTP::Gmail->new(
  8.             -smtp=>'gmail.com',
  9.             -login=>'[email protected]',
  10.             -pass=>'pwd',
  11.         );
  12.  
  13.         $mail->send(
  14.             -to=>$email,
  15.             -subject=>$asunto,
  16.             -verbose=>'1',
  17.             -body=>$mensaje,
  18.             -chartset=>'UTF-8'
  19.             #-attachments=>'',
  20.         );
  21.  
  22.         $mail->bye;
  23. }
  24.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El problema es el siguiente, cuando llama a la función enviar correo me retorna directamente a la página del cliente causando un error de cabecera. He buscando la forma de que llegue hasta el paso 7, pero nada... ¿Qué puedo hacer para solucionar ese problema, o lo estoy entendiendo mal?

El error es: malformed header from script. Bad header=Attachments successfully verif: index.pl
fjmn2001
Perlero nuevo
Perlero nuevo
 
Mensajes: 29
Registrado: 2009-06-25 15:11 @674

Publicidad

Re: Enviar email desde CGI::Application

Notapor explorer » 2012-06-08 09:23 @433

Cambia el verbose => '1', por un verbose => 0.

Estabas haciendo que el módulo de correo sacara mensajes de estado a la salida estándar, y en el caso de un CGI, eso solo debe ocurrir después de que hayamos enviado la cabecera de respuesta HTTP.

Resumen: es muy posible que no quisieras sacar mensajes del módulo Email::Send::SMTP::Gmail en la página de respuesta a la acción del CGI...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Enviar email desde CGI::Application

Notapor danimera » 2012-06-10 08:38 @402

Me encanta CGI::Application.

Otro módulo que podrías usar, aunque ya viejito pero funcional, es el mime-lite.

Te lo digo por que quizás más adelante quieras usar parte de tu misma aplicación para enviar mensajes por otros servidores y no solo Gmail, y entonces así tienes un código más amplio y no tendrás que reescribir el que tienes...

Yo hice algo similar con cgi-app... y lo resolví así.

En mi clase base:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub sendEmail{
  2.  
  3.     my $self = shift;
  4.  
  5.     return new MIME::Lite;
  6.  
  7. }
  8.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y en mi módulo cgi-app llamo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.    my $msg = $self->sendEmail;
  2.     my $html = "Mensaje enviado <b>hola</b> hellou";
  3.     $msg = $msg->build(
  4.         From     => '[email protected]',
  5.         To       => '[email protected]',
  6.         Subject  => "Prueba! ",
  7.         Type     => 'text/html',
  8.         Data     => $html
  9.     );
  10.     $msg->send('smtp', "mail.xxxxxx.com", AuthUser=>"[email protected]", AuthPass=>"2xxxpc");
  11.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Es solo otra solución de las múltiples posibles...
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Re: Enviar email desde CGI::Application

Notapor explorer » 2012-06-10 14:32 @647

El problema de MIME::Lite es que incluso el propio mantenedor recomienda no usarlo (así lo pone en su pagina de manual. Está lleno de errores y problemas (35), y existen alternativas como Email::MIME o MIME::Entity y Email::Sender.

Además, recordemos que para enviar con Gmail, hay que usar SSL. Por eso Email::Send::SMTP::Gmail usa Net::SMTP::SSL.

Finalmente... MIME::Lite es, principalmente, un generador de mensajes con formato MIME, más que un sistema de transporte de correo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

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

cron