Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Recibir mail borrando la copia del servidor (https://www.clubdelphi.com/foros/showthread.php?t=39863)

fedelphi 31-01-2007 20:53:16

Recibir mail borrando la copia del servidor
 
Hola amigos, estoy realizando una aplicacion para enviar y recibir mails con archivos adjuntos con los componentes indy, pero me interesaria saber de que manera puedo borrar los mensajes en el servidor una vez recibidos. Para recibir utilizo el componente idPOP3 y delphi 7, inserto el código que utilizo
Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
var
    n,   nummsgs    : integer;
  x:integer;
 begin
    Memo1.Lines.Clear;
 //Conectamos!
  idpop31.Connect(0);
  //Obtenemos el numero de emails que tenemos
 NumMsgs:=idpop31.CheckMessages;
    Memo1.lines.add( 'Emails:' +IntToStr(NumMsgs) );
    for n:=1 to NumMsgs do begin
           idpop31.Retrieve(n,mail);
           for x:=0 to Pred( mail.MessageParts.Count) do
         begin
            if (mail.MessageParts.Items[x] is TIdAttachment) then
           begin // si es attchamente lo guardo
               Memo1.Lines.Add( TIdAttachment( mail.MessageParts.Items[x]).Filename);
               TIdAttachment(mail.MessageParts.Items[x]).SaveToFile(ExtractFilePath(GetModuleName(hInstance)) +
               TIdAttachment(mail.MessageParts.Items[x]).Filename);
               end;
           next;
           end;

            idpop31.RetrieveHeader(n,mail);
     Memo1.Lines.Add( 'Email Nº:'+IntToStr(n)+' De:'+mail.From.Text+' Tema:'+mail.Subject );
     mail.Clear;
   end;
   idpop31.Disconnect;

   end;
espero me den un dato como para saber donde seguir. Gracias
Fede

dec 31-01-2007 21:12:34

Hola,

Ojalá esté equivocado pero para mí tengo que depende del Servidor el mantener una copia del mensaje o no hacerlo. Desde el Cliente lo más que se puede hacer (y ojalá me equivoque, ya digo) es marcar un mensaje para ser borrado. Pero es el Servidor el que lo borra, efectivamente, o mantiene una copia del mismo...

Ahora bien, ¿no es esto una contradicción? Porque si el Cliente pide borrar un mensaje... pero claro, también puede ser una "feature" por parte del Servidor. De hecho hay Servidores que borrarán el mensaje, y los hay como Gmail, por ejemplo, que permiten al usuario especificar en las opciones si han de mantenerse copias de los mensajes que se borren desde Clientes.

ArdiIIa 31-01-2007 21:28:51

A mi juicio es el cliente quien debe borrarlos.

Aquí te dejo un ejemplo que utilizo para borrar.

Código Delphi [-]
procedure TFormPOP3.DeleteMails(msgnums : array of integer);
Var I : Integer;
begin
if FBussy then exit;

FBussy := True;
  try
      Screen.Cursor := crHourGlass;
      Application.ProcessMessages;

  with POP3 do
  Begin
    if Connected then  Disconnect;
    Connect(10000);

    for i := Low(msgnums) to High(msgnums) do
    Delete(msgnums[i]);
  End;


Finally
pop3.Disconnect;
FBussy := False;
End;

Yo particularmente dejo que sea el usuario quien realice este proceso, así me evito tener que guardar los mensajes leídos en ningún sitio, sino que permanecen en el servidor hasta que el usuario los borra.

ArdiIIa 31-01-2007 21:32:51

Cita:

Empezado por dec
Hola,
Desde el Cliente lo más que se puede hacer (y ojalá me equivoque, ya digo)

Si, creo que no estás en lo cierto

Cita:

Empezado por dec
De hecho hay Servidores que borrarán el mensaje

Cuando, en que momento decide el servidor que un mensaje ha de ser borrado...
¿Cuando es accedido? y si el cliente tuvo un fallo de recepción

;)

dec 31-01-2007 21:57:54

Hola,

A ver si nos estamos confundiendo... yo me refiero al "cliente" no como a quien usa el programa para gestionar su correo, sino al propio programa que gestiona el correo.

Es el cliente (programa que gestiona el correo, y, obviamente, por petición del usuario) quien marca para borrar un determinado email y es el Servidor quien se encarga de su borrado.

