Ver Mensaje Individual
  #1  
Antiguo 04-07-2012
juank1971 juank1971 is offline
Miembro
 
Registrado: feb 2008
Posts: 230
Reputación: 17
juank1971 Va por buen camino
Cliente de correo con formato HTML

Saludos colegas:

He pasado demasiado trabajo buscando como leer el correo mediante delphi y mostrar el contenido que ya siempre es html y no lograba encontrar la manera, como me tomo dos días buscar la solución la posteo en este forum por si alguna necesita lo mismo que yo y no pase tanto trabajo para encontrarlo.

El tema era lo siguiente algo cencillo leer correo con las indi que hay muchos ejemplos incluyendo en esa web, pero el contenido lo guardan siempre en un TMemo, nunca lo había visto en un browser o al menos una idea de como hacerlo, para ver correctamente los mensajes con formato HTML que son los mas comunes.

Entonces Baje este ejemplo de un Cliente de Correo con INDY del siguiente enlace:
http://www.indyproject.org/DemoDownl...MailClient.zip

Después de buscar en varios lugares encontré esta función que les pongo a continuació que lo que hace es mostrar en un TWebBrowser el contenido HTML pasado como parámetro:

Código Delphi [-]
procedure TfrmMain.WBLoadHTML(WebBrowser: TWebBrowser; HTMLCode: string) ;
var
   sl: TStringList;
   ms: TMemoryStream;
begin
   WebBrowser.Navigate('about:blank') ;
   while WebBrowser.ReadyState < READYSTATE_INTERACTIVE do
    Application.ProcessMessages;

   if Assigned(WebBrowser.Document) then
   begin
     sl := TStringList.Create;
     try
       ms := TMemoryStream.Create;
       try
         sl.Text := HTMLCode;
         sl.SaveToStream(ms) ;
         ms.Seek(0, 0) ;
         (WebBrowser.Document as IPersistStreamInit).Load(TStreamAdapter.Create(ms)) ;
       finally
         ms.Free;
       end;
     finally
       sl.Free;
     end;
   end;
end;

Agregan la unit ActiveX en el proyecto para que puedan asignar la clase IPersistStreamInit, en esta línea
Código Delphi [-]
(WebBrowser.Document as IPersistStreamInit).Load(TStreamAdapter.Create(ms)) ;

Porque a cada rato me pasa esto en estos foros, la mayoría de las cosas que se encuentran le faltan a que unit pertenecen algunos procedimientos, funciones o clases extrañas que muchos ni conocemos y a veces nunca se encuentra a cual.

Despues en la unit principal llamada Maind del ejemplo arreglo el codigo de esta manera en el procedimiento RetrieveExecute:

Código Delphi [-]
procedure TfrmMain.RetrieveExecute(Sender: TObject);
  ...........
    ...........
             if Msg.MessageParts.Items[intIndex] is TIdText then
                  begin
                   //  Memo1.Lines.Clear;
                   //  Memo1.Lines.AddStrings(TIdText(Msg.MessageParts.Items[intIndex]).Body);
                     WBLoadHTML(WebBrowser1,TIdText(Msg.MessageParts.Items[intIndex]).Body.Text );
                  end

       ...........
   ...........

Después inserto un TWebBrowser en la forma principal y lo sustituyo por el memo1 eliminando este ultimo. y ya queda resuelto entonces y se muestran todos los correos de una forma completamente espectacular y a la altura de un programa hecho en delphi.
Que despues los de C# ven esas cosas HTML en modo Texto en un Tmemo y dicen mira la basura que logran en delphi.

Salud y pesetas para todos Juank
Responder Con Cita