• Publicidad

CGI para enviar correos

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

CGI para enviar correos

Notapor globalworkteam » 2012-04-17 20:31 @897

Hola

Tengo el siguiente script en CGI:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. #(C) Gustavs Avotins, 2002
  4.  
  5. do 'sessions.cgi';
  6. do 'sendemailfunc.cgi';
  7.  
  8. $DAYSDELAY            = 0;             # allow emailing once every $DAYSDELAY or more days, >= 0
  9. $ALLOWONLYPAIDMEMBERS = 0;             # allow only paid members to use this script. 1=yes, 0=no
  10.                                        # (set to 1 only if PaidMembers addon is installed)
  11.  
  12. # The text below will be added at the end of all messages when sent in TEXT format.
  13. # By default contains unsubscribe info. To use the default, change root\@localhost
  14. # to your support email. %ID% will be substituted to recipient's user ID#
  15. $ADMINNOTE_TEXT = qq~
  16.  
  17. -------------------------------------------------------------------------
  18. This message was sent to you by the member of your ReferClub upline.
  19. To unsubscribe & terminate your ReferClub membership, please login into
  20. your account and use 'Delete Account' or send an email to root\@localhost
  21. with 'remove (ID#: %ID%)' in the subject line.
  22.  
  23. Best regards,
  24. ReferClub admin
  25.  
  26. $SiteURL/
  27. ~;
  28.  
  29. # Same for HTML format emails
  30. $ADMINNOTE_HTML = qq~
  31. <BR><BR>
  32. -------------------------------------------------------------------------<BR>
  33. This message was sent to you by the member of your ReferClub upline.<BR>
  34. To unsubscribe & terminate your ReferClub membership, please login into<BR>
  35. your account and use 'Delete Account' or send an email to root\@localhost<BR>
  36. with 'remove (ID#: %ID%)' in the subject line.<BR>
  37. <BR>
  38. Best regards,<BR>
  39. ReferClub admin<BR>
  40. <BR>
  41. $SiteURL/
  42. ~;
  43.  
  44. if ( $ENV{REQUEST_METHOD} eq 'POST' ) {
  45.     read( STDIN, $buffer, $ENV{'CONTENT_LENGTH'} );
  46. }
  47. else { $buffer = $ENV{QUERY_STRING} }
  48. @pairs = split( /&/, $buffer );
  49. foreach $pair (@pairs) {
  50.     ( $name, $value ) = split( /=/, $pair, 2 );
  51.     $value =~ tr/+/ /;
  52.     $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
  53.     $in{$name} = $value;
  54. }
  55.  
  56. print "Content-type:text/html\n\n";
  57.  
  58. $session = $in{'session'};
  59. unless ( VerifySession($session) ) { SessionExpired() }
  60. $session =~ /:(\d+)/;
  61. $userid = $1;                          #get Userid
  62. @user   = ReadRecord($userid);
  63. if ( $ALLOWONLYPAIDMEMBERS == 1 ) {
  64.     if ( $user[$DBStatus] != 1 ) {
  65.         print "Error: free members are not allowed to use this feature!";
  66.         exit;
  67.     }
  68. }
  69.  
  70. print qq~
  71. <html><head>
  72. <meta http-equiv="Content-Language" content="en-us">
  73. <meta http-equiv="Content-Type"
  74. content="text/html; charset=windows-1252">
  75. </head>
  76. <body background="$SiteURL/bg.jpg">
  77. ~;
  78.  
  79. $subject = $in{'subject'};
  80. $message = $in{'message'};
  81. $format  = $in{'format'};
  82. if ( $format ne undef ) {
  83.     if ( $subject eq "" ) { print "Error: you haven't entered a subject!"; exit }
  84.     if ( $message eq "" ) { print "Error: you haven't entered a message!"; exit }
  85.     $from = "$user[$DBName] <$user[$DBEmail]>";
  86.  
  87.     LockedCodeBegin();
  88.  
  89.     @ids = ReadDownline( $userid, 1 );
  90.     $dayspassed = int( ( time() - $ids[0] ) / 86400 );
  91.     if ( $ids[0] eq undef ) { print "Error: you have no downline!"; exit }
  92.     if ( ( $ids[0] != 0 ) and ( $dayspassed < $DAYSDELAY ) ) { print "Intrusion detected!"; exit }
  93.  
  94.     #update sending time for this user before sending
  95.     $ids[0] = time;
  96.     open( FH, ( ">$DownlineDir/" . substr( $userid, -1, 1 ) . "/$userid" ) )
  97.         or die "Error opening downline info!  $!\n";
  98.     WriteLock( *FH, 0, 0 ) or die "Error write locking downline info!  $!\n";
  99.     my $buffer = join( ',', @ids );
  100.     syswrite( FH, $buffer, length($buffer) );
  101.     close(FH) or die "Error closing downline info!  $!\n";
  102.  
  103.     LockedCodeEnd();
  104.  
  105.     if ( $format eq 'html' ) { $subject .= "\nContent-type: text/html" }
  106.  
  107.     #send emails
  108.     my $sig = "";
  109.     for ( $i = 1; $i < @ids; $i++ ) {
  110.         if ( $format eq 'text' ) {
  111.             $sig = $ADMINNOTE_TEXT;
  112.         }
  113.         else {
  114.             $sig = $ADMINNOTE_HTML;
  115.         }
  116.  
  117.         @tempuser = ReadRecord( $ids[$i] );
  118.         $name     = $tempuser[$DBName];
  119.         $email    = $tempuser[$DBEmail];
  120.         $password = $tempuser[$DBPassword];
  121.  
  122.         $msg  = $message;
  123.         $subj = $subject;
  124.         $msg  =~ s/%NAME%/$name/g;
  125.         $subj =~ s/%NAME%/$name/g;
  126.         $sig  =~ s/%ID%/$ids[$i]/g;
  127.  
  128.         if ( $password ne "" ) {
  129.             if ( !SendEmail( $from, $email, $subj, "\n" . $msg . $sig, "-oi -t" ) ) {
  130.                 print "Error sending email to member# $ids[$i]! Stopped sending";
  131.                 exit;
  132.             }
  133.         }
  134.     }
  135.  
  136.     print qq~
  137. <table border="0" width="100%" cellpadding="0" cellspacing="0" height="95%">
  138.   <tr>
  139.     <td width="100%" height="100%">
  140.       <h2 align="center">Your message has been sent to all your downline</h2>
  141.     </td>
  142.   </tr>
  143. </table>
  144. </body></html>
  145. ~;
  146.     exit;
  147. }
  148.  
  149. print "<CENTER><H2>Email to direct downline</H2>";
  150.  
  151. if ( $DAYSDELAY > 0 ) {
  152.     print "<H3><FONT color=red><B>Status:</B></FONT>&nbsp;";
  153.     my $lasttime = ( ReadDownline( $userid, 1 ) )[0];
  154.     if ( $lasttime eq undef ) { print "<B>You have no downline!</B></H3>"; exit }
  155.     $dayspassed = int( ( time() - $lasttime ) / 86400 );
  156.     if ( ( $lasttime == 0 ) or ( $dayspassed >= $DAYSDELAY ) ) {
  157.         print "<FONT color=green><B>Allowed</B></FONT></H3>";
  158.     }
  159.     else {
  160.         $days = $DAYSDELAY - $dayspassed;
  161.         if   ( $days == 1 ) { $days .= " day" }
  162.         else                { $days .= " days" }
  163.         print "<B>$days remaining before you may post again!</B></H3>";
  164.         exit;
  165.     }
  166. }
  167. $email = "$user[$DBName] &lt;$user[$DBEmail]&gt;";
  168.  
  169. print qq~
  170. <h4>Note: you can use personalization code %NAME% in subject and message<BR>
  171. (%NAME% will be replaced with your downline member name)</h2>
  172. <form action="emaildownline.cgi" method="POST">
  173. <table border="1" cellpadding="1" cellspacing="0" bgcolor="#FFFFCC">
  174. <TR><TD>From:</TD><TD>$email</TD></TR>
  175. <TR><TD>Subject:</TD><TD><INPUT type="text" NAME="subject" SIZE="60"></TD></TR>
  176. <TR><TD>Format:</TD><TD><INPUT type="radio" NAME="format" value="text" CHECKED>Text <INPUT type="radio" NAME="format" value="html">HTML</TD></TR>
  177. <TR><th colspan="2" height="144" align="left">
  178. <textarea rows="12" name="message" cols="65"></textarea></th></TR>
  179. <INPUT type="hidden" name="session" value="$session">
  180. </tr><tr><td colspan="2" align="center"><BR>
  181. <input type="submit" value="Send" name="submit" style="font-size: 17px"><BR><BR>
  182. </td></tr></table></form>
  183. <FONT color=red>After clicking the 'Send' button please wait until the process completes!</FONT>
  184. </CENTER>
  185. </BODY></HTML>
  186. ~;
