• Publicidad

Cómo trabajo con array, cómo cierro ventanas extras, etc

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

Cómo trabajo con array, cómo cierro ventanas extras, etc

Notapor proxy_lainux » 2009-05-13 18:37 @817

Hola.

Miren, tengo varias preguntas, cuando hago un fichero con los datos de mi correo, se escriben los datos de esta manera:
Código: Seleccionar todo
mail
password
pop.gmail.com
true ó false -> aquí depende de si se utiliza SSL

al usar Mail::POP3Client.

Quiero poner los datos de USER, PASSWORD, HOST, SSL directamente del fichero, bueno, primero abro el fichero y coloco los datos en un array.

Por ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
open(DATOS,">datos.txt");

push(@mem ,<DATOS>);

close DATOS;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Ya tengo en un array los datos, pero ahora intento incluirlos en las funciones de POP3Client:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
USER => @mem[0],
PASSWORD => @mem[1],
HOST => @mem[2],
USESSL => @mem[3],
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


pero tengo un problema: ni USER, ni PASSWORD, ni HOST me funcionan, únicamente me funciona USESSL.

Por lo general uso USER, PASSWORD y HOST de esta manera:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
USER => '[email protected]',
PASSWORD => 'password',
HOST => 'pop.gmail.com',
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


pero con el array no puedo y no sé de qué forma puedo hacer que funcione.

También ¿alguien sabe cómo cerrar una segunda ventana hecha en Gtk sin cerrar la primera?

Lo que pasa es que al crear una ventana, hago una función en donde abro otra ventana, pero si hago esto en signal_connect "Gtk2->main_quit" se cierra todo, y solo quiero cerrar las ventanas que se abran sin cerrar la principal, por así decirlo, quiero cerrar las ventanas hijas sin cerrar la ventana padre...

jeje, no sé si se dice así, pero espero lo entiendan...

Y otra pregunta, ¿cómo reviso las carpetas de mi mail, por separado... ya que al revisar mi correo, se me muestran todos los mensajes de inbox, trash, etc... pero quiero ver únicamente los mensajes de la bandeja de entrada o los borradores o los enviados, etc...

¿Que se necesita para eso?

salu2 :D
proxy_lainux
Perlero nuevo
Perlero nuevo
 
Mensajes: 30
Registrado: 2009-04-13 21:38 @943

Publicidad

Notapor explorer » 2009-05-13 19:13 @842

Hay varios errores... de concepto.

Abres el fichero datos.txt en modo escritura, pero luego haces una operación de lectura.

Si haces esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
push(@mem ,<DATOS>);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
estás guardando cada línea de DATOS en cada elemento de @mem, incluyendo los caracteres de final de cada línea, y eso no es lo que quieres que pase.

Antes, tienes que quitárselos. La lectura quedaría así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
open (DATOS,"<datos.txt");
chomp(my @mem = <DATOS>);
close(DATOS);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Tienes otro fallo de concepto a la hora de acceder a los elementos de @mem: está claro que es arreglo, pero cada elemento de un arreglo es un escalar. Y la forma de acceder a un escalar no es con '@' sino con '$'.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
USER     => $mem[0],
PASSWORD => $mem[1],
HOST     => $mem[2],
USESSL   => $mem[3],
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

El uso de '@' con elementos de un arreglo, -aunque parece que funcione bien por razones explicadas en otros hilos de estos foros-, no es lo correcto en cuanto a la forma de expresión de lo que quieres hacer. Si estás queriendo leer valores individuales, entonces debes usar el sigil '$'. Esto lo tienes explicado con ejemplos en Wikipedia (Perl) y en perldata.

Para lo del Gtk, supongo que será invocando alguna función close().

En cuanto a lo del correo, depende del servidor de correo que uses. El protocolo POP no contempla el caso de tener carpetas en el lado del servidor. Solo existe la carpeta de entrada. Las demás son locales. El protocolo IMAP, sí que lo permite.
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

Notapor proxy_lainux » 2009-05-13 21:28 @936

Hola.

jeje, lo siento, lo escribí mal...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
"<datos.txt")
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Gracias por lo del uso de '@'. Intenté usar chop() pero no me funcionó... aunque lo hice de un modo diferente, tal vez por eso no me funcionó aunque no me apareció ningún mensaje de error, pero bueno, al menos de la forma como me mostraste me funcionó :D

Para lo del Gtk, supongo que será invocando alguna función close().


De eso voy a buscar porque no sé cómo cerrar la ventana. Es que abro una ventana donde puedo guardar la información de mi correo, pero al oprimir guardar aparte de guardar la información quisiera que se cerrara...