Ahora, si en el Servidor está configurada la opción de mantener una copia de los mensajes (si no recuerdo mal así lo hace Gmail), el Servidor no borrará los correos que se marquen para ser borrados desde un cliente "pop", en este caso.

¿Y porqué no aparecen una y otra vez los correos en el programa/cliente si estos no llegan a borrarse? Pues no estoy muy puesto en estos temas, pero, puede que el programa/cliente no descarge mensajes "marcados para ser borrados", simplemente.

roman 31-01-2007 22:11:11

Quizá esto aclare un poco la situación:

Cita:

Empezado por Post Office Protocol

DELE msg

Arguments:
a message-number (required) which may NOT refer to a
message marked as deleted

Restrictions:
may only be given in the TRANSACTION state

Discussion:
The POP3 server marks the message as deleted. Any future
reference to the message-number associated with the message
in a POP3 command generates an error. The POP3 server does
not actually delete the message until the POP3 session
enters the UPDATE state.
may only be given in the TRANSACTION state

// Saludos

ArdiIIa 31-01-2007 22:13:21

Cita:

Empezado por dec
Hola,
A ver si nos estamos confundiendo... yo me refiero al "cliente" no como a quien usa el programa para gestionar su correo, sino al propio programa que gestiona el correo.

Quizás hubiera sido más apropiado decir "usuario" o "programa cliente"
Valga la aclaración

Cita:

Empezado por dec
Ahora, si en el Servidor está configurada la opción de mantener una copia de los mensajes (si no recuerdo mal así lo hace Gmail), el Servidor no borrará los correos que se marquen para ser borrados desde un cliente "pop", en este caso.

Es la opción lógica

Cita:

Empezado por dec
¿Y porqué no aparecen una y otra vez los correos en el programa/cliente si estos no llegan a borrarse? Pues no estoy muy puesto en estos temas, pero, puede que el programa/cliente no descarge mensajes "marcados para ser borrados", simplemente.

Es to último es posible, pero en todo caso es el programa cliente quien los marca y no el servidor a "motu propio".

fedelphi 31-01-2007 22:55:05

Muchas gracias por contestar, pero no entiendo bien ya que soy novato en esto. A ver si es correcto, msgnums es un array con los nros de identificacion de los mensajes en el server?, si es asi, los obtengo con mail.msgid en mi caso? otra, que es fbussy?
Ademas para la discusión anterior, esto dice la ayuda de delphi sobre pop3.delete
Cita:

Messages marked for deletion on the POP3 server will be physically removed when Disconnect is called.

dec 31-01-2007 23:17:18

Hola,

Cita:

Empezado por Román
Quizá esto aclare un poco la situación:

Huy... pues no sé yo Román. Es lo que estamos diciendo: los mensajes se marcan para ser borrados, pero, que el Servidor los borre o no en última instancia... depende del Servidor (y de sus opciones) y poco podemos hacer para borrar correos "sin apelación" desde el programa/cliente. O existe una forma, pero, no parece que sea la que estamos comentando aquí (usar en última instancia el comando "DELE" del protocolo "POP3").

Cita:

Empezado por fedelphi
A ver si es correcto, msgnums es un array con los nros de identificacion de los mensajes en el server?

Hum... tal vez te refieras a "MsgNum", que ha de ser pasado como parámetro en métodos como "Retrieve" del componente "TIdPop3". "MsgNum" indica el número de mensaje sobre el que queremos trabajar, por ejemplo en el método "Retrieve" indica el número de mensaje que queremos recuperar del Servidor.

Cita:

Empezado por fedelphi
si es asi, los obtengo con mail.msgid en mi caso?

Los obtienes con "Retrieve". Indicas como parámetro el número de correo a recuperar y una variable de tipo "TIdMessage" en que albergar los datos del correo recuperado. De todos modos echa un vistazo a los ejemplos de los componentes Indy, concretamente al Cliente de correo que incorpora.

Cita:

Empezado por fedelphi
otra, que es fbussy?

Ay, ay, ay... "fbussy" puede ser una variable de tipo booleano que se use a modo de "bandera" en el código que traes entre manos... me temo que igual que algo parecido a "msgnums", puesto que estos identificadores no se corresponden (que yo sepa) a propiedades de la clase "TIdPop3"...

Cita:

