Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 29-04-2019
juank1971 juank1971 is offline
Miembro
 
Registrado: feb 2008
Posts: 137
Poder: 12
juank1971 Va por buen camino
Busquedas rapidas en buzones de correos

Saludos:
Estoy inmerso en una aplicación de gestión hotelera que quisiera completar con un acceso a unos buzones de correos (3 cuentas de correos) y poder hacer búsquedas de los nombres de los clientes en varios buzones de correos.
Los correos están en pst de Outlook pero ya los tengo convertidos a ficheros de Tunderbir que pensé los podía acceder con mayor facilidad en Delphi pero no encuentro como tampoco.
Me encontré en internet un buen convertidor de pst a varios formatos de correos, que formato de correo me sugieren que convierta los pst para poder acceder con Delphi y extraer la información de todos los correos y poder hacer las búsquedas que necesito desde delphi.
Es que la aplicación en Delphi tiene en las base de datos nombres de clientes y quiero desde esa aplicación en Delphi buscar en el correo de varios especialistas de reservas a ver si encuentro el nombre del cliente en alguna de las cuentas de correo.
Gracias
Juank
Responder Con Cita
  #2  
Antiguo 29-04-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 29.259
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
No está claro lo que necesitas, me parece que tienes un fichero ¿en formato texto? y quieres hacer una búsqueda de emails en el mismo.
Responder Con Cita
  #3  
Antiguo 29-04-2019
juank1971 juank1971 is offline
Miembro
 
Registrado: feb 2008
Posts: 137
Poder: 12
juank1971 Va por buen camino
Jajaj Siempre me pasa que no me explico bien, bueno voy de nuevo,

Tengo Delphi 10.2 y una aplicación conectada a SQL server 2008, la aplicación tiene nombres de clientes por ejemplo ya reservados, pero a veces está mal montada la reserva y la facturadora debe buscar el correo dende se recibe originalmente esa reserva a ver si es el tipo de cama o vista al mar ect lo que pidió originalmente la agencia que reserva para ese cliente,
Entonces mi aplicación que tiene todos los datos y las facturas etc, para agilizar el trabajo de facturación y la especialista de facturación no tenga que ir buscando en cada bandeja de entrada del correo (pst) Outlook yo quisiera hacer una funcionalidad en una base de datos separada también en sql server y aprovechando las búsquedas más rápidas de sql server (full text search ) poder guardar esos correos en una estructura de datos que me permita buscar , por nombre de cliente o por id de reserva etc, que no sea buscar en el Outlook como lo esta haciendo ahora sino yo como programador crear la funcionalidad de poder buscar en una base de datos.
Entonces quisiera encontrar la forma de exportar ese pst a sql server , para guardar los correos que ya tienen y poder hacer búsquedas con mayor rapidez y mediante código yo mismo en mi aplicación.
Ahora explorando me encontré una aplicación llamada aid4mail que exporta pst a muchos formatos, creo que los voy a exportar a htm y luego importar esos a sql server, voy a ver que sale de eso.
Posteriormente tendré que hacer otra aplicación que saque los correos nuevos que siguen llegando y los inserte en sql directo para poder seguir el proceso de búsqueda con los correos futuros que llegan. Creo que ya me explique mejor no . gracias por responder casi.

Última edición por juank1971 fecha: 29-04-2019 a las 20:28:16.
Responder Con Cita
  #4  
Antiguo 29-04-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 29.259
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Con Mozilla Thunderbird puedes guardar todos los mensajes a distintos formatos, luego es fácil leerlos buscando emails.
No sé si te sirve esta opción.


Responder Con Cita
  #5  
Antiguo 30-04-2019
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 147
Poder: 6
bucanero Va camino a la fama
Hola

Yo tengo realizado algo parecido para casar los emails de un determinado cliente con su documentación correspondiente (pedidos, albaranes, etc). Aunque este método solo te serviría a partir del momento en que ya lo tengas implementado, lo emails anteriores quedarían descartados.