¿Cuál módulo me recomiendan usar...? Ya que busqué algo de IMAP en CPAN, pero no supe cuál me serviría mejor. Lo que quiero es poder revisar mensajes, y se puede por separado, como mencioné anteriormente, los mensajes de bandeja de entrada, basura, borradores, etc.

También poder borrar mensajes, bueno, casi o un uso completo de mi mail...

Por cierto, con POP3Client se puede analizar el mensaje que yo quiera, cuando quiera, por ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$pop = new Mail::POP3Client(
    USER     => "me",
    PASSWORD => "mypassword",
    HOST     => "pop3.do.main",
);

foreach( $pop->Head( 1 ) ) {
    /^(From|Subject):\s+/i && print $_, "\n";
}

$pop->Close();
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Coloco este código de CPAN, aunque lo modifiqué un poco para puedan entender mi problema... pero ¿cómo podría hacer que al escribir por ejemplo en un Entry el número 4, con get_text(), Head reciba el número del mensaje que quiero ver y me lo muestre?

Algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $enty = Gtk2::Entry->new;
$hd = $enty->get_text;

foreach( $pop->Head( $hd ) )
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Lo intente así, pero no me funcionó... aunque no sé si esté bien la parte de $hd.


¿Será acaso que tengo que quitar
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$pop->Close()
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
para que no se cierre la conexión?
proxy_lainux
Perlero nuevo
Perlero nuevo
 
Mensajes: 30
Registrado: 2009-04-13 21:38 @943

Notapor proxy_lainux » 2009-05-15 22:35 @982

Hola.

Sobre lo de IMAP, ¿cuál podría usar para tener un control total de mis correos?

¿Mail::IMAPClient ó Net::IMAP::Simple?

Lo necesito para conexiones sin y con SSL, ¿cuál sería el mejor?

Y para revisar un mensaje, tengo que conectarme mediante Mail::POP3Client todo el tiempo, ya que en C uso un while() para mantener la conexión activa y solo ejecuto en fgets() el comando RETR y el número y con eso puedo revisar cualquier mensaje, pero no sé si también se pueda hacer lo mismo con el módulo de POP3Client.

¿O será que para revisar un mensaje tengo que hacer, por ejemplo, una caja de texto y un botón en donde al ser oprimido, signal_connect ejecute las funciones del módulo Mail::POP3Client y se conecte a mi correo por cada mensaje que quiera revisar?

O como mencioné, ¿habrá la posibilidad de mantener la conexión activa y solo decirle a Head y Body cuál mensaje quiero ver?

salu2
proxy_lainux
Perlero nuevo
Perlero nuevo
 
Mensajes: 30
Registrado: 2009-04-13 21:38 @943

Notapor explorer » 2009-05-16 06:22 @307

Primero, debes escoger el protocolo más acorde a lo que necesites...

Si quieres consultar un determinado correo cada X segundos/minutos, te vale cualquier protocolo.

Si quieres que sea el propio servidor el que te avise de la llegada de nuevo correo, debes usar el protocolo IMAP con soporte del comando IDLE, NOOP o STATUS.

La elección del protocolo también estará determinada por el protocolo que ya esté instalado en el servidor. Y si no podemos cambiarlo, pues tendremos que ajustarnos a él.

Todos los protocolos tienen un timeout o lapso de tiempo de máxima espera. Si llega a ese tiempo, corta la conexión. Lo que puedes hacer, en el caso de POP, es preguntar cada X segundos/minutos por cambios o nuevos mensajes. En IMAP, lo mismo. La diferencia entre los dos es que muy posiblemente, en POP, tengas que iniciar una sesión completa, si dejas pasar mucho tiempo.

Dices que en C consigues mantener la conexión con un bucle. Bueno, pues con el módulo de POP3Client, lo mismo. Si ves el código del módulo, verás que hace un uso constante de RETR.

Lo primero que tienes que averiguar es cuál es el tiempo de corte de conexión desde el lado del servidor. Si, suponemos que son 300 segundos, entonces sabes que tienes que hacer alguna operación, la que sea, dentro de ese plazo de tiempo. No tiene que ser una operación de RETR, sino también un simple LIST para saber el listado de mensajes.

Ahora bien... la pregunta fundamental, ahora, es... ¿para qué quieres estar pendiente de un determinado correo? Si necesitas procesarlo de la forma más urgente posible, quizás el método de usar el correo electrónico no sea lo más recomendado. Quizás usar el protocolo CGI sea lo más directo.

