Autor
Mensagem
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.
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.
Ia indicar este post.. mas esse só faz o envio...
http://www.devmedia.com.br/post-17880-Enviando-e-mail-utilizando-o-SMTP-do-GMAIL--Delphi-2010-Rad-Studio-Indy-10.html
http://www.devmedia.com.br/post-17880-Enviando-e-mail-utilizando-o-SMTP-do-GMAIL--Delphi-2010-Rad-Studio-Indy-10.html
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;
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;
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?
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?
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
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
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.
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.
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.
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.
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.
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.
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,'<','<',[rfReplaceAll, rfIgnoreCase]);
sTexto := StringReplace(sTexto,'>','>',[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;
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,'<','<',[rfReplaceAll, rfIgnoreCase]);
sTexto := StringReplace(sTexto,'>','>',[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;





