Fórum Ler/Receber e-mail com indy #385697

05/09/2010

0

Boa noite a todos.   Estou vasculhando a net desde ontem, ainda não econtrei solução. Por isso recorri ao forum.   Estou tentando fazer uma tela no delphi 2010 usando indy 10 (pop3) para ler meus e-mais no Gmail (por enquanto, quando conseguir quero colocar pra funcionar com qualquer servidor), para enviar e-mail até consegui, agora receber não está dando certo.   Estou usando um demo que baixei do site da indy.   Para configurações do Gmail, estou passando: Host = pop.gmail.com port = 995 Username = meulogin@gmail.com (tb já tentei somente com meulogin) password = minha senha     Abaixo o código:   Showbusy(true);
   ShowStatus('Connecting....');
   if POP.Connected then
      begin
         POP.Disconnect;
      end;
   POP.Host := Pop3ServerName;
   POP.Port := Pop3ServerPort;
   POP.Username := Pop3ServerUser;
   POP.Password := Pop3ServerPassword;
   POP.Connect;
   ToggleStatus(True);
   FMsgCount := POP.CheckMessages;
   FMailBoxSize := POP.RetrieveMailBoxSize div 1024;
   ShowFileStatus;
   if FMsgCount > 0 then
      begin
         ShowFileStatus;
         RetrievePOPHeaders(FMsgCount);
      end
   else
      begin
         ShowStatus('No messages on server');
      end;
   Showbusy(false)     erro: Connection Closed Gracefully.
Com isso não consigo receber meus e-mail por este demo da indy.   Agradeço a todos que puderem ajudar.
Welder

Welder

Responder

Posts

06/09/2010

Leonardo Bertolini

Cara, não sei se pode ser isso...   mas loga com este usuário no gmail...e verifique as configurações da conta....
na aba Encaminhamento e POP/IMAP
e olha se as opções Baixar pelo POP e Acesso IMAP estão ativadas..

flw
Responder

Gostei + 0

06/09/2010

Leonardo Bertolini

Responder

Gostei + 0

06/09/2010

Welder

Boa tarde Leonardo.   Pois é, estou tentando é receber e trabalhar com os e-mails recebidos.   a minha conta no gmail, está ativada para receber e-mails via pop3 e imap, tanto é que recebo pelo outlook.
Responder

Gostei + 0

07/09/2010

Leonardo Bertolini

Cara, testei aqui e funcionou....

só tem um problema.... a propriedade lMsg.Body.Text do TIdMessage não está com o corpo da mensagem.



Segue o codigo:


Var
  lMsg: TIdMessage;
  i: Integer;
  iMsgs: Integer;
begin
  //Configurações
  //TIdPOP3
  with POP3 do begin
    IOHandler := IO_OpenSSL;
    AutoLogin := True;
    Host := 'pop.gmail.com';
    Username := 'sempredelphi@gmail.com';
    UseTLS := utUseImplicitTLS;
    Password := 'senha';
    Port := 995;
  end;

  //TIdSSLIOHandlerSocketOpenSSL
  with IO_OpenSSL do begin
    Destination := 'pop.gmail.com:995';
    Host := 'pop.gmail.com';
    Port := 995;
    SSLOptions.Method := sslvSSLv23;
    SSLOptions.Mode := sslmClient;
  end;

  //Conectando
  if not POP3.Connected then
    POP3.Connect;

  //testa a conexão
  if not POP3.Connected then
  Begin
    ShowMessage('Conexão não realizada!');
    Exit;
  End;

  //Pega a qtd de msg que há na caixa de entrada
  iMsgs := POP3.CheckMessages;

  //Cria DataSet para armazenar os e-mails
  cdsMails.FieldDefs.Add('from',ftString,100);
  cdsMails.FieldDefs.Add('subject',ftString,100);
  cdsMails.FieldDefs.Add('body',ftMemo);
  cdsMails.CreateDataSet;

  lMsg := TIdMessage.Create;

  //Recebe a mensagem
  //todo - Aqui tenho que descobrir como pegar varias mensagens de uma só vez,
  //ou fazer um loop para pegar uma a uma.
  POP3.Retrieve(1, lMsg);

  //Preenchendo o DataSet
  for i := 1 to iMsgs do begin
    cdsMails.Insert;
    cdsMails.FieldByName('from').AsString     := lMsg.From.Name;
    cdsMails.FieldByName('subject').AsString  := lMsg.Subject;
    cdsMails.FieldByName('body').AsString     := lMsg.Body.Text;
    cdsMails.Post;
  end;

  lMsg.Free;