Si no necesitas procesarlo de forma urgente, te vale con un proceso que se ejecute cada 5, 15, 30 o 60 minutos para que analice los nuevos correos recibidos.
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

Notapor proxy_lainux » 2009-05-16 23:14 @010

Hola.

No,no,... jeje, no quiero revisar un mensaje, inmediatamente; quiero poder revisar todos mis mensajes, después de haber visto alguno... Lo explicaré lo más detallado posible para que me puedas ayudar.

Para revisar los mensajes, utilizo head y body.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$reco = Mail::POP3Client->new(USER => $mem1[0],
                              PASSWORD => $mem1[1],
                              HOST => $mem1[2],
                              USESSL => $mem1[3],
);

foreach($reco->Head(1)){
$buff1->insert_at_cursor(/^(Subject):\s+/&& $_);
$tev2->set_buffer($buff1);

foreach($reco->Body(1)){
$buff4->insert_at_cursor("$_\n");
$tev->set_buffer($buff4);}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Si te fijas, por mi ignorancia, yo le pongo un número dentro de head y body y lo pongo en un foreach(), aunque intenté quitar el foreach(), pero tengo varios mensajes de error si intento guardar en una variable los datos de Head y Body, pero por lo mientras así me ha funcionado.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
foreach($reco->Head(1))
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y con esto puedo revisar el mensaje que yo quiero; pero lo que quiero es colocar en una caja de texto con un botón, o algún simplelist, etc... el número del mensaje.

Y al hacer clic, me muestre el mensaje que quiero. Por ejemplo:

En una caja de texto escribo 4, y al darle clic en un botón quisiera revisar el mensaje número 4. Para eso lo que obtenga en get_text() se colocaría en head y body.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$mesj->get_text
foreach($reco->Head($mesj)) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Pero en el botón, lo que no sé es si para revisar uno por uno mis mensajes, tengo que conectarme a mi correo por cada mensaje o se puede hacer un bucle para que siempre esté conectado y solo revisar el mensaje que quiero ¿o hay alguna opción para eso?

Por ejemplo, en signal_connect() tendría que hacer algo parecido a esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
signal_connect(clicked => sub{
$mejs->get_text;

$reco = Mail::POP3Client->new(USER => $mem1[0],
                              PASSWORD => $mem1[1],
                              HOST => $mem1[2],
                              USESSL => $mem1[3],
);

foreach($reco->Head($mejs)){
$buff1->insert_at_cursor(/^(Subject):\s+/&& $_);
$tev2->set_buffer($buff1);
$reco->Close;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


pero como mencioné, si hago esto tendría que conectarme a mi correo por cada mensaje que quiera revisar. ¿O hay alguna forma de mantenerme conectado y solo tener que hacer algo parecido a esto?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
signal_connect(clicked => sub{
$mejs->get_text;

foreach($reco->Head($mejs)){
$buff1->insert_at_cursor(/^(Subject):\s+/&& $_);
$tev2->set_buffer($buff1);
$reco->Close;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Si ven, ya no me vuelvo a conectar; solo le digo a Head y/o Body qué mensaje quiero ver... espero haber sido lo más detallado posible...

salu2
proxy_lainux
Perlero nuevo
Perlero nuevo
 
Mensajes: 30
Registrado: 2009-04-13 21:38 @943

Notapor explorer » 2009-05-17 09:36 @441

En la propia sinopsis del módulo Mail::POP3Client, en las primeras líneas, hay un ejemplo de cómo recorrer la lista de mensajes almacenados en el buzón, con la ayuda de la funcion Count().

Los métodos List() y ListArray() también dan información de todos los mensajes. Con una sola de estas llamadas obtienes la lista completa.

En cuanto a la pregunta fundamental, si permanecer conectado o no, puedes hacer esto:
Inicias la conexión, recuperas la lista de mensajes, la muestras y quedas esperando.

Si el usuario cierra el programa, puedes cerrar la conexión.

Si el usuario intenta recuperar un mensaje, primero compruebas que la conexión esta viva con la ayuda del método Alive().

Si no lo está, haces un Connect(),

y ya puedes recuperar el mensaje.


Como ves, es cuestión de usar lo que el propio módulo te ofrece.

El número que le pasas a Head() y Body() es el número de mensaje a recuperar. Y las funciones te devuelven todas las líneas, bien sea en forma de escalar o de lista de valores, según el contexto en que las pongas:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $msg = $reco->Head(1);
my @msg = $reco->Head(1);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Dentro de un foreach() lo estás haciendo en contexto lista, por lo que procesas una línea cada vez.
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 3 invitados

cron