Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: schumi - Ottobre 10, 2020, 12:17:10 pm

Titolo: ricevere email
Inserito da: schumi - Ottobre 10, 2020, 12:17:10 pm
ho alcuni programmi che inviano email con Indy, ora però avrei necessità di automatizzare la ricezione di file allegati ad una email, qualcuno ha già fatto qualcosa di simile? trovo solo esempi per inviare.

grazie
Titolo: Re:ricevere email
Inserito da: nomorelogic - Ottobre 10, 2020, 01:04:25 pm
so che in Indy10 c'è un pop3 client
potresti partire da li
Titolo: Re:ricevere email
Inserito da: schumi - Ottobre 11, 2020, 06:43:37 pm
Indy ha anche un client IMAP, preferibile lavorando con gsuite, allargando le ricerche senza specificare "lazarus" ho trovato degli esempi delphi.

ora provo a mettere tutto assieme e capire se riesco a scaricare l'allegato.

grazie
Titolo: Re:ricevere email
Inserito da: schumi - Ottobre 12, 2020, 09:11:51 am
mettendo assieme un po' di esempi ho realizzato quello che mi serve, ovvero scaricare un allegato TXT che devo elaborare.
lo posto nel caso servisse a qualcuno

Codice: [Seleziona]
procedure TfrmMain.Button2Click(Sender: TObject);
var
  iCnt, iMsg: Integer;
  IMAPClient: TIdIMAP4;
  OpenSSLHandler: TIdSSLIOHandlerSocketOpenSSL;
  MsgObject: TIdMessage;
  SearchInfo: array of TIdIMAP4SearchRec;
  Attachment: TIdAttachment;
begin
  IMAPClient := TIdIMAP4.Create(nil);
  IMAPClient.IOHandler := nil ;
  try
    try
      // parametri utente
      IMAPClient.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(IMAPClient);
      IMAPClient.Host := 'imap.gmail.com';
      IMAPClient.Port := 993;
      IMAPClient.UseTLS := utUseImplicitTLS;
      IMAPClient.Username := utente;
      IMAPClient.Password := password ;

      try
        IMAPClient.Connect;
      finally
        SetLength(SearchInfo, 1);
       
        SearchInfo[0].SearchKey := skSubject; // skSubject, skFrom, skBody, ecc....
        SearchInfo[0].Text := 'stringa da cercare';

        // cerca nella casella e-mail
        if IMAPClient.SelectMailBox('INBOX') and IMAPClient.SearchMailBox(SearchInfo) then begin

          if Length(IMAPClient.MailBox.SearchResult) >= 0 then begin
            for iCnt := 0 to High(IMAPClient.MailBox.SearchResult) do
            begin
              MsgObject := TIdMessage.Create(nil);
              try
                if IMAPClient.Retrieve(IMAPClient.MailBox.SearchResult[iCnt],MsgObject) then
                begin
                  for iMsg := 0 to MsgObject.MessageParts.Count - 1 do
                  begin
                    if (MsgObject.MessageParts.Items[iMsg] is TIdAttachment) then begin
                      // gestisci allegato
                      Attachment := TIdAttachment(MsgObject.MessageParts.Items[iMsg]);
                      Attachment.SaveToFile(Attachment.Name);
                    end;
                  end;

                end;
              finally
                MsgObject.Free;
              end; 
            end;
          end;
        end; 

      end;

    finally
      IMAPClient.Disconnect;
    end;
  finally
    IMAPClient.Free;
  end;


end;
Titolo: Re:ricevere email
Inserito da: nomorelogic - Ottobre 12, 2020, 09:59:58 am
grazie per la condivisione
servirà sicuramente :)
Titolo: Re:ricevere email
Inserito da: xinyiman - Ottobre 13, 2020, 08:04:10 am
Ottimo. Grazie mille