end;

Responder

Gostei + 0

07/09/2010

Leonardo Bertolini

Detalhes:

To usando o Delphi 2010 ....  Indy 10  e as dll's de SSL.  http://indy.fulgan.com/SSL/


flw
 

Responder

Gostei + 0

09/09/2010

Welder

Bom dia.   Eu Também estou usando Delphi 2010 e Indy 10, agora passei as DLL's que até então não estava usando. Agora deu certo. Muito Obrigado.   Para receber as mensagems fiz assim: for i := 1 to iMsgs do
begin
  POP3.Retrieve(i,lMsg);
  TSTringList.Add(lMsg.From.Name);
  TSTringList.Add(lMsg.Subject);
  TSTringList.Add(lMsg.Body.Text);
end;   Agora pra ficar melhor tenho que baixar somente as mensagems não lidas e já marcar como lidas ou excluir. Tem alguma Sugestão?  
Responder

Gostei + 0

09/09/2010

Leonardo Bertolini

Blz..

A propriedade lMsg.Body.Text no meu código não está pegando o conteudo do e-mail (esta vindo vazio)....  no seu deu certinho ???
Quanto a pegar somente as não lidas...   nao fiz maiores testes...tenho que dar uma olhada....  mas acredito que o método Retrieve tenha assinaturas com outros parametros...  para fazer esse serviço...

flw

Responder

Gostei + 0

09/09/2010

Welder

a propriedade lMsg.Body.Text está pegando a mensagem. É que vc colocou num campo tipo memo ai tem que tratar esse campo pra mostar o que está gravado.   Eu usei um stringlist e salvei num arquivo TXT veio todo o corpo da mensagem.
Responder

Gostei + 0

09/09/2010

Leonardo Bertolini

Pois eh, mas não tem nada a ver com o campo MEMO... 
em modo de debug o valor da propriedade text está vazio.... 
mas deve ser coisa boba...depois vou dar uma olhada .... 
flw

Responder

Gostei + 0

09/09/2010

Welder

Ah sim, deve ser uma besteirinha mesmo, fiz aqui igualzinho o código que você passou ai pegou a mensagem direitinho.   Vou dar mais uma implementada. colocar o evento num timer, colocar o sistema pra rodar no systray e tals...   Muito obrigado pela ajuda.
Responder

Gostei + 0

09/09/2010

Leonardo Bertolini

flw ....  





Responder

Gostei + 0

10/09/2010

Eustáquio Fernandes


  AI mande o código ai pra eu tentar implementar aki,sou iniciante e nao entendi muito bem a forma que vcs explicaram
Responder

Gostei + 0

10/09/2010

Welder

O Código é o que o amigo leonardo bertolini escreveu mais acima. VocÊ terá que colocar os componentes no form e nomeá-los da seguinte forma: TIdPOP3 = POP3 TIdSSLIOHandlerSocketOpenSSL = IO_OpenSSL TClientDataSet = cdsMails   Então você coloca um TDataSource e liga no TClientDataSet, coloca um TDBGrid e liga no TDataSource.
Responder

Gostei + 0

10/09/2010

Eustáquio Fernandes

esse código é para receber e-mail e pra enviar.eu utilizo o delphi 2007 tentei fazer isso a um tempo atrás e não dei conta.
Responder

Gostei + 0

10/09/2010

Welder

É só pra receber. No Delphi 2007 acho que você não vai conseguir, estamos usando Delphi 2010.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar