Foros Club Delphi

Foros Club Delphi (http://www.clubdelphi.com/foros/index.php)
-   Internet (http://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Error al descargar emails con acentos (http://www.clubdelphi.com/foros/showthread.php?t=87459)

bucanero 08-01-2015 20:26:04

Error al descargar emails con acentos
 
Hola amigos,

estoy intentando descargar correos de una cuenta de un servidor propio, y poder extraer cierta información de dichos correos, para lo cual conecto mediante un TIDPOP3 y descargo mediante un TIDMESSAGE, la descarga se realiza hasta aquí perfectamente. El problema viene al tratar de procesar los datos del mensaje, en donde los acentos aparecen de forma extraña (interrogación sobre rombo negro). No ocurre en todos los correos, los que el charset lo detecta y marca como UTF8 van perfectamente, pero los que el charset no lo detecta y lo deja vacio fallan.

Aqui pongo el código que utilizo para conectar y descargar:


Código Delphi [-]
procedure TLeerEmail.ProcessMail;
begin
  With Memo1, lines, IdMessage1 do begin
    Add(IdMessage1.Headers.Text);
    Add('CHARSET: '+IdMessage1.CharSet);
    add('Original ('+IdMessage1.ContentTransferEncoding+'): '+IdMessage1.Subject);
    add('');
    Application.ProcessMessages;
  end;
end;
function TLeerEmail.RetrieveMails(IdPop31: TIdPOP3): boolean;
var
  i, J:integer;
begin
  Result:=true;
  with IdPop31 do
    try
      J:=0;
      For i:= CheckMessages downto 1 do begin
         IdMessage1.Clear;
         RetrieveHeader(i, IdMessage1);   //Decargar la cabezera del correo
         processMail;                     //Procesar los datos del correo

         //se hacen solo 8 correos de ejemplo
         INC(J);
         if J>=8 then break;
      end; //For
    except
       On E:Exception do begin
          result:=false;
          MessageDlg(E.Message, mtError, [mbOK], 0);
       end;
    end;
end;
function TLeerEmail.DescargarEmails: boolean;
var
   i:longint;
begin
  result:=false;
  GetUserPassPop3;
  With IdPOP31 do
    try
      AutoLogin := True;
      Connect;                    // se conecta al servidor
      if not Connected then
        MessageDlg('No se ha podido conectar con el servidor.', mtError, [mbOK], 0)
      else
        try
          Result:=RetrieveMails(IdPop31); //Se descargan los emails
        finally
          if Connected then
            Disconnect;           //Se desconecta del servidor
        end;
     except
         On E:Exception do
           MessageDlg('DescargarEmails: Error al conectar con el servidor.', mtError, [mbOK], 0);
     end;
end;


Analizando mas a fondo el contenido del mensaje que falla, se ve que esta codificado en WINDOWS-1252,
pero por mas que he probado ha cambiar el CHARSET antes y/o déspues de leer el mensaje o convertir las cadenas con las funciones de conversión entre codificicaciones, no he
conseguido solucionar el problema.


Comento que los componentes INDY son la versión 10.6.0.4975 que se supone que tienen ya resuelto todo el tema de codificación para los distintos caracteres
y esto lo ejecuto sobre DELPHI XE4

Agradecería cualquier ayuda al respecto :)

nlsgarcia 09-01-2015 08:44:03

bucanero,

Cita:

Empezado por bucanero
...estoy intentando descargar correos de una cuenta de un servidor propio...El problema viene al tratar de procesar los datos del mensaje, en donde los acentos aparecen de forma extraña...Analizando mas a fondo el contenido del mensaje que falla, se ve que esta codificado en WINDOWS-1252...ejecuto sobre Delphi XE4...

:rolleyes:

Te comento:

1- A partir de Delphi 9, la codificación de string por default es Unicode.

2- El codepage 1252 corresponde al tipo de string : AnsiString.

3- Pregunto : ¿Has probado mover el mensaje a una variable de tipo AnsiString?.

Revisa esta información:
Espero sea útil :)

Nelson.

bucanero 09-01-2015 12:04:25

Hola Nelson, gracias por responder tan rápido


Si, ya mire las opciones de conversión de tipos, pero no he obtenido ningún resultado. De hecho uno de los códigos que he probado para convertir a ANSI es este:


Código Delphi [-]
procedure convertir(texto:string);
type
  TWindows1252String = type AnsiString(1252);
var
  sW1252:TWindows1252String;

begin
...
  sW1252:=texto;
...
end;

Aqui pongo la parte del mensaje donde viene el asunto con el formato de codificacion


Código:

Subject: =?windows-1252?Q?Art=EDculo_n=2E=BA_251761373688=3A_Notificaci=F3n_de?=
 =?windows-1252?Q?_de_***?=
 =?windows-1252?Q?_=28user=40***=2E***=29?=


Buscando por google este problema, he encontrado varios enlaces antiguos anteriores al 2009 donde indican que este es un BUG de los componentes INDY para este tipo de codificación, pero no se si ha día de hoy andará ya resuelto.

Alguien que le pase algo similar y pueda indicar como lo ha solucionado

Un Saludo


La franja horaria es GMT +2. Ahora son las 17:43:19.

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