Y mi planteamiento es descargar directamente desde el servidor de correo con tu aplicación el email y analizarlo, todo sin intervención por parte de los clientes de correo externos. Para no perder ningún correo de los que vas recibiendo puedes configurar de varias formas:
1.- Siempre que tengas acceso a la administración de las cuentas de correo en el servidor remoto, es realizar desde las cuenta de correo donde se reciben los emails un reenvío (duplicación de los correos) a otra/s cuenta/s que es la que va a procesar tu programa, y en la cual seras tu el encargado de borrar el correo cuando ya no lo necesites. Como ventaja de esta opción es que a nivel de los clientes de correo no tienes que hacer ninguna modificación en su configuración. Y aunque el usuario borre el correo de su bandeja, tu seguirás teniendo una copia en tu cuenta alternativa.
2.- Otra opción es configurar los clientes de correo con la opción mantener una copia del correo en el servidor remoto.
Y ya con esto te puedes conectar para descargar los emails, procesarlos y almacenarlos o descartarlos.

El mayor problema de estos sistemas de extracción de datos es encontrar correctamente los datos dentro de los emails, puesto que cada correo esta formado de una forma totalmente distinta. En mi caso conseguí buenos resultados utilizando la búsqueda con expresiones regulares REGEXP

saludos
Responder Con Cita
  #6  
Antiguo 30-04-2019
juank1971 juank1971 is offline
Miembro
 
Registrado: feb 2008
Posts: 137
Poder: 12
juank1971 Va por buen camino
Gracias por sus comentarios si Casimiro esa es la idea exportarlo de alguna manera, y eso fue lo que hice bucanero, poner cuentas de reenvío en el servidor de correos, si yo soy el administrador de la red y de todo tengo todas las contraseñas de administración.

Ahora si no te es molestia bucanero, me gustaría me comentaras algo de código para la lectura de los correos, yo ya he hecho algo para leer correos de un servidor pop3 y me funciono en momento pero hace mucho tiempo creo que lo probé con indi, coméntame como lo tienes implementado.

Yo realmente lo que quiero es extraer el asunto, el cuerpo y el nombre de los adjuntos, convertirlos a texto todo y guardarlos en sql server en unas tablas como te comentaba indexadas con full text que te permite hacer búsquedas en grandes cantidades de datos de forma instantánea, y guardar los adjuntos en una estructura de carpetas creo que voy a montar una maquina virtual en un server con Windows y el sql server solo para eso con el full text como te comento, coméntame entonces como tienes la estructura para leer el correo, que ya lo tengo todo en cuentas copias solo para eso con una regla de reenvio en el servidor de correos mdaemon. Y dime que hiciste exactamente con las expresiones regulares , gracias
Responder Con Cita
  #7  
Antiguo 30-04-2019
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.599
Poder: 19
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Algo mucho mas sencillo es usar un servicio como

https://www.mailgun.com/smtp

si tienes un relativo volumen medio alto (este lo uso para los emails que generan mis apps) o incluso mas simple aun emplear:

https://zapier.com

Este servicio permite automatizar procesos entre MULTIPLES apis. Por ejemplo para un cliente tengo el de cuando este pone una imagen en dropbox lo sube a un servicio de CDN para imágenes. Hace lo mismo con correos y un montón mas.

Para bajo volumen todo esto es gratis.
__________________
Nuevo Blog.
Ahora en Twitter!.
Responder Con Cita
  #8  
Antiguo 30-04-2019
juank1971 juank1971 is offline
Miembro
 
Registrado: feb 2008
Posts: 137
Poder: 12
juank1971 Va por buen camino
Ahora estuve mirando una forma mas completa de ver el correo cada mensaje con una exportación hecha con el programa aid4mail el exporta los mensajes a el formato mht y puede ser visto cada mensaje con el internet explorer. o algún navegador
Entonces lo mas rápido que se me ocurre es poder exportar los correos en ese formato o en html y guardarlos así mismo en la base de datos sql server, luego de hacer una búsqueda y encontrar la cadena buscada poder abrir ese correo guardado en el mismo Delphi con el componente twebrowser de Delphi que se ve perfecto el correo guardado con ese formato.
Por tanto creo que resuelvo mi problema logrando exportar los correos de mi aplicación en Delphi conectada al servidor de correos y recibir el correo y exportarlo a html o mht y guardarlo . alguna sugerencia mas ¿
Responder Con Cita
  #9  
Antiguo 30-04-2019
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.599
Poder: 19
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Si, agregale full text search:

https://docs.microsoft.com/es-es/sql...ql-server-2017
__________________
Nuevo Blog.
Ahora en Twitter!.
Responder Con Cita
  #10  
Antiguo 03-05-2019
hal1967 hal1967 is offline
Miembro
 
Registrado: feb 2012
Posts: 23
Poder: 0
hal1967 Va por buen camino
IMAP en lugar de pop

Cita:
Empezado por juank1971 Ver Mensaje
yo ya he hecho algo para leer correos de un servidor pop3 y me funciono en momento pero hace mucho tiempo creo que lo probé con indi, coméntame como lo tienes implementado.

Si optas por leer desde el servidor, IdIMAP (indy) es una gran solución. Además yo lo combiné con multihilos y reviso cientos de cuentas en paralelo.


Lo interesante es que con imap, puedes bajar el encabezado y luego decides si bajas el resto del mensaje.


En mi caso particular es una ventaja bajar el encabezado de 1000 mensajes puede ser mas ligero que bajar 3 o 4 mensajes directamente. Si estas buscando un usuario o un asunto revisas así y una vez que tengas el usuario o asunto que busca procedes a bajar el resto del mensaje. Un poco como lo hacen las aplicaciones de correo como Thunderbird.
Responder Con Cita
  #11  
Antiguo 03-05-2019
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 147
Poder: 6
bucanero Va camino a la fama
Post

Cita:
Empezado por juank1971 Ver Mensaje
Yo realmente lo que quiero es extraer el asunto, el cuerpo y el nombre de los adjuntos, convertirlos a texto todo y guardarlos en sql server en unas tablas como te comentaba indexadas con full text que te permite hacer búsquedas en grandes cantidades de datos de forma instantánea, y guardar los adjuntos en una estructura de carpetas creo que voy a montar una maquina virtual en un server con Windows y el sql server solo para eso con el full text como te comento, coméntame entonces como tienes la estructura para leer el correo, que ya lo tengo todo en cuentas copias solo para eso con una regla de reenvio en el servidor de correos mdaemon. Y dime que hiciste exactamente con las expresiones regulares , gracias
Yo lo hago en dos pasos:
El primer paso es descargar todos los correos y almacenarlos en la BBDD, con sus correspondientes campos, Emisor, destinatario, fecha, asunto y cuerpo del email, este proceso no tiene excesiva complicación.

En este paso el mayor problema que puedes tener es determinar si un correo ya lo has descargado o no, puesto que con INDY no hay un campo clave que determine si el email es único, por que se accede por un indice numérico y conforme se van borrando o entrando nuevos emails este se va renumerando.

Yo lo solucione aplicando como campo único para determinar si ya existe, la combinación de la cuenta del emisor y la fecha del mensaje en el formato mas completo de fecha, incluida milésimas de segundo (yyyymmddhhnnssdddd), aunque en teoría con la fecha únicamente si no tienes mucho volumen de email es mas que suficiente, pero creo recordar que en algún momento dos correos entraron tan seguidos que la fecha fue la misma, por lo que con esta combinación, ya no me volvío a suceder.

Y el segundo paso analizar esos emails, adjuntando de forma automática cada email a su correspondiente documento,
-pedidos recibidos desde la web con su pedido en el programa de contabilidad,
-justificantes de pagos desde bancos, paypal, etc, con sus correspondientes facturas, etc.

Para realizar el proceso de búsqueda, se hace a través de una especie de patrones de búsqueda que el usuario tiene que generar, y que se almacenan en la base de datos, y aquí es la parte donde entran en juego las expresiones regulares, que permiten entre comillas de forma fácil reconocer formatos de cadena de texto.

Se genera un patrón de búsqueda por cada tipo de dato que se espera encontrar y por cada emisor.
Y los datos que se almacenan son :
-el tipo de correo del que se trata: pedido, pago, comunicación, etc,
-los datos que se esperan encontrar en un determinado email para considerarlo valido, tales como email de la cuenta emisora, palabras clave en el asunto y/o cuerpo del mensaje, etc.
-Y como extraer los datos validos del email (en mi caso nombres de cliente, direcciones de envío, importes de los pagos, números de pedido, etc)
Se incluye una lista de funciones pre-programadas que el usuario puede seleccionar, y que se aplicaran al correo siempre que cumpla el patrón de búsqueda, estas funciones son bien para poder tratar los datos extráidos, o bien para tratar el propio correo (borrarlo, marcarlo como prioridad, reenviarlo, etc)
Responder Con Cita
  #12  
Antiguo 03-05-2019
juank1971 juank1971 is offline
Miembro
 
Registrado: feb 2008
Posts: 137
Poder: 12
juank1971 Va por buen camino
Ok gracias amigos,
Lo que bucanero, a nosotros los programadores nos gusta más algo de código para poder masticar mejor las ideas, pudieras comentarme de los componentes que estas usando, para
“El primer paso de descargar todos los correos y almacenarlos en la BBDD” si tienes un time, un fragmento de código de la forma de descargar todos los mensajes, porque lo que quiero es con todos los mensajes y guardarlos todos en la base de datos.

Otra duda los adjuntos los guardas en la base de datos también o los tienes en carptetas, y guardas solamente el linck al fichero.
Responder Con Cita
  #13  
Antiguo 03-05-2019
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 147
Poder: 6
bucanero Va camino a la fama
Este es un trozo del código que utilizo para descargar y guardar los correos, en la BBDD

Código Delphi [-]
const
  TableEmail: string = 'EmailRAW';

type
  TDescargarEmails = class(TDataModule)
    IdAntiFreeze1: TIdAntiFreeze;
    IdMessage1: TIdMessage;
    IdPOP31: TIdPOP3;
    IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
    procedure DataModuleCreate(Sender: TObject);
    procedure DataModuleDestroy(Sender: TObject);
  private
    { Private declarations }
    FMailRAW:TStringStream;
    function DescargarEmails: boolean;
    function RetrieveListMailsAndSave: boolean;
    function RetrieveMailAndSave(const AIdx: integer): Boolean;
    function MessageAsSQLString: string;
    function SaveEmail(const values: string): Boolean; overload;
    function SaveEmail: Boolean;  overload;
    function GetMailRaw: string;
    function ExtractBodyHTML(var bodyText: string): string;
    function FindMail(const AMsgId: string): boolean;

  public
    { Public declarations }
  end;

implementation

{%CLASSGROUP 'Vcl.Controls.TControl'}

{$R *.dfm}

uses plogs, Util_MySQL, IdText, IdAttachmentFile, UMyDDBB;

procedure TDescargarEmails.DataModuleCreate(Sender: TObject);
begin
  FMailRAW := TStringStream.Create;

  ///
  /// loadConfigServerPop;
  ///
end;

function TDescargarEmails.SaveEmail: Boolean;
begin
  result := SaveEmail(MessageAsSQLString);
end;

function TDescargarEmails.RetrieveMailAndSave(const AIdx: integer): Boolean;
begin
  result := false;
  try
     // Leemos la cabecera del mensaje
    IdMessage1.Clear;
    FMailRAW.Clear;

      //Se decarga la cabezera del mensaje
    IdPop31.RetrieveHeader(AIdx, IdMessage1);
    result := FindMail(IdMessage1.MsgId);
    if not result then begin
      //se descarga en formato RAW
      IdPop31.RetrieveRaw(AIdx, FMailRAW);
      //se descarga el mensaje completo
      IdPop31.Retrieve(AIdx, IdMessage1);
      result := SaveEmail;
    end;
  except
    on E: Exception do
      logs.Error(E, 'RetrieveMailAndSave', true);
  end;
end;

function TDescargarEmails.SaveEmail(const values: string): Boolean;
begin
  Result:=(Values='') or MyDDBB.Execute(
    'INSERT INTO ' + TableEmail + ' '+
    '(`msgId`, `date`, `fromList`, `bcclist`, `cclist`, `subject`, `bodyText`, `bodyHTML`, `mailRAW`) '+
    'VALUES ' + Values + ' '+
    'ON DUPLICATE KEY UPDATE '+
    '   `msgId`=VALUES(`msgId`), '+
    '   `date`=VALUES(`date`), '+
    '   `fromList`=VALUES(`fromList`), '+
    '   `bcclist`=VALUES(`bcclist`), '+
    '   `cclist`=VALUES(`cclist`), '+
    '   `subject`=VALUES(`subject`), '+
    '   `bodyText`=VALUES(`bodyText`), '+
    '   `bodyHTML`=VALUES(`bodyHTML`), '+
    '   `mailRAW`=VALUES(`mailRAW`) '
  );
end;

function TDescargarEmails.RetrieveListMailsAndSave: boolean;
var
  i: integer;
begin
  Result := true;
  with IdPop31 do
    for i := CheckMessages downto 1 do begin
      try
        if RetrieveMailAndSave(i) then
          Delete(i);
      except
        on E: Exception do
          logs.error(E, self, 'RetrieveListMailsAndSave(#' + IntToStr(i) + ')');
      end;
    end; //For
end;

procedure TDescargarEmails.DataModuleDestroy(Sender: TObject);
begin
  FMailRAW.free;
end;

function TDescargarEmails.DescargarEmails:boolean;
begin
  Result := false;
  // conectamos con el servidor
  with IdPOP31 do
  try
    try
      AutoLogin := True;
      Connect;
      if not Connected then
        logs.Error(Nil, 'No se ha podido conectar con el servidor.', true)
      else if not RetrieveListMailsAndSave then
        logs.Error(Nil, 'No se ha podido descarga los correos del servidor.', true)
      else
        result := true;
    finally
      if Connected then
        Disconnect;
    end;
  except
    on E: Exception do
      logs.Error(E, Self, 'DescargarEmails: Error en el proceso de descarga de correos.', true);
  end;
end;

function TDescargarEmails.ExtractBodyHTML(var bodyText: string): string;
var
  S, ContentType: string;
  I: Integer;
begin
  bodyText := '';
  Result := '';
  I := 0;
  with IdMessage1, MessageParts do
    while (I < count) and (result = '') do begin
      if (Items[i] is TIdAttachmentFile) then begin
        //general attachment

      end
      else if Items[i] is TIdText then begin //body text
        if TIdText(Items[i]).ContentType = 'text/plain' then
          bodyText := UTF8Decode(UTF8Encode(TIdText(Items[i]).Body.Text))
        else
          Result := UTF8Decode(UTF8Encode(TIdText(Items[i]).Body.text));
      end;
      inc(I);
    end;
end;

function TDescargarEmails.FindMail(const AMsgId: string): boolean;
begin
  result := (MyDDBB.RecordCount(
    'SELECT `MsgID`'+ #13#10 +
    'FROM ' + TableEmail + ' '+ #13#10 +
    'WHERE `MsgID` = :msgID',
    [AMsgId]) >= 1);
end;

function TDescargarEmails.GetMailRaw: string;
begin
  result := UTF8Decode(UTF8Encode(FMailRAW.DataString));
end;

function TDescargarEmails.MessageAsSQLString: string;
var
  bodyText: string;
begin
  With IdMessage1  do
    Result := MySQL.AsValue([
        MsgId,        // msgId
        Date,         //date
        UTF8Decode(UTF8Encode(FromList.EMailAddresses)),  //  fromList
        UTF8Decode(UTF8Encode(BccList.EMailAddresses)),   //  bcclist
        UTF8Decode(UTF8Encode(CCList.EMailAddresses)),    //  cclist
        UTF8Decode(UTF8Encode(Subject)),                  //  subject
        UTF8Decode(UTF8Encode(Body.GetText)),             //  bodyText
        ExtractBodyHTML(bodyText),                        //  bodyHTML
        GetMailRaw                                        //  mailRAW
      ])
end;

Espero te puedas hacer una idea.

Una puntualización sobre lo que puse anteriormente, viendo el código ahora nuevamente (este código lo desarrolle hace ya varios años), he visto que las indy si que devuelven un campo identificador único para cada correos y ese valor se almacena en la variable Message1.MsgID ( ya no lo recordaba ), por lo que llevar el control de correos descargados y pendientes es mas fácil.

Cita:
Empezado por juank1971 Ver Mensaje
Ok gracias amigos,
Otra duda los adjuntos los guardas en la base de datos también o los tienes en carptetas, y guardas solamente el linck al fichero.
En cuanto al tema de los adjuntos, por el tipo de correo que yo proceso no suelen llevarlos y no los necesito, así que no los almaceno tampoco

saludos
Responder Con Cita
  #14  
Antiguo 03-05-2019
juank1971 juank1971 is offline
Miembro
 
Registrado: feb 2008
Posts: 137
Poder: 12
juank1971 Va por buen camino
ok gracias
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
aplicaciones mas rapidas ? Celta Varios 1 27-12-2010 16:05:06
graficas rapidas en Tchart zidfrid C++ Builder 1 22-10-2008 16:01:15
consejo ..sobre teclas rapidas ingel Varios 1 15-12-2005 17:18:09
problema con teclas rapidas en formulario MDI ctronx Varios 3 25-02-2005 02:36:22
Teclas rápidas bismarck_sierra OOP 3 27-06-2004 15:48:32


La franja horaria es GMT +2. Ahora son las 06:43:42.


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