Empezado por fedelphi
Ademas para la discusión anterior, esto dice la ayuda de delphi sobre pop3.delete

Cita:

Messages marked for deletion on the POP3 server will be physically removed when Disconnect is called.

En Google traducen "will" por "voluntad"... ignoro si podría traducirse la frase anterior más o menos así: "Los mensajes marcados para ser borrados en el Servidor POP3 serán efectivamente borrados (a voluntad del Servidor) cuando la conexión finalize llamándose al método "Desconectar".

roman 31-01-2007 23:26:57

Quizá estoy entendiendo mal pero según yo el protocolo es bastante claro:

El cliente manda el comando DELE al servidor para borrar un mensaje, el servidor lo marca como borrado y lo borra hasta que entra al estado UPDATE. Yo pienso que este estado se alcanza siempre en una transacción, está simplemente para no borrar de uno por uno. Pero no veo de dónde es una opción en el servidor la de borrar o no los mensajes. No veo porqué había de ser así, es una opción que fija el usuario via el cliente de POP3 y lo íunico que hace tal opción es instruir al cliente a mandar o no el comando DELE.

Dicho de otra forma: es prerrogativa del cliente mandar o no el comando DELE. Y si se manda, el servidor lo borrará en cuanto pueda.

// Saludos

roman 31-01-2007 23:29:47

Cita:

Empezado por dec
En Google traducen "will" por "voluntad"... ignoro si podría traducirse la frase anterior más o menos así: "Los mensajes marcados para ser borrados en el Servidor POP3 serán efectivamente borrados (a voluntad del Servidor) cuando la conexión finalize llamándose al método "Desconectar".

No, no. Aquí will es el auxiliar del futuro. Si fuera lo que comentas diría at will.

// Saludos

cdar 04-02-2007 16:41:09

Componentes pop3
 
Hola a todos, estoy empeñado en hacer un cliente de correo, pero en mi delphi 7 no cuento con ningun componente para aplicaciones pop3 ni smtp. Alguien que me pueda ayudar con una liga para bajarlo o que me pueda hacer el favor de pasarmelo. Muchas gracias de ante mano!

dec 04-02-2007 18:31:27

Hola,

Cita:

Empezado por Román
Dicho de otra forma: es prerrogativa del cliente mandar o no el comando DELE. Y si se manda, el servidor lo borrará en cuanto pueda.

Bueno. Pues acaso sea así en teoría. Yo utilizo un programa cliente de correo que gestiona cuentas de correo en Gmail. Cuando yo borro un mensaje desde el programa de correo (que hace uso del protocolo POP3) el mensaje se borra de mi vista, y no vuelve a aparecer si actualizo, es decir, si pregunto al programa de correo si hay correo nuevo... no sé si me explico.

Pero, aunque yo borrase el mensaje de correo desde el programa cliente, lo cierto es que dicho mensaje no se borra del Servidor de Gmail. Es decir, si entro a Gmail mediante un navegador Web puedo ver no sólo los últimos mensajes, sino los que he "borrado" desde el programa cliente de correo. Si se piensa un poco por mucho que haga el cliente es el Servidor quien tiene la última palabra.

Ahora, ya no sé si Gmail se "salta" el protocolo o qué. Pero que lo que digo ocurre lo experimento a diario. Y la prueba es que el compañero que inició este Hilo hubo de encontrarse con esta circunstancia, intuyo, pues lo que pregunta es cómo borrar los mensajes de correo en el Servidor: porque él los borra desde el cliente de correo... pero los mensajes no se borran en el Servidor.

dec 04-02-2007 18:33:05

Hola,

Cita:

Empezado por cdar
Hola a todos, estoy empeñado en hacer un cliente de correo, pero en mi delphi 7 no cuento con ningun componente para aplicaciones pop3 ni smtp. Alguien que me pueda ayudar con una liga para bajarlo o que me pueda hacer el favor de pasarmelo. Muchas gracias de ante mano!

Echa un vistazo a los componentes Indy y a sus programas "demos".

roman 06-02-2007 05:05:59

GMail se comporta distinto porque no es un servidor pop3 aunque te permita acceder a él como si lo fuera a efectos de descargar el correo. Repito nuevamente, el protocolo es bastante claro.

// Saludos


La franja horaria es GMT +2. Ahora son las 01:54:21.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi