Ler/Receber e-mail com indy

Delphi

05/09/2010

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

Curtidas 1

Respostas

Leonardo Bertolini

Leonardo Bertolini

05/09/2010

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
GOSTEI 0
Leonardo Bertolini

Leonardo Bertolini

05/09/2010

GOSTEI 0
Welder

Welder

05/09/2010

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.
GOSTEI 0
Leonardo Bertolini

Leonardo Bertolini

05/09/2010

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;

GOSTEI 0
Leonardo Bertolini

Leonardo Bertolini

05/09/2010

Detalhes:

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


flw
 

GOSTEI 0
Welder

Welder

05/09/2010

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?  
GOSTEI 0
Leonardo Bertolini

Leonardo Bertolini

05/09/2010

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

GOSTEI 0
Welder

Welder

05/09/2010

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.
GOSTEI 0
Leonardo Bertolini

Leonardo Bertolini

05/09/2010

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

GOSTEI 0
Welder

Welder

05/09/2010

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.
GOSTEI 0
Leonardo Bertolini

Leonardo Bertolini

05/09/2010

flw ....  





GOSTEI 0
Eustáquio Fernandes

Eustáquio Fernandes

05/09/2010


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

Welder

05/09/2010

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.
GOSTEI 0
Eustáquio Fernandes

Eustáquio Fernandes

05/09/2010

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.
GOSTEI 0
Welder

Welder

05/09/2010

É só pra receber. No Delphi 2007 acho que você não vai conseguir, estamos usando Delphi 2010.
GOSTEI 0
Eustáquio Fernandes

Eustáquio Fernandes

05/09/2010

por acaso você não tem um código que serve pra mim não???
GOSTEI 0
Eustáquio Fernandes

Eustáquio Fernandes

05/09/2010

o mesmo código vale pro delphi 2007????
GOSTEI 0
Leonardo Bertolini

Leonardo Bertolini

05/09/2010

Pro delphi 2007 só muda as dll's .... que vc baixa em  http://indy.fulgan.com/SSL/Archive/
GOSTEI 0
Renan Gouvea

Renan Gouvea

05/09/2010

queria saber como fazer pa carregar email que contenha imagem nele, segui os passos que vcs passaram mas so pega o texto. queria pro caso de email que seja so imagem por exemplo.
GOSTEI 0
Leonardo Bertolini

Leonardo Bertolini

05/09/2010

|Cara. vc vai ter que usar a propriedade MessageParts do TIdMessage...

Nela da pra separar ...os anexos...   imagens  etc..

mas não desenvolvi ese codigo ainda...  se eu fizer eu posto...

flw
GOSTEI 0
Welder

Welder

05/09/2010

Bom dia Leonardo.   Você conseguiu pegar o corpo da mensagem? Com conta do Gmail eu peguei tranquilamente, quando mudei para um dominio que uso pessoal a mensagem não veio.   Será que tem alguma coisa a ver com html?
GOSTEI 0
Welder

Welder

05/09/2010

Olha como consegui pegar o corpo da msg. for i := 1 to iMsgs do
  begin
    POP3.Retrieve(i, lMsg);
    for iMsgs := 1 to lMsg.MessageParts.Count - 1 do
    begin
      if lMsg.MessageParts.Items[iMsgs] is TIdText then
      begin
        sTexto := TIdText(lMsg.MessageParts.Items[iMsgs]).Body.Text;
      end;
      POP3.Delete(iMsgs);
    end;
  end;     --Agora o Delete que não está funcionado. A mensagem não sai do servidor.
GOSTEI 0
Welder

Welder

05/09/2010

Boa tarde.   Consegui pegar as mensagens, excluir e tals.....mensagem tipo texto. Mas preciso tratar algumas mensagem tipo xml ou html como essa:  <object><class>TObjSMS</class><pssms>Corpo do SMS</pssms><pslistcelulares><object><class>TList</class><items><object><class>TCelular</class><numero>xxxxxxxxxxx</numero></object><object><class>TCelular</class><numero>xxxxxxxxxx</numero></object></items></object></pslistcelulares></object>
Mas quando leio  body.text ou body.savetofile a mensagem não fica exatamente como está no servidor o componente faz uma bagunça com o texto.
GOSTEI 0
Leonardo Bertolini

Leonardo Bertolini

05/09/2010

Conseguiu deletar com o POP3.Delete()  mesmo ????

GOSTEI 0
Welder

Welder

05/09/2010

Isso mesmo.   e para tratar as mensagems em formato tipo xml eu tentei usar o componete activex chilkatmail, funcionou perfeitamente, mas como é pago voltei para o indy e fiz um stringreplace na variavel que recebe o corpo da mensagem. Funcionou legal.    
GOSTEI 0
Leonardo Bertolini

Leonardo Bertolini

05/09/2010

Pois eh...   joguei o delete aqui a gora mas não funcionou nao ?  ...   

o Delete recebe um inteiro (NumMsg)...   vc ta jogando no delete(Integer)...   a mesma variavel inteira que usou do Retrieve()..   ??


GOSTEI 0
Welder

Welder

05/09/2010

Estou usando a várial inteiro que usei no CheckMessages, depois faço um for (for iMsgs := 1 to lMsg.MessageParts.Count - 1 do)   trato o que quero aqui e no fim faço POP3.Delete(iMsgs);   Ah Leonardo, tem que fazer um disconect no final de tudo, senão não apaga. Foi o que percebi. Tenta ai e me posta aqui o resultado.
GOSTEI 0
Leonardo Bertolini

Leonardo Bertolini

05/09/2010

Eu vi que tem que dar o disconect...   mas mesmo com ele nao funcionou....     entretanto de qualquer forma ele marca a msg de alguma forma...pois ele nao baixa a mesma duas vezes....      mas vou tentar aqui ... 
GOSTEI 0
Leonardo Bertolini

Leonardo Bertolini

05/09/2010

Aqui....   acho que ele só marca mesmo como excluida...     para nao baixar a mesma msg da proxima vez...


mas se vc entrar no gmail via browser...  as mensagens sempre vao estar la... 


Ou no seu gmail as mensagens foram excluidas ?



GOSTEI 0
Welder

Welder

05/09/2010

olha o código, ficou pequeno dá pra tirar uma ideia.   Var
  lMsg: TIdMessage;
  i: Integer;
  iMsgs: Integer;
  sEmail : TStringList;
  sTexto : String;
begin
  //Configurações
  //TIdPOP3
  with POP3 do begin
    IOHandler := IO_OpenSSL;
    AutoLogin := True;
    Host := 'pop.clubedelphi.com.br';
    Username := 'clubedelphi@clubedelphi.com.br';
    UseTLS := utUseImplicitTLS;
    Password := 'senha';
    Port := 995;
  end;   //TIdSSLIOHandlerSocketOpenSSL
  with IO_OpenSSL do begin
    Destination := 'pop.clubedelphi.com.br:995';
    Host := 'pop.clubedelphi.com.br';
    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;   sEmail := TStringList.Create;
  lMsg := TIdMessage.Create;
  lMsg.Encoding := meMIME;   //Recebe a mensagem
  for i := 1 to iMsgs do
  begin
    POP3.Retrieve(i, lMsg);     for iMsgs := 1 to lMsg.MessageParts.Count - 1 do
    begin
      if lMsg.MessageParts.Items[iMsgs] is TIdText then
      begin
        sTexto := TIdText(lMsg.MessageParts.Items[iMsgs]).Body.Text;
        sTexto := StringReplace(sTexto,'&lt;','<',[rfReplaceAll, rfIgnoreCase]);
        sTexto := StringReplace(sTexto,'&gt;','>',[rfReplaceAll, rfIgnoreCase]);
        sTexto := StringReplace(sTexto,'<br>','',[rfReplaceAll, rfIgnoreCase]);
      end;
      sEmail.Add(sTexto);
      POP3.Delete(iMsgs);
    end;
  end;
  try
    sEmail.SaveToFile('C:\email.xml');
  finally
    POP3.Disconnect;
    lMsg.Free;
    sEmail.Free;
    ShowMessage('Arquivo gerado.');
  end;
end;
GOSTEI 0
Manja

Manja

05/09/2010

gente, boa noite. eu fiz a recepção de email conforme o exemplo abaixo. porem ele nao entra no loop da messageparts. Alguem saberia me dizer porque?
GOSTEI 0
Felipe Arruda

Felipe Arruda

05/09/2010

Alguem desse post poderia me ajudar nisso???
GOSTEI 0
POSTAR