Coloreado en 0.007 segundos, usando GeSHi 1.0.8.4


Es para enviar correos a varios prospectos a la vez.

Cuando lo ejecuto no me manda los email y la pantalla se queda en blanco.

Cuando adquirí el script me ponía que el tiempo de ejecución Perl tenía que ser alto.

He adquirido el hosting en hostgator.

¿Quée puedo hacer para mandar los emails?

Un saludo,
Julian Gutierrez
Valladolid
Última edición por explorer el 2012-04-18 03:38 @193, editado 1 vez en total
Razón: Formateado de código con Perltidy y poner marcas Perl
globalworkteam
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2012-04-17 20:26 @893

Publicidad

Re: CGI para enviar correos

Notapor explorer » 2012-04-18 11:13 @509

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

(¿Valladolid de España, México, Ecuador, Colombia o Filipinas :?:)

Mirando el código por encima, parece que va bien. No sabemos lo que hacen los módulos sessions.cgi y sendemailfunc.cgi, pero el resto parece correcto. Éste último es el que contiene el código que envía el correo, así que, en principio, el problema estaría ahí.

Estará ahí si a este CGI le damos los parámetros correctos. La llamada debe partir de un formulario con las cajas o argumentos 'session', 'subject', 'message' y 'format'.

Tampoco sabemos cómo hace la gestión de sesiones, ya que todas las subrutinas del programa están (estarán) definidas en las dos bibliotecas importadas.

El código es algo antiguo (¡diez años!) por lo que, hoy en día, hay párrafos enteros que pueden ser abreviados o, directamente, eliminados, sin contar además con la mala idea de mezclar código con textos incrustados en el mismo código. Mejor tener una plantilla aparte...

Dices que la pantalla queda en blanco. ¿Has analizado los logs del servidor web? Es muy posible que ahí esté reflejada la causa del error.

Después de la línea 56 puedes ir colocando código HTML para saber por dónde va el programa...
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: CGI para enviar correos

Notapor globalworkteam » 2012-04-18 12:25 @559

Hola, soy de Valladolid, España, al igual que tu, ¡je,je!

Si quieres te puedo mandar el script y echarlo un vistazo.

¡¡¡Me estoy volviendo loco con el script!!!

En el log me sale lo siguiente:

Error opening lock file! No such file or directory, referer: http://www.ganadinerodesdeinternet.net/cgi-bin/emaildownline.cgi?session=1:1:vwMQoEK\\wL

Muchas gracias de antemano,
Un saludo.
globalworkteam
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2012-04-17 20:26 @893

Re: CGI para enviar correos

Notapor explorer » 2012-04-18 16:57 @747

Bueno, ya tenemos más pistas: el error se produce porque ha intentado bloquear un archivo, supongo que en la línea 87, pero como no sabemos el contenido de esa subrutina, no sabemos cómo se llama el archivo.
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: CGI para enviar correos

Notapor globalworkteam » 2012-04-18 17:20 @763

¿Y qué es lo que necesitarías saber?

Un saludo y muchas gracias de nuevo.
globalworkteam
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2012-04-17 20:26 @893

Re: CGI para enviar correos

Notapor explorer » 2012-04-18 17:47 @782

Pues el nombre del archivo que está intentando bloquear.

Es posible que, como es un software de hace diez años, esté intentando referirse a un archivo en algún directorio inexistente.

O quizás el programa no tiene permisos de escritura en ese directorio.
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: CGI para enviar correos

Notapor explorer » 2012-04-19 17:45 @781

globalworkteam escribiste:Hola, soy de Valladolid, España, al igual que tu, ¡je,je!
¡Ah! Pues a ver si podemos coincidir algún día. En tiempos creé Valladolid.pm, pero los pocos programadores Perl que conocía por aquí emigraron a otras tierras, así que al final, no cuajó.

Ahora me estoy preparando para el primer curso de Perl en la Universidad de Valladolid, sobre todo a gente de Estadística.
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


Volver a Básico

¿Quién está conectado?

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