Certa vez, tive que implementar uma funcionalidade no meu software que enviasse um e-mail automático para um cliente com um anexo. Porém, o usuário não queria que houvesse interação com o cliente de e-mail (Outlook, Thunderbird…) por questões organizacionais, portanto, o e-mail deveria ser enviado diretamente pela aplicação.
Após algumas pesquisas na internet, tentativas e testes, consegui implementar a função com sucesso. Hoje venho trazer a minha contribuição para a implementação dessa funcionalidade com o Delphi 7, configurando todos os parâmetros em tempo de execução. Let’s get started!
Atualização 08/06/2015: Se você estiver utilizando o Delphi XE, confira o outro artigo neste link!
Introdução
Neste exemplo, usarei as configurações do servidor do Gmail para o envio do e-mail, porém, nada impede que outro servidor seja utilizado, desde que as configurações sejam definidas corretamente.
Para implementar essa funcionalidade é necessário 3 componentes que fazem parte do conjunto Indy: TIdSMTP
, TIdSSLIOHandlerSocket
e TIdMessage
. No exemplo deste artigo, os 3 componentes serão criados dinamicamente, ou seja, eles serão declarados, instanciados, utilizados e então liberados da memória em um único método.
Em primeiro lugar, precisamos das bibliotecas para conexão SSL. São duas DLLs que devem ser colocadas dentro da pasta onde está o executável. Clique aqui para baixá-las.
Codificação
Em seguida, já no projeto, devemos declarar as units que fazem referência à estes 3 componentes:
1 2 |
uses IdSMTP, IdMessage, IdSSLOpenSSL; |
Por fim, basta implementar o código abaixo no botão que fará o envio do e-mail:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
var // objetos necessários para o funcionamento IdSSLIOHandlerSocket: TIdSSLIOHandlerSocket; IdSMTP: TIdSMTP; IdMessage: TIdMessage; CaminhoAnexo: string; begin // instanciação dos objetos IdSSLIOHandlerSocket := TIdSSLIOHandlerSocket.Create(Self); IdSMTP := TIdSMTP.Create(Self); IdMessage := TIdMessage.Create(Self); try // Configuração do SSL IdSSLIOHandlerSocket.SSLOptions.Method := sslvSSLv23; IdSSLIOHandlerSocket.SSLOptions.Mode := sslmClient; // Configuração do SMTP IdSMTP.IOHandler := IdSSLIOHandlerSocket; IdSMTP.AuthenticationType := atLogin; IdSMTP.Port := 465; IdSMTP.Host := 'smtp.gmail.com'; IdSMTP.Username := 'usuario'; IdSMTP.Password := 'senha'; // Tentativa de conexão e autenticação try IdSMTP.Connect; IdSMTP.Authenticate; except on E:Exception do begin MessageDlg('Erro na conexão e/ou autenticação: ' + E.Message, mtWarning, [mbOK], 0); Exit; end; end; // Configuração da mensagem IdMessage.From.Name := 'Meu Nome'; IdMessage.ReplyTo.EMailAddresses := IdMessage.From.Address; IdMessage.Subject := 'Assunto do e-mail'; IdMessage.Body.Text := 'Corpo do e-mail'; // Anexo da mensagem (opcional) CaminhoAnexo := 'C:\Anexo.txt'; if FileExists(CaminhoAnexo) then TIdAttachment.Create(IdMessage.MessageParts, CaminhoAnexo); // Envio da mensagem try IdSMTP.Send(IdMessage); MessageDlg('Mensagem enviada com sucesso.', mtInformation, [mbOK], 0); except On E:Exception do MessageDlg('Erro ao enviar a mensagem: ' + E.Message, mtWarning, [mbOK], 0); end; finally // liberação dos objetos da memória FreeAndNil(IdMessage); FreeAndNil(IdSSLIOHandlerSocket); FreeAndNil(IdSMTP); end; end; |
Ao clicar no botão, haverá uma pausa de alguns segundos durante a conexão, autenticação e envio da mensagem. Nesse meio tempo, teremos a impressão de que a aplicação estará “travada”. A solução é implementar uma tela de espera, exibir uma mensagem ou utilizar uma Thread para que o envio seja feito em um fluxo paralelo de processamento, evitando o efeito de travamento.
Embora as propriedades no exemplo acima tenham sido atribuídas em tempo de execução, elas podem ser simplesmente definidas em tempo de projeto, utilizando o Object Inspector do Delphi. Se for um e-mail com valores fixos (conta de e-mail, servidor, assunto), talvez essa possa ser a melhor opção. Do mesmo modo, você também pode definir alguns valores fixos em tempo de projeto e informar outros valores em tempo de execução, como o destinatário e o corpo da mensagem, digitados pelo usuário em caixas de texto. No exemplo, apenas decidi por definir tudo em tempo de execução para facilitar a compreensão.
Bônus
Caso você pretenda enviar um e-mail pelo Outlook desktop, a implementação também é bem simples!
Primeiro, declare a unit ComObj na uses do seu formulário:
1 2 |
uses ComObj; |
E no botão para envio do e-mail, use este código:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
var Outlook: OleVariant; vMailItem: variant; const olMailItem = 0; begin try Outlook := GetActiveOleObject('Outlook.Application'); except Outlook := CreateOleObject('Outlook.Application'); end; vMailItem := Outlook.CreateItem(olMailItem); vMailItem.Subject := 'Assunto do e-mail'; vMailItem.Body := 'Corpo do e-mail'; vMailItem.Attachments.Add('C:\Anexo.txt'); vMailItem.GetInspector.Activate; vMailItem.Display(True); VarClear(Outlook); end; |
Espero que os ajudem!
Abraço e até a próxima!
Eu utilizo esta forma, ótima dica Batera, abraço.
Opa, obrigado pelo comentário, Ivan! Grande abraço!
Bom dia…Sou fã do seu site!!!!
Poderia postar na area exemplos o Codigo do Envio de e-mail? Eu estudo Delphi por conta…e é bem interessante ver as o codigo rodando, me ajuda na compreenção.
Olá, Benedito! Fico contente que tenha gostado do blog. Obrigado!
Em breve vou postar o exemplo no blog, ok?
A respeito dos e-mails estilo newsletter, há diferentes formas de implementá-los. Uma delas seria adicionar uma página HTML no corpo do e-mail, utilizando o Body.LoadFromFile do TIdMessage. Outra forma seria enviar apenas o link no e-mail e carregá-la no evento OnLoad da página através de uma função JavaScript.
Abraço!
Outra pergunta. Como enviar emaisl tipo aqueles que recebemos do Extra, Pernambucanas etc… onde o corpo do email aparece na tela com imagens…configurações…
Boa tarde!
Prezado André,
estou iniciando da programação através do Delphi e já estou desenvolvendo um programa de controle para que possa me ajudar cada vez mais no meu trabalho.
Estou com duvida para poder executar uma tarefa da seguinte forma:
criei uma dbgrid que vai apresentar um tabela de materiais com 10 colunas com informações necessárias.
criei um campo Tedit para digitar um texto( ex: projeto no codigo abaixo ) a ser procurado + um botão de busca. criei uma clausula Sql e busca legal.
sendo assim o codigo:
procedure TFrmBarueri.btnPesquisarClick(Sender: TObject);
begin
Dm.ADOQueryBarueri.SQl.Clear;
Dm.ADOQueryBarueri.Close;
Dm.ADOQueryBarueri.SQL.Add(‘select * from TblBarueri’);
Dm.ADOQueryBarueri.SQL.Add(‘where projeto like’ + quotedstr(valorcampo.Text + ‘%’) + ‘order by projeto,item’);
Dm.ADOQueryBarueri.Open;
end;
mas o que preciso mesmo, é adicionar uma caixa de seleção que contenha o nome das colunas para que na hora da pesquisa eu possa primeiro selecionar qual coluna será pesquisada no digitado no Tedit. sendo assim, quero que apresente toda a tabela mas que busque em ordem o que eu digitar conforme seleção da coluna.
pode me ajudar montando um codigo com as colunas ( codigo, descrição, Lista de projeto,tanque e pc )com o botão de busca (pesquisar)?
no aguardo da sua ajuda.
Olá, Eliomar! Vou elaborar um exemplo bem básico e enviar para o seu e-mail, ok? Vamos conversando para encontrar a melhor solução.
Obrigado pela visita!
Muito bom cara! Procurei em todo lugar e não dava jeito, essa sua implementação foi show de bola! Obrigado!
Olá, Danilo! Que bom que o artigo lhe serviu! Obrigado pelo feedback!
André, ótimo mesmo,consegui implementar com banco de dados, e um menu de configuração, ficou muito bom, só que caso envie um e-mail sem algum arquivo anexo, ocorre um erro de envio, poderia me ajudar por favor ???
Olá, Leonardo! Vou entrar em contato para pedir informações sobre o erro. Abraço!
Ola André,
Eu também usava desta forma o envio de e-mails e funcionava perfeitamente.
Porem começou apresentar um erro:
“5.7.0 must issue a starttls command first delphi idsmtp usetls”
sendo que não estou mais conseguindo enviar e não consegui descobrir o motivo mesmo após pesquisas e tentativas.
Você ja passou por algo parecido?
Olá, Leonardo!
Obrigado pela visita. Vou entrar em contato com você para pedir mais detalhes do cenário, ok?
Abraço!
Olá,
uma duvida o usuario e a senha qual seria?
Olá, Liz. O usuário e senha são as suas informações do servidor que você está utilizando. No artigo, mencionei o Gmail como modelo. Por exemplo, o usuário e senha poderiam ser ‘[email protected]’ e ‘123456’, respectivamente.
Olá,
a linha
TIdAttachment.Create(IdMessage.MessageParts, ‘C:\Anexo.txt’);
está apresentando erro.
Sem adicionar o anexo o e-mail esta sendo enviado, mas a linha que adiciona o anexo está apresentando erro.
Obrigado!
Olá, Igor!
Rapaz, tem razão, o envio realmente estava falhando devido à essa linha. Atualizei o artigo e coloquei uma condição para que o erro não ocorra.
Obrigado pelo aviso. Abraço!
No Delphi XE o comando TIdAttachment.Create aparentemente não existe, alterei para TIdAttachmentFile.Create e funcionou perfeitamente.
Obrigado!
Exatamente, Igor! O exemplo deste artigo é exclusivo para Delphi 7. No Delphi XE é necessário realizar alguns ajustes no código para funcionar corretamente. Abraço!
Bom dia, estou tentando utilizar o seu código para abrir o thunderbird e não estou encontrando nenhuma solução, tens alguma dica?
Olá, Tiago! Ainda não tive a necessidade de implementar um código no Delphi para trabalhar com o Thunderbird. Mesmo assim, me parece que o Thunderbird aceita alguns comandos via prompt, portanto, talvez funcione dessa forma:
ShellExecute(Handle, 'pasta-do-thunderbird\thunderbird.exe',
'-compose "[email protected],attachment=''file:///c:/test.txt''",
nil, SW_SHOWNORMAL);
Abraço!
Esta ocorrendo um erro quando faço o teste para enviar o e-mail.
Project Pj_Envia_Email.exe raised Exception class EIdOSSL ConnectError with message ‘Error connecting with SSL.’. Process stopped. Use Step or Run to continue.
Poderia me ajudar?
Olá, Derik! Vou entrar em contato com você por e-mail, mas aparentemente está faltando as bibliotecas do SSL no seu projeto. Abraço!
Caraca, o blog é muito fera! Vou começar a acompanhar!
Eu curso Técnico em Informática na cidade de Ribeirão Preto, e ainda estamos cru no quesito Delphi hehehe.
Me tire uma dúvida? Esse código vai me servir usando o RAD Studio 2009? Eu fiz tudo conforme o tutorial e não deu certo, acusando o erro “Declaration expected but identifier ‘IdSMTP’ found”
Ribeirão Preto? Rapaz, é a cidade do meu coração! Morei 2 anos nessa cidade e gostei muito!
Fabiano, este código é exclusivo para o Delphi 7, portanto, caso você queira utilizá-lo em versões mais recentes, algumas modificações devem ser feitas. Mesmo assim, o erro que está acusando no seu código parece ser um equívoco de sintaxe. Vou pedir o seu código por e-mail, ok? Abraço!
saudações andre.
muito interessante a dica, implementei e funciona.
só que estou com um problema, já faz um tempo e não consigo resolver, já procurei por tudo e e não estou achando.
acontece que eu uso o postgres nos meus aplicativos e as versões do ssleay32.dll do postgres e do indy são diferentes. quando funciona o indy, não funciona o postgres e vice-versa.
já tentei colocor a versão que o indy usa dentro da pasta do projeto e do postgres no system32, mas prevalece a dll que carregou primeiro.
já tentei dentro do idSSLOpenSSLHeader.pas trocar o nome da dll para a outra versão, também sem sucesso.
tens como me ajudar nesse quesito?
Olá, Adolfo! Eu não trabalho com PostgreSQL há um tempo, mas talvez eu possa lhe ajudar.
Se não me engano, as versões mais recentes do Indy conciliam ambos os recursos (Indy e PostgreSQL), e está disponível neste endereço:
http://indy.fulgan.com/SSL/
Porém, se as DLLs já estiverem registradas no Windows, não basta apenas substituí-las. Será necessário remover o registro (utilizando o comando regsvr32 /u do Windows) e então registrá-las novamente.
Lembre-se também de mantê-las em apenas um local, ou seja, na pasta do projeto OU na System32.
Abraço!
Nossa, vc é excelente, eu estava a meses procurando algo funcional com o Delphi 2010 para o envio de email e finalmente encontrei o seu site, foi só fazer algumas alterações e funcionou perfeitamente, muito obrigado
Opa, Leandro, fico feliz em saber que a dica tenha lhe ajudado!
Abraço!
André, muito bom a sua matéria, demais funcionou perfeito de primeira com o meu e-mail do gmail.
Mas eu estou precisando utilizar um e-mail do terra que não tem SSL. você poderia me orientar como resolver este problema ? Obrigadão e um abraço. Parabéns !!!
Olá, Ricardo! Recebi a notificação do seu outro comentário antes de responder e notei que você conseguiu fazer a conexão!
A propósito, obrigado pela colaboração! Abraço!
Olá André, consegui enviar e-mail pelo meu e-mail do terra que não usa SSL.
Segue código do botão para os amigos do blog.
Mais uma vez obrigado pela dica.
var
// objetos necessários para o funcionamento
IdSMTP: TIdSMTP;
IdMessage: TIdMessage;
CaminhoAnexo: string;
begin
// instanciação dos objetos
IdSMTP := TIdSMTP.Create(Self);
IdMessage := TIdMessage.Create(Self);
try
// Configuração do SMTP
IdSMTP.AuthenticationType := atLogin;
IdSMTP.Port := 587;
IdSMTP.Host := ‘smtp.sao.terra.com.br’;
IdSMTP.Username := ‘[email protected]’;
IdSMTP.Password := ‘senha_email_terra’;
// Tentativa de conexão e autenticação
try
IdSMTP.Connect;
IdSMTP.Authenticate;
except
on E:Exception do
begin
MessageDlg(‘Erro na conexão e/ou autenticação: ‘ +
E.Message, mtWarning, [mbOK], 0);
Exit;
end;
end;
// Configuração da mensagem
IdMessage.From.Address := ‘[email protected]’;
IdMessage.From.Name := ‘Ricardo – Terra’;
IdMessage.ReplyTo.EMailAddresses := IdMessage.From.Address;
IdMessage.Recipients.EMailAddresses := ‘[email protected]’;
IdMessage.Subject := ‘Assunto do e-mail’;
IdMessage.Body.Text := ‘Teste de Corpo do e-mail para o terra’;
// Anexo da mensagem (opcional)
CaminhoAnexo := ‘C:\Anexo.txt’;
if FileExists(CaminhoAnexo) then
TIdAttachment.Create(IdMessage.MessageParts, CaminhoAnexo);
// Envio da mensagem
try
IdSMTP.Send(IdMessage);
MessageDlg(‘Mensagem enviada com sucesso.’, mtInformation, [mbOK], 0);
except
On E:Exception do
MessageDlg(‘Erro ao enviar a mensagem: ‘ +
E.Message, mtWarning, [mbOK], 0);
end;
finally
// liberação dos objetos da memória
FreeAndNil(IdMessage);
FreeAndNil(IdSMTP);
end;
Olá André…
Sou de Blumenau-SC, espero que possa ajudar referente a transmissão e recepção de e-mail pelo delphi2007… estou usando os componentes do Indy e está funcionando tudo certo, porém agora estou com o seguinte problema, precisava gravar meus e-mail em uma pasta específica, isto é, quando envio os e-mail quero que o servidor de e-mail “jogue” este e-mail para outra pasta que não seja a pasta ENTRADAS… E ao pedir para ler e-mail quero que leia da pasta que eu criei no servidor de e-mail e não da pasta ENTRADAS… Tem como?
Olá, Jairo!
Como se trata de uma configuração do servidor de destino, acredito que não exista uma forma de fazer esse direcionamento de pastas. Isso é uma configuração de quem irá receber o e-mail, logo, não temos controle. Mesmo assim, vou entrar em contato com você por e-mail, ok?
Abraço!
Usei esta dica e Esta dando o seguinte erro.
Socket error #10061 connection refused voces sabem que erro e este.
Olá, Ignacio! Este erro pode ocorrer por vários motivos, mas, em linhas gerais, provavelmente há algo impedindo a conexão com o servidor. Vou entrar em contato com você por e-mail para tentar ajudá-lo melhor. Abraço!
Olá, muito boa sua dica, no meu caso eu preciso enviar o mesmo email para mais de um destinatário, você sabe o que eu posso fazer? Grato desde já!
Olá, Alexsander! Ótima pergunta.
Para enviar o e-mail para mais de um destinatário, basta substituir a linha:
IdMessage.Recipients.EMailAddresses := '[email protected]';
por:
IdMessage.Recipients.Add.Text := '[email protected]';
IdMessage.Recipients.Add.Text := '[email protected]';
Abraço!
Ola andre esta aparecendo a seguinte mensagem no meu codigo..
“failed to set data for ””
quando executo meu codigo, o que pode ser?
Olá, Julio. Vou entrar em contato com você por e-mail para solicitar o seu código, ok?
Abraço!
Olá André, me manda um e-mail, quero tirar uma dúvida sobre meu código se possível…
Aguardo.
Ok, Fernando, vou entrar em contato.
Grande André!!
Cara, estou usando o Delphi XE2. Quando copio as dlls disponibilizadas no artigo aparece a mensagem “Cold not load SSL Library”. Elas estao dentro do diretório do executavel do projeto. O que pode ser?
Olá, Gustavo! Para ficar mais fácil, vou orientá-lo por e-mail, ok? Abraço!
Boa Tarde André, tenho que fazer essa mesma aplicação com autenticação TLS como faço??? Host para envio: smtp.office365.com
Olá, André! Para o Office 365, essa é a configuração:
// Configuração do SSL
IdSSLIOHandlerSocket.SSLOptions.Method := sslvTLSv1;
IdSSLIOHandlerSocket.PassThrough := True;
IdSSLIOHandlerSocket.SSLOptions.Mode := sslmServer;
// Configuração do SMTP
IdSMTP.IOHandler := IdSSLIOHandlerSocket;
IdSMTP.AuthenticationType := atLogin;
IdSMTP.Port := 587;
IdSMTP.Host := 'smtp.office365.com';
IdSMTP.Username := 'usuario';
IdSMTP.Password := 'senha';
Abraço!
Prezado André,
Estou com o mesmo problema do colega Gustavo Santini,“Cold not load SSL Library”. Elas estao dentro do diretório do executavel do projeto.
utilizo Delphi XE5.
Olá, Geibel! Diferente de versões anteriores, os Delphi XE+ não cria o executável na mesma pasta onde está o arquivo DPR. Essa versão, por padrão, cria o executável dentro da pasta “Debug\WinXX”, portanto, verifique se as DLLs do Indy estão dentro dessa pasta. Além disso, experimente também baixar a versão mais recente da biblioteca do Indy no site:
http://indy.fulgan.com/SSL/
Abraço!
André, está dando erro no IdSMTP.Send(Mensagem);
Erro: With message “5.7.1” Client was not Authenticated enviei meu código no seu email para você ver… Estou usando Delphi7.
André, lhe enviei outro e-mail! Vamos conversando por lá, ok? Abraço!
Caro André,
Atualizei as DLLs e ultrapassei esta etapa.
O sistema trava ao tentar conectar no IDSMTP.Connect
segue meu código Delphi XE5:
implementation
Uses IdSMTP, IdMessage, IdSSLOpenSSL, IdAttachmentFile;
{$R *.dfm}
procedure TFrmEnviarEmail.BtnEnviarEmailClick(Sender: TObject);
var
// objetos necessários para o funcionamento
IdSSLIOHandlerSocket: TIdSSLIOHandlerSocketOpenSSL;
IdSMTP: TIdSMTP;
IdMessage: TIdMessage;
CaminhoAnexo: string;
begin
// instanciação dos objetos
IdSSLIOHandlerSocket := TIdSSLIOHandlerSocketOpenSSL.Create(Self);
IdSMTP := TIdSMTP.Create(Self);
IdMessage := TIdMessage.Create(Self);
try
// Configuração do SSL
IdSSLIOHandlerSocket.SSLOptions.Method := sslvSSLv23;
IdSSLIOHandlerSocket.SSLOptions.Mode := sslmClient;
// Configuração do SMTP
IdSMTP.IOHandler := IdSSLIOHandlerSocket;
IdSMTP.AuthType := satSASL; // Tentei o satNone e satDefault
IdSMTP.Port := 465;
IdSMTP.Host := ‘smtp.gmail.com’;
IdSMTP.Username := ‘[email protected]’;
IdSMTP.Password := ‘senhameuemail’;
// Tentativa de conexão e autenticação
try
IdSMTP.Connect; // Trava aqui e não aparece nenhuma mensagem de erro
IdSMTP.Authenticate;
except
on E:Exception do
begin
MessageDlg(‘Erro na conexão e/ou autenticação: ‘ +
E.Message, mtWarning, [mbOK], 0);
Exit;
end;
end;
// Configuração da mensagem
IdMessage.From.Address := ‘[email protected]’;
IdMessage.From.Name := ‘MeuNomeEmailGmail’;
IdMessage.ReplyTo.EMailAddresses := IdMessage.From.Address;
IdMessage.Recipients.EMailAddresses := ‘[email protected]’;
IdMessage.Subject := ‘Assunto do e-mail: Teste de Envio’;
IdMessage.Body.Text := ‘Corpo do e-mail – Você receberá em anexo o arquivo anexo.txt’;
// Anexo da mensagem (opcional)
CaminhoAnexo := ‘C:\Anexo.txt’;
if FileExists(CaminhoAnexo) then
TIdAttachmentFile.Create(IdMessage.MessageParts, CaminhoAnexo);
// Envio da mensagem
try
IdSMTP.Send(IdMessage);
MessageDlg(‘Mensagem enviada com sucesso.’, mtInformation, [mbOK], 0);
except
On E:Exception do
MessageDlg(‘Erro ao enviar a mensagem: ‘ +
E.Message, mtWarning, [mbOK], 0);
end;
finally
// liberação dos objetos da memória
FreeAndNil(IdMessage);
FreeAndNil(IdSSLIOHandlerSocket);
FreeAndNil(IdSMTP);
end;
Grato.
Geibel, aparentemente a sua configuração está correta. Eu ainda não tive a oportunidade de utilizar o Delphi XE5, então desconheço alguma possível particularidade nos componentes de conexão com SSL. De qualquer forma, faça um teste: desabilite o firewall e antivirus, e tente novamente. Talvez há algum bloqueio externo impedindo a conexão.
André Luiz Celestino, resolvi instalando o Indy10 ai sim funcionou…
ficou assim:
uses
//Criado para enviar e-mail
IdMessage, IdSMTP, IdSASLLogin, IdUserPassProvider, IdBaseComponent, IdAttachmentFile, IdAttachment, IdComponent, IdIOHandler, IdIOHandlerSocket, IdSSLOpenSSL,IdExplicitTLSClientServerBase
function IsConnected: Boolean;
const
INTERNET_CONNECTION_MODEM = 1;
INTERNET_CONNECTION_LAN = 2;
INTERNET_CONNECTION_PROXY = 4;
INTERNET_CONNECTION_MODEM_BUSY = 8;
var
dwConnectionTypes : DWORD;
begin
dwConnectionTypes := INTERNET_CONNECTION_MODEM + INTERNET_CONNECTION_LAN + INTERNET_CONNECTION_PROXY;
If InternetGetConnectedState(@dwConnectionTypes,0) then
Result := True
else
Result := False;
end;
function EnviaMailTLS(Email, Conta, Senha, Smtp, Nom_exibe, Porta_smtp, Corpo, Destinatario, DestinatarioCC, DestinatarioCCO, Anexo, Assunto : String) : Boolean;
var Mensagem : TIdMessage;
idSMTP1 : TIdSMTP;
idSASLLogin : TIdSASLLogin;
idUserPassProvider: TIdUserPassProvider;
begin
Result := True;
// verifica se há conexão
if not IsConnected then
begin
Result := false;
Exit;
end;
try
idSMTP1 := TIdSMTP.Create(nil);
Mensagem:= TIdMessage.Create(nil);
idSMTP1.IOHandler:= TIdSSLIOHandlerSocketOpenSSL.Create(idSMTP1);
idSMTP1.UseTLS:= utUseExplicitTLS;
TIdSSLIOHandlerSocketOpenSSL(idSMTP1.IOHandler).SSLOptions.Method := sslvSSLv3;
idSMTP1.Host:= Smtp;
idSMTP1.Port:= StrToInt(Porta_smtp);
idSASLLogin:= TIdSASLLogin.Create(idSMTP1);
idUserPassProvider:= TIdUserPassProvider.Create(idSASLLogin);
idSASLLogin.UserPassProvider:= idUserPassProvider;
idSMTP1.Username:= Conta;
idSMTP1.Password:= Senha;
//Anexo
if Anexo ” then
TIdAttachmentFile.Create(Mensagem.MessageParts, Anexo);
//Dados da Mensagem
Mensagem.From.Name:= Nom_exibe;
Mensagem.From.Address:= Email;
//Destinatario
Mensagem.Recipients.EMailAddresses:= Destinatario;
//ReplyTo
Mensagem.ReplyTo.Add.Address:= Email;
//Em Copia
if DestinatarioCC ” then
Mensagem.CCList.EMailAddresses:= DestinatarioCC;
//Copia Oculta
if DestinatarioCCO ” then
Mensagem.BCCList.EMailAddresses:= DestinatarioCCO;
//Assunto
Mensagem.Priority:= mpHighest;
Mensagem.Subject:= Assunto;
//Corpo Email
Mensagem.Body.Clear;
Mensagem.Body.Add(Corpo);
//
idSMTP1.AuthType:= satDefault;
idSMTP1.SASLMechanisms.Add.SASL:= idSASLLogin;
//
try
idSMTP1.Connect;
idSMTP1.Authenticate;
IdSMTP1.Send(Mensagem);
finally
idSMTP1.Disconnect;
end;
finally
Mensagem.free;
IdSMTP1.Free;
end;
end;
No botão ou chamada:
EnviaMailTLS( ’[email protected]’, // Email
’[email protected]’, // Conta sem_arroba_ou_com_arroba_depende_do_servidor
‘senha’, // Senha
‘smtp.office365.com’, // Smtp
‘Sistema Delphi’, // Nome_exibe
‘587’, // Porta_smtp – SEMPRE UM VALOR NUMERICO, mas com APOSTROFE ‘ 465|587
CORPO_EMAIL.Text, // Corpo – Texto que vai na mensagem
w_PARA, // Destinatario, ex: [email protected];[email protected]…
w_PARA_CC, // Destinatario em Copia, ex: [email protected];[email protected]…
w_PARA_CCO, // Destinatario em Copia Oculta, ex: [email protected];[email protected]…
w_ANEXO, // ANEXO
w_assunto ); // Assunto
Boa tarde,
Apliquei o exemplo acima no Delphi 7 com Indy10 e não consegui. A mensagem de retorno foi: “SSL is not avaliable on this server”
A função ficou assim:
function EnviaMailTLS(Email, Conta, Senha, Smtp, Nom_exibe, Porta_smtp, Corpo, Destinatario, DestinatarioCC, DestinatarioCCO, Anexo,
Assunto: string): Boolean;
var Mensagem : TIdMessage;
idSMTP1 : TIdSMTP;
idSASLLogin : TIdSASLLogin;
idUserPassProvider: TIdUserPassProvider;
begin
Result := True;
idSMTP1 := TIdSMTP.Create(nil);
Mensagem := TIdMessage.Create(nil);
try
idSMTP1.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(idSMTP1);
idSMTP1.UseTLS := utUseExplicitTLS;
TIdSSLIOHandlerSocketOpenSSL(idSMTP1.IOHandler).SSLOptions.Method := sslvSSLv3;
idSMTP1.Host := Smtp;
idSMTP1.Port := StrToInt(Porta_smtp);
idSASLLogin := TIdSASLLogin.Create(idSMTP1);
idUserPassProvider := TIdUserPassProvider.Create(idSASLLogin);
idSASLLogin.UserPassProvider := idUserPassProvider;
idSMTP1.Username := Conta;
idSMTP1.Password := Senha;
//Anexo
if Anexo ” then
TIdAttachmentFile.Create(Mensagem.MessageParts, Anexo);
//Dados da Mensagem
Mensagem.From.Name := Nom_exibe;
Mensagem.From.Address := Email;
//Destinatario
Mensagem.Recipients.EMailAddresses := Destinatario;
//ReplyTo
Mensagem.ReplyTo.Add.Address := Email;
//Em Copia
if DestinatarioCC ” then
Mensagem.CCList.EMailAddresses := DestinatarioCC;
//Copia Oculta
if DestinatarioCCO ” then
Mensagem.BCCList.EMailAddresses := DestinatarioCCO;
//Assunto
Mensagem.Priority := mpHighest;
Mensagem.Subject := Assunto;
//Corpo Email
Mensagem.Body.Clear;
Mensagem.Body.Add(Corpo);
//
idSMTP1.AuthType := atDefault;
idSMTP1.SASLMechanisms.Add.SASL := idSASLLogin;
//
try
idSMTP1.Connect;
idSMTP1.Authenticate;
IdSMTP1.Send(Mensagem);
finally
idSMTP1.Disconnect;
end;
finally
Mensagem.free;
IdSMTP1.Free;
end;
end;
e a chamada ficou assim:
procedure TForm1.BitBtn4Click(Sender: TObject);
begin
EnviaMailTLS(‘[email protected]’, // Email
‘[email protected]’, // Conta sem_arroba_ou_com_arroba_depende_do_servidor
‘minhasenha’, // Senha
‘smtp.office365.com’, // Smtp
‘CONTMATIC’, // Nome_exibe
‘587’, // Porta_smtp – SEMPRE UM VALOR NUMERICO, mas com APOSTROFE ‘ 465|587
‘Body – Envio de emails CONTMATIC’, // Corpo – Texto que vai na mensagem
‘[email protected]’, // Destinatario, ex: [email protected];[email protected]…
”, // Destinatario em Copia, ex: [email protected];[email protected]…
”, // Destinatario em Copia Oculta, ex: [email protected];[email protected]…
”, // ANEXO
‘Subject – Envio de emails CONTMATIC’); // Assunto
end;
Tentei com as dlls disponibilizadas e também com essas abaixo: que são as que já faço o envio para qualquer outro provedor.
libeay32.dll Versão: 1.0.0.1 de 1998 a 2005
ssleay32.dll Versão: 1.0.0.1 de 1998 a 2005
Olá, Alexandre, tudo certo?
Acho que o seu problema é um pouco complexo. Vou entrar em contato com você por e-mail!
Abraço!
Lembrando que tem que atualizar as DLL:
libeay32.dll e ssleay32.dll segue artigo do Fabricio Colombo onde fala como atualizar o Indy10 e onde baixar as DLL, que foi minha referencia
http://fabriciodev.blogspot.com.br/2012/09/instalando-indy-10-no-delphi-7.html
Legal, André! Muito obrigado pela colaboração em trazer essa solução para o blog!
Quando possível, vou tentar complementar o artigo (ou elaborar outro) com essa solução que você citou!
Abraço!
André,
Que alegria. Funcionou. Valeu mesmo. Parabéns pelo blog. Com a sua última sugestão para Delphi XE deu certo também no Delphi XE5.
Muito obrigado.
Abraço.
Que bom, Geibel! Grande abraço!
Só funciona se o antivirus estiver desabilitado. Como faço para funcionar sem desabilitar antivirus? Pelo thunderbird funciona sem desabilitar antivirus. Ou então como configurar antivirus?
Olá, Lu.
Isso é muito relativo do antivírus que você está utilizando. Alguns antivírus não fazem esse bloqueio, mas, para aqueles que fazem, uma das alternativas é colocar o aplicativo na lista de exclusões ou na lista de arquivos confiáveis. Se existir alguma forma de “contornar” o bloqueio do antivírus, eu desconheço, ainda mais que cada antivírus possui configurações diferentes.
Abraço!
Olá André,
Baixei seu projeto exemplo com o intuito de adicionar a sua rotina de envio de e-mails em um projeto antigo que hoje esta rodando no Delphi 2007. Ao abrir o seu projeto no Delphi 2007 precisei fazer algumas modificações nos fontes como por exemplo trocar a classe TIdSSLIOHandlerSocket para a classe TIdSSLIOHandlerSocketOpenSSL, e algumas propriedades que mudaram, assim consegui compilar ele no Delphi 2007.
O projeto esta compilando sem erros, porém quando executo ele trava na chamada do método IdSMTP1.Connect;
Já desabilitei firewall e anti-vírus mas continua travando no método. Alguma sugestão?
Abraço
Jeferson
Olá, Jeferson!
Algumas pessoas já entraram em contato comigo relatando que o código trava nas versões mais recentes do Delphi.
Vou enviar um exemplo deste código para o Delphi XE que talvez possa ajudá-lo, ok?
Abraço!
Olá André,
Ficarei muito grato.
Grande abraço amigo!
Boa Tarde André, muito bom seu artigo, o primeiro da Net que funciona perfeitamente, estou procurando à meses um artigo como este, ótimo, parabens.
Olá, Edson! Que bom que o artigo foi útil pra você!
Obrigado! Abraço!
Bom dia André, fiz o exemplo e esta me retornando um erro: Erro na conexão e/ou autenticação: Socket Error # 11004.
Estou usando [email protected] e estou enviando para xx@hotmail, e tbm estou usando a port 465.
Se usar ou servidor de email xx.com.br port 587 que uso para envial email com componente Acbr, esta retornando outro erro: Erro na conexão e/ou autenticação: Error connecting with SSL. estou usando o Delphi7. componente indy do próprio Delphi7.
Desde já agradeço.
Olá, Toninho! Em primeiro lugar, obrigado pelo comentário!
Experimente baixar o exemplo no link abaixo e testar novamente:
https://www.andrecelestino.com/wp-content/files/Envio-Email-AndreCelestino.rar
Além disso, não se esqueça que o antivírus, por algum motivo, também pode estar bloqueando o envio.
Abraço!
Olá André,
estou tentando adequar teu código para o delphi xe5, mas não estou tendo sucesso, vc tem uma dica? Agradeço desde já.
Olá, Artur! Como algumas pessoas também me pediram esse apoio, fiz uma versão para o Delphi XE. Em breve postarei no blog, mas, enquanto isso, vou lhe mandar por e-mail, ok?
Abraço!
fala meu amigo tudo bom?
estou com um pequeno problema aqui no meu sistema gostaria muito da sua ajuda….
quando eu vou pegar o valor do banco que o usuario digitou (host:=ZQueryConfiguracaohostbackupauto.AsString);
sempre da um erro (IdStackBSDBase.pas) mais se eu pegar e setar o valor no codigo direto (testehost:=’smtp.mail.yahoo.com.br’); aí funciona. obs: tanto faz usar .asstring quanto .value
Olá, Rodrigo, tudo certo?
Um bom recurso para solucionar o seu problema é a depuração (debug) do código. Caso você já saiba utilizar este recurso, atribua um breakpoint na linha:
host:=ZQueryConfiguracaohostbackupauto.AsString)
Execute o programa e, ao passar por essa linha, verifique se o valor é válido.
Abraço!
Prezado André,
Estou tentando agora configurar para enviar através do servidor de SMTP da Locaweb coloquei desta forma mas não consegue conectar. Você pode me ajudar? Na Locaweb vem a seguinte recomendação Endereço de SMTO: smtplw.com.br | Porta: 587 | SSL/TLS: 465. Agradeço desde já.
// Configuração do SSL para servidor
IdSSLIOHandlerSocket.SSLOptions.Method := sslvSSLv23;
IdSSLIOHandlerSocket.PassThrough := True;
IdSSLIOHandlerSocket.SSLOptions.Mode := sslmServer;
// Configuração do SMTP
IdSMTP.IOHandler := IdSSLIOHandlerSocket;
IdSMTP.UseTLS := utUseImplicitTLS;
IdSMTP.AuthType := satDefault;
IdSMTP.Port := 465;
IdSMTP.Host := ‘smtp.smtplw.com.br’;
IdSMTP.username := ‘usuario’;
IdSMTP.Password := ‘senha’;
Olá, Geibel! Infelizmente não conheço os detalhes dos parâmetros de configuração do servidor da Locaweb, no entanto, notei que você mencionou a porta 587, mas atribuiu a porta 465 no código-fonte. Experimente alterá-la e testar novamente!
Abraço!
Funcionou perfeitamente no delphi 7 *-*
Agora estou tentando fazer rodar no xe3 pra juntar com um projeto que estou criando hehe’
Obrigado por compartilhar, valeu mesmo 😀
Olá, Bruno!
Que bom que o artigo foi útil pra você!
Boa sorte no seu projeto! Abraço!
André, antes de tudo parabéns pelo tutorial.
Gostaria de saber sobre quais mudanças haveriam neste fonte caso eu implemente-o no Delphi 6. Principalmente aquele download que vc linkou, se existe outro similar para o D6.
Muito obrigado mais uma vez.
Olá, Leandro! Em primeiro lugar, obrigado pelo feedback!
Leandro, eu não tive a oportunidade de testar este código no Delphi 6, já que ele originalmente foi elaborado na versão 7, portanto, não conheço os ajustes que devem ser realizados para que a rotina funcione.
Experimente utilizar o mesmo código que está no exemplo do artigo e, caso surja alguma inconsistência, talvez eu possa ajudá-lo.
Abraço!
A porta galera (pelo menos comigo) só funcionou na 587.
IdSMTP.Port := 587;
Obrigado pela contribuição, Ewerton!
Uso delphi 2006.
Mas teve um problema. Já procurei na web e estou ainda procurando.
Nesta linha: IdSMTP.Send(IdMessage);
Erro:
A mensagem fica em branco. Alguém já passou por isto. ALguns fala para ataulizar para o indy 10 como eu faria isto. Mas também não é garantido, mas se não tiver jeito com o indy 9 tento o 10 né.
Link da imagem de erro.
https://imageshack.com/f/kmMnopp8p
http://www.activedelphi.com.br/forum/viewtopic.php?t=38189&sid=dfa1ec9d6bfc4a95101c3b948ed164d3
Este cara também estava com o mesmo erro não não foi solucionado.
Olá, Ewerton. Infelizmente não consegui visualizar a imagem do erro. O servidor do ImageShack aparentemente está off-line.
Experimente baixar a última versão das DLLs do Indy disponíveis no link abaixo (veja as versões mais recentes pela data):
http://indy.fulgan.com/SSL/
Abraço!
Boa Noite André Luís Celestino,
Há tempos tento fazer funcionar a rotina de envio de e-mail para o GMAIL… SSL… No Delphi XE5 U2, mas todas as tentativas sem sucesso…
Até mesmo o mesmo exemplo com as mesmas DLL´s que outros dizem que funcionam, comigo não funcionou…
Pode enviar um exemplo prático?
Já estou desanimando em ter que retornar para o Delphi 2010…
Abraços…
Olá, Antonio, tudo bem?
Alguns leitores já me questionaram sobre como ajustar este código para as versões XE+ do Delphi.
Vou lhe enviar um e-mail com um código de exemplo para você fazer um teste, ok? Abraço!
Está ocorrendo um erro quando faço o teste para enviar o e-mail.
Project GBMAIL.exe raised Exception class EIdOSSLConnectError with message ‘Error connecting with SSL.’. Process stopped. Use Step or Run to continue.
Poderia me ajudar?
Olá, Bryan!
Certifique-se de que você adicionou essas duas linhas:
// Configuração do SSL
IdSSLIOHandlerSocket.SSLOptions.Method := sslvSSLv23;
IdSSLIOHandlerSocket.SSLOptions.Mode := sslmClient;
Além disso, não esqueça de colocar as DLLs no mesmo diretório que está o executável, ok?
Abraço!
Boa noite, consegui arrumar sozinho aqui, problema estava na autenticação.
Muito obrigado !
o que fez para resolver
Olá, André!
O problema do Bryan eram as credenciais de autenticação (usuário ou senha incorretos).
Se você estiver com o erro “Error connecting with SSL”, experimente seguir as instruções desse comentário.
Abraço!
André, gostei muito do seu artigo.
Tenho tido problema com a rotina que uso, ela informa que “atingiu o limite de e-mail por hora”, o curioso é que fiz poucos testes.
Você tem alguma sugestão para esse caso?
Um grande abraço e saudações pelo seu trabalho.
Olá, Roberval! Embora eu ainda não tenha me deparado com essa mensagem em específico, trata-se de uma regra de transferência do próprio servidor de e-mail. O Hotmail, por exemplo, contém uma regra que não permite múltiplas requisições POP em um curto período de tempo. Certa vez, ao fazer testes consecutivos com o Hotmail, recebi uma mensagem semelhante à essa que você informou. É até compreensível que existam essas regras para não causar congestionamentos de requisições nos servidores.
A minha sugestão é realizar testes em menor escala e mais acurados, ou encontrar um servidor de e-mail que forneça uma maior flexibilidade de envio em um determinado intervalo de tempo.
Obrigado pelo comentário! Abraço!
André, primeiro lugar queria deixar o meu agradecimento aqui a você. Precisamos de mais pessoas assim! Muito bom o seu site.
Estou com um problema, quando o programa passa na linha IdSMTP.Connect;
Ele esta gerando o seguinte erro:
“Erro na conexão e/ou autenticação: 5.7.14 <https://accounts.google.com/ContinueSignIn?sarp=1=scc=1plt=AKgnsbsxj
5.7.14 Lfd …
Você sabe o que é? Abraços e muito obrigado.
Err
Olá, Cristiano! Infelizmente não consegui abrir a imagem do link.
Vou entrar em contato com você por e-mail, ok?
Abraço!
Estou tendando implementar o envio de email no Delphi. Uso o XE3. Fiz conforme dito acima e está dando o seguinte erro:
[dcc32 Error] ConOs.pas(499): E2003 Undeclared identifier: ‘TIdSSLIOHandlerSocket’
Eu instalei as Dlls na pasta onde está o executável.
Se puder me ajudar agradeço…
Abraço
Olá, Odanir!
Este erro ocorre quando o Delphi não consegue encontrar a classe na qual utilizamos para declarar o objeto.
Certifique-se de que você colocou as seguintes units na cláusula uses do formulário:
IdSMTP, IdMessage, IdSSLOpenSSL;
Abraço!
Olá André muito obrigado pelo seu retorno.
Mandei um email para você contendo 3 prints.
2 com a mensagem de erro
1 mostrando justamente na linha que da o erro
e ainda mandei o codigo que eu fiz para você da um olhada… Muito obrigado pela sua dedicação!
Abraço
André, muito obrigado por ter retornado. Respondi o email com a mensagem de erro que está dando:
E2003 Undeclared identifier: ‘TIdSSLIOHandlerSocket’
e também o código para ver se coloquei no lugar certo.
Novamente obrigado pela atenção.
Abraço
Olá André, parabéns por sua disposição em ajudar.
Sem querer abusar de sua boa vontade, eu utilizo o componente indy para enviar email através do delphi 7; mas no windows
de 64bits está dando erro(vide abaixo); você teria alguma dica de como resolver ?
Obrigado desde já.
PROBLEMA: “Problema ao conectar/enviar mensagem… Tente novamente Could not load SSL library”
OBS: No windows 32bits funciona normalmente.
Olá, Pedro Alves!
Esse erro realmente se refere às DLLs do Indy. Experimente baixar a versão mais recentes da biblioteca neste link:
http://indy.fulgan.com/SSL/openssl-1.0.1j-x64_86-win64.zip
Obs: As DLLs devem ser copiadas somente para a pasta em que está o executável. Se as DLLs estiverem em outro local, como as pastas de sistema (System32, SysWOW64), é necessário removê-las.
Abraço!
Andre,
Já respondi para você no email, mas quero também agradece-lo publicamente. Você é dessas raras pessoas que ficam felizes em poder ajudar outras. Está tudo funcionando perfeitamente.
Muito obrigado mesmo.
Abraço!
Bom dia André, obrigado por sua atenção, infelizmente não funcionou; continua com o erro “Could not load SSL library”
Pedro, Vou entrar em contato com você, ok?
Abraço!
Obrigado André pela atenção, lhe respondi via email.
André bom dia
Estou usando seu exemplo no delphi 7 e esta dando o seguinte erro raised exption class OIdOSSL conectError with message ‘Error conecting with SSL
poderia me dar uma luz
Desde já agradeço
Abraço
Olá, Adilson, tudo bem?
Experimente baixar o arquivo do link abaixo e compará-lo com o seu código. Vale lembrar que este erro também pode ser oriundo de uma falha na autenticação, ok? Abraço!
https://www.andrecelestino.com/wp-content/files/Envio-Email-AndreCelestino.rar
Boa tarde, André
Muito obrigado por disponibilizar o código, acabei de conferir e corrigi algumas bobeiras minhas, agora deu certinho, ta rodando suave, uma blz!
Muito obrigado mais uma vez.
Abraço forte
Olá, Adilson!
Fico contente que tenha dado certo.
Obrigado pelo retorno!
Abraço!
Caríssimo André,
Estou tentando usar o seu exemplo no Delphi 7 Win7 32.
IdSMTP.IOHandler := IdSSLIOHandlerSocket;
IdSMTP.AuthType := atLogin;
Esse atLogin não é identificado pelo Delphi.
Alguma dica?
Obrigado!
Olá, Freitas! Aparentemente, você está utilizando uma versão mais nova dos componentes Indy para Delphi 7.
Vou lhe enviar um e-mail com algumas sugestões, ok?
Abraço!
André bom dia. Gostei mto do exemplo porém a variaval atLogin não esta sendo identificado pelo delphi 2010.
O que fazer ?
Grato.
[email protected]
Olá, André! Vou lhe enviar um e-mail com o código adaptado para versões mais novas do Delphi, ok?
Abraço!
Boa tarde André, Tudo bem ?
Muito legal sua postagem, me ajudou bastante em meus estudos.
Mas se poder me tirar uma duvida, agradeceria.
Criei um banco de dados em PostgreSql e criei uma tabela chamada TESTE, onde contem 1 campo de e-mail com 3 linhas, e-mails diferentes, teria possibilidade de em :
IdMessage.Recipients.Add.Text := ‘destinatario’;
Receber esses e-mails ? por um DBGRid por exemplo.
?
Desde já Muito Obrigado.
Olá, Carlos!
Sim, é possível adicionar mais de um endereço de e-mail na mesma mensagem.
No seu caso, basta implementar um loop de repetição para percorrer todas as linhas da tabela e atribuir o valor de cada uma delas à propriedade “Recpients” do componente TIdMessage. No exemplo abaixo, primeiro posiciono o cursor no primeiro registro do DataSet e, em seguida, percorro cada linha. Para cada iteração, verifico se o valor do campo está em branco – se não estiver, é adicionado na lista de destinatários.
DataSetTeste.First;
while not (DataSetTeste.Eof) do
begin
if (TabelaTeste.FieldByName('CampoEmail').AsString <> EmptyStr) then
IdMessage.Recipients.Add.Text := TabelaTeste.FieldByName('CampoEmail').AsString;
DataSetTeste.Next;
end;
Andre, boa tarde,
Eu havia conseguido enviar o email pelo delphi xe3, só que comecei a ter problemas e voltei para o delphi7. Só que ai não consegui mais enviar.
Eu testei o envio pelo outlook e deu certo. Não tem como eu automatizar todo o envio pelo outlook de forma que eu não precise abrir o outlook para terminar de enviar?
JA ACHEI AQUI, BASTA USAR:
vMailItem.Recipients.Add(‘[email protected]’) ;
vMailItem.Send;
OBRIGADO
Opa, que bom que encontrou a solução, Odanir!
Obrigado por retornar no blog e compartilhá-la conosco!
Abraço!
Andre, boa noite,
Só para dar um feedback, quando eu passei a usar o Delphi7 o programa só rodou com as dlls que você passou aqui inicialmente.
Tudo certo então.
Obrigado
Ola amigo, esta dando alguns erros, poderia me ajudar ?
[dcc32 Error] Unit1.pas(10): E2004 Identifier redeclared: ‘IdMessage’
[dcc32 Error] Unit1.pas(10): E2004 Identifier redeclared: ‘IdSSLOpenSSL’
[dcc32 Error] Unit1.pas(52): E2003 Undeclared identifier: ‘AuthenticationType’
[dcc32 Error] Unit1.pas(52): E2003 Undeclared identifier: ‘atLogin’
[dcc32 Fatal Error] Project1.dpr(5): F2063 Could not compile used unit ‘Unit1.pas’
Olá, Gabriel! Vou tentar ajudá-lo por e-mail, ok?
Abraço!
Boa tarde André Luis Celestino
Seguindo teu exemplo eu não estou encontrando o componente TIdSSLIOHandlerSocket no Delphi XE6 existe um com nome IdSSLIOHandlerSocketOpenSSL1 so que não da certo com o exemplo que você tem, saberia me dizer como posso fazer usando o XE6????
Olá, Paulo, tudo bem?
O exemplo do artigo é exclusivo para o Delphi 7. Vou lhe enviar uma versão para o Delphi XE+ por e-mail.
Abraço!
Boa Tarde André
quando tento enviar o email esta me retornando esta mensagem no Debug do Delphi XE6
raised exception class IDdOSSLcouldNotloadSSLLIbrary with message ‘Could not load SSL library.
Coloquei as duas dll libeay32.dll, ssleay32.dll na pasta o exe
O que pode estar acontecendo André que esta me retornando este erro?
Olá, Paulo!
Esse erro pode ocorrer em função da versão das DLLs do Indy. Vou lhe enviar uma versão compatível com o Delphi XE+, ok?
Abraço!
Parabéns, foi batata, copiei e colei, obrigado.
Muito obrigado amigão, faz tempo que eu estava procurando um código que funcionasse e esse funcionou perfeitamente. Se precisar de alguma dica de Delphi, Fotografia, Photoshop ou Javascript para Photoshop eu estou a disposição.
Olá, Drausio!
Fico contente que o artigo tenha lhe ajudado! Obrigado por oferecer o seu apoio também!
Grande abraço!
Caro André;
Estou com um problema imenso. Tenho alguns sites de aulas (inglês,francês,hebraico,espanhol,e outros)em um provedor conhecido. Nestes sites tenho formulários preenchíveis por alunos. Há pouco tempo, deixei de receber e-mails destes alunos. Reclamei com o provedor e não resolvi o problema, que me envolve por 2 meses. Agora, retornei a alguns e-mails feitos em Delphi7 (fui professor desta área a alguns anos) mas não consegui enviar qualquer mensagem por eles (que eram usáveis normalmente). Copiei este seu modelo, alterei nas direções necessárias, mas deu o erro 10060, “Socket Error”. Há como ajudar-me? Agradecido, antecipadamente.
Olá, Nelson, tudo bem?
O erro de “Socket Error” pode ser causado por vários motivos. Vou entrar em contato para pedir mais informações, ok?
Abraço!
OLá André !
Bacana seu artigo e ficaria melhor se vc houvesse colocado mais detalhes como imagens e assim ficaria bom para os que estão iniciando, tipo como imagens do form e seria mais explicável e passo a passo. Mas ta de parabens, amigo.
Até mais http://alltodicas.blogspot.com.br/
Abraços
Olá, Daniel, tudo certo?
Obrigado pelo feedback! Já anotei suas sugestões de melhoria e vou aplicá-las nos próximos artigos!
Abraço!
Olá André, tudo bem. Amigo, eu estou com um projeto quase finalizado, só pendente duas funções, e uma delas é enviar o e-mail que está me deixando triste por não conseguir. Sou iniciante em Delphi, já pesquisei muito sobre o tema e não consigo fazer enviar. Tentei fazer esse seu exemplo acima e nada. Queria muito tua ajuda, poderia conversar com vc por e-mail? Te passaria minha ideia e meu projeto para ver se vc seria meu “Heroi” rsrs. Abçs
Olá, Vlademir!
Ok, vou entrar em contato com você e tentar ajudá-lo! Abraços!
Boa tarde André, tudo certo?
Tenho uma rotina de envio de e-mails com Indy e estava tudo funcionando corretamente. Porém, quando tenho muitos destinatários ( mais de 100, para ser mais exato ) aparece a mensagem de erro ‘Too many recipients’. Sei que refere-se à quantidade de destinatários, como corrijo isso?
Fico no aguardo, muito obrigado.
PS: Excelente tópico, me baseei nele para desenvolver minha aplicação!
Olá, Bruno, tudo bem?
Fico feliz que o artigo tenha lhe ajudado!
Bruno, alguns servidores possuem uma regra de limite de destinatários por e-mail, como forma de evitar a disseminação de correntes e spams. Uma alternativa para contornar essa regra é limitar o número de destinatários por e-mail, ou seja, ao invés de enviar um único e-mail para todos os destinatários, o sistema envia vários e-mails com uma quantidade de destinatários restrita e aceitável pelo servidor.
Por exemplo, se for necessário enviar o e-mail para 1000 destinatários, ajuste o método para enviar 10 e-mails com apenas 100 destinatários cada. Na prática, é semelhante a um mecanismo de newsletter.
Espero que lhe ajude! Abraço!
rapaiz jah fiz tudo isso que falaram, nao sei mais o que fazer sempre o mesmo erro could not load ssl library,
jah trablhei mais de 30 horas de servico em cima, todo tipo de rotina que tem nao internet ja tentei fazer e nada,
gostaria de saber se alguem tem outra dica. obrigado.
Olá, Adilson!
Vamos tentar resolver isso! Vou entrar em contato com você por e-mail.
Abraço!
Parabéns! Simples e funcional.
Obrigado, Francisco! Abraço!
Sr. André,
Boa tarde,
Parabéns, pela iniciativa.
Tenho uma pergunta.
Estou usando delphi 7 com indy 10 5.2, não estou conseguindo mandar e-mail para servido gmail.
Por que usa TLS.
Tem como me ajudar?
Código que o senhor colocou
Está dando o Coult not load SSL Libary.
Já copia a dll para pasta exe e também pasta SysWOW64.
fonte:
IdSSLIOHandlerSocket.SSLOptions.Method := sslvSSLv23;
IdSSLIOHandlerSocket.SSLOptions.Mode := sslmClient;
// Configuração do SMTP
IdSMTP.IOHandler := IdSSLIOHandlerSocket;
IdSMTP.AuthenticationType := atLogin;
IdSMTP.Port := iporta;
IdSMTP.Host := txtsmtp.text;
IdSMTP.Username := txtemail.text;
IdSMTP.Password := txtsenha.text;
// Tentativa de conexão e autenticação
try
IdSMTP.Connect;
IdSMTP.Authenticate;
except
on E:Exception do
begin
MessageDlg(‘Erro na conexão e/ou autenticação: ‘ +
E.Message, mtWarning, [mbOK], 0);
Exit;
end;
end;
Olá, Julio Cesar, tudo bem?
Esse problema parece ser de incompatibilidade da versão do Delphi com a versão das DLLs do Indy.
Vou lhe enviar um e-mail com as DLLs compatíveis, ok?
Abraço!
Bom dia, André Luiz estou com uma duvidá, sobre o envio de email, tanto para Hotmail quanto para Gmail, os dois provedores de email que estou usando para fazer testes, a questão e que os meus email para os dois são enviados normalmente, e agora estou tentando fazer uma evolução, no corpo dos email uma mensagem em HTML, mais tanto o gmail ou Hotmail, não estou conseguindo, talvez esteja dando murro em ponta de faca, Sr. André Luiz vc pode me dar uma dica ou disponibilizar algum matérial para concretizar meu projeto, Desde já agreço pela atenção de todos…
Olá, João, tudo certo? Recebi essa mesma dúvida há alguns dias de outro leitor. Para enviar a mensagem em formato HTML, você deve configurar algumas propriedades do objeto TIdMessage, conforme segue:
IdMessage.CharSet := 'ISO-8859-1;
IdMessage.Encoding := meMIME;
IdMessage.ContentType := 'text/html';
Espero que lhe ajude! Abraço!
Olá André,
Antes de mais ada obrigado pela colaboração.
Usei como base seu exemplo trabalhando no Delphi XE7..
No inicio estava tento problemas com as DLLs o que foi resolvido baixando a versão mais recente delas, porém….
Se tiver algum dado errado como a porta por exemplo, ele me alerta sobre o erro mas após corrigir os dados ele não me alerta mais sobre nenhum erro, apenas fica travado..
Debugando vi que ele trava nessa função do IdSMTP:
procedure TIdSMTP.Connect;
begin
FDidAuthenticate := False;
inherited Connect;
try
GetResponse(220);
SendGreeting;
except
Disconnect(False);
raise;
end;
end;
Quando ele passa pelo GetResponse(220) ele simplesmente trava e não me gera nenhum erro..
Chegou a passar por esse problema ou tem idéia do que se refere ?
Abaixo uma copia do meu código com os pequenos ajustes para o Delphi XE7.
procedure TFormSendMail.EnviarEmail;
var
// objetos necessários para o funcionamento
IdSSLIOHandlerSocket: TIdSSLIOHandlerSocketOpenSSL;
IdSMTP: TIdSMTP;
IdMessage: TIdMessage;
CaminhoAnexo: string;
begin
// instanciação dos objetos
IdSSLIOHandlerSocket := TIdSSLIOHandlerSocketOpenSSL.Create(Self);
IdSMTP := TIdSMTP.Create(Self);
IdMessage := TIdMessage.Create(Self);
try
// Configuração do SSL
IdSSLIOHandlerSocket.SSLOptions.Method := sslvSSLv23;
IdSSLIOHandlerSocket.SSLOptions.Mode := sslmClient;
// Configuração do SMTP
IdSMTP.IOHandler := IdSSLIOHandlerSocket;
IdSMTP.AuthType := satDefault;
IdSMTP.Port := StrToInt(EditPortaSMTP.Text); //Porta
IdSMTP.Host := EditServidorSMTP.Text; //servidor smtp
IdSMTP.Username := EditUsuario.Text; //usuario
IdSMTP.Password := EditSenha.Text; //senha
// Tentativa de conexão e autenticação
try
IdSMTP.Connect;
IdSMTP.Authenticate;
except
on E:Exception do begin
MessageDlg(‘Erro na conexão e/ou autenticação: ‘ +
E.Message, mtWarning, [mbOK], 0);
Exit;
end;
end;
// Configuração da mensagem
IdMessage.From.Address := EditEmailRemetente.Text; //Email remetente
IdMessage.From.Name := ‘Teste’; //Nome remetente
IdMessage.ReplyTo.EMailAddresses := IdMessage.From.Address;
IdMessage.Recipients.EMailAddresses := EditEnailDestino.Text; //Email Destino
IdMessage.Subject := ‘Teste de Envio – Wise Sistemas’; //assunto
IdMessage.Body.Text := ‘Se você recebeu este E-mail é porque sua conta foi configurada corretamente.’; //Corpo do email
// Anexo da mensagem (opcional)
CaminhoAnexo := ‘C:\Anexo.txt’;
if FileExists(CaminhoAnexo) then begin
TIdAttachmentFile.Create(IdMessage.MessageParts, CaminhoAnexo);
end;
// Envio da mensagem
try
IdSMTP.Send(IdMessage);
MessageDlg(‘Mensagem enviada com sucesso.’, mtInformation, [mbOK], 0);
except
On E:Exception do begin
MessageDlg(‘Erro ao enviar a mensagem: ‘ +
E.Message, mtWarning, [mbOK], 0);
end;
end;
finally
// liberação dos objetos da memória
FreeAndNil(IdMessage);
FreeAndNil(IdSSLIOHandlerSocket);
FreeAndNil(IdSMTP);
end;
end;
Obrigado.
Olá, Denis, tudo bem?
Comparei o seu código com uma versão de envio de e-mail para o Delphi XE e observei uma diferença relacionada ao TLS.
Experimente adicionar a linha abaixo na seção de configuração do SMTP:
IdSMTP.UseTLS := utUseImplicitTLS;
Qualquer coisa, volte a comentar! Abraço!
Bom Dia André…..
Funcionou perfeitamente adicionando a propriedade mencionada. Obrigado pela ajuda.
Andei dando uma olhada rápida no seu blog e esta de parabéns…conteúdo se mostra bem intuitivo, didático, códigos bem organizados e a atenção que você dá aos comentários me surpreende, pois procura responder a todos ou a grande maioria…tudo isso é algo que não se vê por ai com frequência principalmente de forma gratuita.
Obrigado por compartilhar um pouco de seu conhecimento, isso ajuda com certeza muitas pessoas..
Que muitos como você apareçam por ai, já tentei fazer algo parecido e não dei conta , sei o quanto tempo e esforço são gastos pra manter um blog como esse sempre atualizado no ar.
Programo a algum tempo mas com Delphi trabalho a poucos meses então muita coisa aqui vai ma ajudar evoluir na linguagem por mais simples que seja.
Deixei salvo aqui o endereço e sempre que puder lhe pago um cafezinho.
Mais uma vez obrigado.
Olá, Denis!
Agradeço fortemente pelo comentário e por dedicar o seu tempo para retornar ao blog!
Comentários como o seu me motivam a continuar publicando novos artigos! Obrigado pelo feedback e espero continuar ajudando outros desenvolvedores na medida do possível!
Conte com a minha ajuda sempre que precisar, ok?
Grande abraço!
Bom Dia André.
Mais uma vez aqui te atormentando rsrsrrs.
Tentei configurar o envio de mensagem com formatação em HTML, porém o que recebo é isso…
“This is a multi-part message in MIME format –GtuQ1nvdm5WPYzh9H92AbJz9=_cXW4GvUo Content-Type: text/plain; charset=”us-ascii” Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Se voc? recebeu este E-mail ? porque sua conta foi configurada = corretamente. –GtuQ1nvdm5WPYzh9H92AbJz9=_cXW4GvUo Content-Type: text/plain; name=”Anexo.txt” Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=”Anexo.txt” YXNmYXNm –GtuQ1nvdm5WPYzh9H92AbJz9=_cXW4GvUo–”
Tentei usar as configurações abaixo…
Quando uso a função IdMessage.Body.LoadFromFile(‘C:\teste.html’);
Imaginei que o arquivo em questão fosse adicionado ao corpo da mensagem mas isso não ocorre.
utilizando..
IdMessage.CharSet := ‘ISO-8859-1′;
IdMessage.Encoding := meMIME;
IdMessage.ContentDisposition :=’inline’;
IdMessage.ContentType := ‘text/html’; // ‘multipart/mixed’;
ele me retorna a mensagem da forma que mencionei acima…
Testando as variações vi que o problema ocorre na verdade na propriedade IdMessage.ContentType := ‘text/html’;
Quando comento ela a mensagem chega sem problemas porém claro sem a formatação HTML.
Utilizo o Delphi XE7, teria ideia de como solucionar esse problema ?
Obrigado.
Bom dia, Denis!
Uma vez recebi um e-mail de um desenvolvedor que se deparou com o mesmo problema. Como orientação, sugeri a inclusão das seguintes linhas:
IdMessage.CharSet := 'ISO-8859-1';
IdMessage.Encoding := meMIME;
IdMessage.ContentType := 'text/html';
Porém, essas linhas já estão adicionadas no seu código. A única diferente que observei é a propriedade ContentDisposition. Se você removê-la do código, o problema persiste?
De qualquer forma, vou tentar reproduzir o cenário e encontrar uma solução!
Abraço!
Bom Dia André.
Sim mesmo removendo essa propriedade o problema ainda persiste, percebi que quando utilizo a propriedade
IdMessage.ContentType := ‘text/html’; com o valor do exemplo(text/html) é que o problema ocorre….
ele envia a mensagem com a formatação que mencionei e sem o anexo, seu eu a remover ou mudar o valor dela para ‘multipart/mixed’ volta a funcionar porém claro sem a formatação do Html.
Estou fazendo novos testes e caso consiga uma solução posto aqui nos comentários a solução.
Mais uma vez obrigado pela ajuda.
Olá André,
Só para atualizar os passos tive uma evolução quanto ao problema.
Percebi que se eu remover o arquivo anexo o E-mail é recebido com toda formatação HTML.
Algum conflito esta ocorrendo e assim que descobrir a solução volto aqui para postar.
Obrigado
Olá, Denis! Ainda não tive tempo de reproduzir o cenário. Conseguiu resolver o problema?
Abraço!
Olá André, tudo bem?
Primeiramente muito obrigado por compartilhar conhecimentos conosco.
“Segundamente” eu gostaria de saber porque que no momento em que ele vai autenticar (logo depois do Connect) dá um erro de gsmtp pedindo para que eu faça login diretamente pelo browser?
Att,
Wesley Menezes.
Olá, Wesley, tudo certo?
Muita gente está recebendo esse erro que, na verdade, é um procedimento de segurança do Gmail.
Esse link poderá lhe ajudar:
https://support.google.com/mail/answer/78754
Obrigado pelo comentário! Abraço!
Olá, André!
Muito obrigado pela ajuda, deu tudo certo!
Valeu mesmo!!!
Att,
Wesley Menezes
Opa, que bom, Wesley!
Fico feliz em ter ajudado!
Abraço!
nossa Show de bola teu site amigo parabéns dificil achar na net pessoas assim como voce.bom estou com um problema em meu projeto,gostaria que meu programinhade efetuasse login automatico no provedor e enviasse a mensagem automaticamente,tudo automatizado.uma lista de logins e senhas,uma lista dos emails a serem enviados entao a cada 10 envios ele deslogase e logasse em outra conta assim sucessivamente.se possivel amigo entre em contato comigo trabalho na internet com marketing e sou iniciante em delphi 7.agradeceria muito se me enviasse um exemplo,nao o projeto inteiro,mas algo que eu posssa estudar em cima do meu codigo que ainda estou bolando,ja estou meio caminho andado….aguardo retorno desde ja obrigado .
Olá, Pedro, tudo certo?
Vou entrar em contato com você para solicitar mais detalhes.
Abraço!
Bom dia André!
Eu estou usando o OleObject que você descreveu acima, mas eu gostaria que saber se tem como checar pelo ole mesmo se o email foi enviado ou se o outlook foi encerrado? Eu estou procurando uma tabela de propriedades/funções pra ele, mas não consigo achar. Obrigado desde já
Att. Lucas Xavier
Olá, Lucas, tudo bem?
É possível, sim! Porém, o código é diferente do que está no artigo. É necessário trabalhar com a classe TMailItem, disponível na unit “Outlook2000”, e associar o evento OnSend.
Segue um exemplo de código:
Deixo claro que não testei esse código, já que “abandonei” o Outlook há algum tempo, rsrs.
Abraço!
Obrigado André! Eu acabei fazendo de outra forma, mas muito obrigado pela atenção e parabéns pelo Blog, é muito útil, para mim que estou começando mesmo, está ajudando demais.
Abraço!
Na verdade, voltei a estaca zero, pois preciso de uma método que abra o email padrão do sistema, assim ele só abre o outlook obviamente..
Porém eu não queria baixar nenhum componente ou arquivo exterior, se possível, e pelo MAPI(SendEmail) não funciona com o Outlook 64 bits.
Estou usando o Delphi 7, me dê uma luz se possível kkkk.
Abraço.
Olá, Lucas!
O código que postei no comentário anterior não exige a instalação de componente de terceiros. Experimente utilizá-lo!
Abraço!
Bom dia André
Estou usando o Indy 10.6.2.0 com o delphi 7.
Se eu usar as dlls que você colocou aqui no post, ocorre o erro
Could not load SSL library.
Se eu pegar versões mais atualizadas da dll, ocorre o erro
Error accepting connection with SSL.
error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number
Como posso saber qual versão da dll devo usar ?
Olá, Lucas, tudo bem?
As DLLs são as que estão no link do post mesmo. O erro “Could not load SSL library” ocorre quando a aplicação não consegue encontrar as DLLs. Certifique-se de que você está colocando as DLLs na mesma pasta em que está o executável. Se estiverem em local diferente, não estarão “visíveis” para a aplicação.
Abraço!
Na verdade somente o primeiro erro “Could not load SSL library” tem a ver com a versão da dll. O segundo é erro de configuração do Indy 10.
Obrigado pela atenção e pelo tutorial.
Como faço para colocar em uma thread, pois fica paralisando no envio ?
Olá, Alexandre, bom dia!
Se você já souber trabalhar com Threads, basta apenas criar este método de envio de e-mail dentro dela.
Por exemplo, a Thread teria o seguinte código no método herdado Execute:
E para chamá-la seria algo como:
Abraço!
Primeiramente agradeço a atenção.
O procedimento EnviarEmail, deve ser criado onde:
1 – Na Thread ou no próprio formulário de envio e chamado na Thread ?
Criei o procedimento de envio e pelo form próprio envia, mas quando o
chamo na Thread no procedimento Execute dá esse erro:
Exception EaccessViolation in module….
Read of address FFFFFFFA.
Uso o IdSmtp e Idmessage.
Grato !
Olá, Alexandre. O método deve ser criado na Thread. O formulário, por sua vez, irá instanciar a Thread e chamar o método “Execute”, conforme mencionei no comentário anterior.
Acredito que o Access Violation esteja ocorrendo devido ao acesso a algum objeto que não existe na memória. Sugiro as seguintes ações:
– Certifique-se de que a Thread está criado no momento em que “Execute” é chamado;
– Verifique se existe algum objeto que depende do formulário, embora eu acho que não seja o caso;
– Use os serviços de depuração (debug) do Delphi para identificar a linha em que ocorre o erro. Dessa forma se torna muito mais fácil corrigi-lo.
Abraço!
Grato, consegui resolver:
Eu tinha chamado esse form de envio através de criação em execução, então
coloquei-o para iniciar junto com os outros e dei um showmodal, com isso,
resolveu o problema. Grato !
Entendi, Alexandre. Então o Access Violation ocorria porque o formulário não estava instanciado.
Que bom que conseguiu resolver! Abraço!
Olá André,
Tudo bem? Seu exemplo de envio de email através do Delphi 7 está excelente, parabéns. Porém, quando eu
tentei utilizá-lo obtive um erro na autenticação do gmail. Você poderia dar uma dica de como resolver esse erro ou informar se existe a opção de não autenticar.
A mensagem de erro é muito grande, informo só o começo: 5.7.14 http://accounts.google.com/signin/…
Antecipadamente agradeço a ajuda.
Oi André!
Estou tendo o problema de dll também, uso o delphi seatle em uma aplicação firemonkey.
Pode me enviar as dlls tambem?
Boa noite, Lucas!
Experimente baixar as DLLs deste link:
https://www.andrecelestino.com/wp-content/files/DLLs-SSL-DelphiXE.rar
Se mesmo assim não funcionar, acesse o site do Indy (link abaixo) e baixe a versão mais recente:
https://indy.fulgan.com/SSL/
Abraço!
Baixei seu projeto exemplo e ao testá-lo obtive um erro na autenticação. Consigo a conexão mas na autenticação dá erro. Esse mesmo erro está acontecendo no meu projeto, inclusive já relatei anteriormente nesse espaço.
Abraços e obrigado pela atenção.
Olá, Marcelo, tudo bem?
Este erro não é do código-fonte. É uma configuração de segurança do Gmail. Por padrão, o Gmail não permite que aplicativos externos utilizem as credenciais para enviar mensagens. Para que isso seja possível, você dever ajustar as configurações conforme orientado neste link:
https://support.google.com/mail/answer/78754
Abraço!
Excelente seu blog André! Já está nos meus favoritos, obrigado!
Já vou aproveitar o embalo…
No meu caso deu certo as dll’s compilando pra win 32, porém, se eu quiser compilar essa aplicação pra Os X não vou poder levar as dll’s, a única saída são elas mesmo?
Como faço pra usar essa função compilando pra Os X?
Olá, Lucas!
Agradeço por adicionar o blog nos favoritos! Estou meio ausente nas publicações, mas pretendo retornar os trabalhos em breve.
Lucas, infelizmente não tenho conhecimento de deploy de aplicações Delphi para Os X. Mesmo assim, já anotei o seu contato e, se eu ler ou souber de algo, entro em contato, ok?
Abraço!
Olá André Celestino,
Tudo bem?
Esse mensagem é para lhe agradecer a grande ajuda que você me deu na solução do meu problema. Muitíssimo obrigado. Consegui enviar email através do Delphi 7 usando Gmail, INDY 9, idSMTP, idMessage e TIdSSLIOHandlerSocket. Precisei alterar a configuração da minha conta no Gmail para permitir que aplicativos menos seguros acessem a conta.
Olá, Marcelo!
Fico feliz por ter ajudado! Agradeço por dedicar o tempo para voltar e deixar este comentário!
Um grande abraço!
Gostaria de saber se alguém conseguiu utilizar essa rotina de envio, principalmente utilizando o gmail sem precisar alterar as configurações da conta no Gmail para permitir que aplicativos menos seguros acessem a conta.
Olá, Iramar, tudo bem?
Depois que o Gmail adicionou essa segunda camada de segurança, não encontrei formas de enviar e-mails a partir de aplicações externas. Acredito que esse é justamente o motivo dessa segurança.
Por esse motivo, alguns desenvolvedores migraram para outros servidores de e-mail que não exigem essa configuração.
Mesmo assim, se eu souber de algo, menciono aqui nos comentários.
Abraço!
Bom dia André L. Celestino, já estive aqui com algumas dúvidas, mas também encontrei minhas soluções. Minha duvida agora é fora do assunto em questão. Você sabe ou tem algum material que me ajude a verificar se o e-mail existe usando os componentes indy? Tem alguns sites que fazem isso mas são limitados. Queria fazer isso ilimitado. Desde já agradeço, um grande abraço.
Olá, João Rufino, tudo bem?
Por motivos de segurança e bloqueio de spams, alguns domínios de e-mail restringem a verificação de endereços existentes. Por conta disso, o máximo que podemos validar é a sintaxe correta do e-mail. Clique no link abaixo para conferir um exemplo de função que valida o endereço:
http://delphiexamples.com/internet/checkemail.html
Abraço!
COnsegui enviar atraves do gmail,
mas no outlook da este erro
Erro na conexão ou atenticação: Error connecting
with SSL.
erro:140770FC:SSL
routinesSSL23_GET_SERVER-HELLO:unknown protocol
não tem como enviar sem utilizar o aplicativo do outlook como tem de bonus ai?
Olá, Daiane. Vi que você já enviou um e-mail com essa dúvida. Vou responder por lá, ok?
Até mais.
Boa tarde André, utilizava o Indy 9 com Delphi 7 no Windows 7 para enviar e-mail e tudo funcionava perfeitamente.
Agora com o Windows 10 começo a dar Access Violation e a única forma de funcionar foi instalar o Indy 10, porém está demorando cerca de 1 minuto para enviar cada e-mail.
Por acaso você já passou por isso ou pode dar alguma dica para me ajudar?
Abraços
Olá, Clodoaldo, como vai?
Já passei, sim, por uma situação parecida. No meu caso, o problema estava relacionado com as novas restrições de segurança do Windows 10. Para que voltasse a funcionar corretamente, abri uma exceção para o aplicativo no Firewall do Windows, no Windows Defender e no antivírus. Siga esses passos e, além disso, experimente também configurar o seu aplicativo para ser executado como administrador. Dessa forma ele terá privilégios adicionais.
Abraço!
Olá André, parabéns pelo tutorial. Gostaria de uma ajuda sua com o yahoo, o que deve configurar em SSL/SMTP para que ele funcione? Estou usando o XE5 com Indy 10.
Boa noite, Yuri!
Claro que posso ajudá-lo. Vou entrar em contato por e-mail.
Abraço!
Oi André,
Seu exemplo foi excelente! obrigado ajudou bastante.
Muito obrigado, Odair!
Grande abraço! 🙂
André,
Estou recebendo o seguinte erro: Erro na conexão e/ou autenticação: Socket Error # 11004.
Poderia me ajudar?
Abraços
Boa tarde, Jairo.
O erro 11004 geralmente refere-se a uma exceção do próprio Sistema Operacional, como falha na conexão com a internet ou problemas com o DNS. Em alguns sites, mencionam também que este erro pode ser causado por um falha de integridade nos arquivos do Windows. Para eliminar essas possibilidades, experimente testar esse envio em outro PC.
Abraço!
Boa tarde André, estava pensando aqui sobre threads, e estou com um problema para liberar ela da memoria.. qual é o procedimento correto?eu chamo o metodo terminate porem apos eu dou um free e ai me da um access violation
ThreadEnviaNf.Terminate;
ThreadEnviaNf.Free;
alguma coisa errada? parece que ela não terminou de verdade apenas setou o atributo terminated.
Olá, Cássio!
Acredito que uma das melhores abordagens é ativar a propriedade FreeOnTerminate da thread:
Dessa forma, a thread será automaticamente liberada da memória no término de sua execução. 🙂
Olá André certo entendi o que você disse, mas deixa eu ser mais especifico. Eu tenho uma tela com um Grid com lista de emails. Quando clico nesta tela, crio minha thread:
Perceba que eu tenho o atributo público “GeraEmail”. Este é um DM que eu passo a lista de emails selecionados e tem métodos para criar os objetos e enviar o email. Na minha thread:
E eu tenho um override do destructor que faz:
Beleza, envia o email corretamente, porém quando vou dar um Close na tela que chamou tudo isso, eu faço
E me da Access Violation.
O mesmo acontece se eu fizer :
Não consegui entender. Ele termina a thread e não desaloca do ponteiro?
Como fazer? Porque se eu clicar na tela para enviar sem fechar, vai dar erro também porque ela já está com a variável da thread alocada, então não consigo fechar nem refazer o processo sem fechar a tela. Alguma dica, meu nobre amigo?
Cássio, vou entrar em contato com você por e-mail solicitando mais detalhes.
Vamos tentar solucionar essa situação. Abraço!
Parabéns.. pelo artigo.
Obrigado, Josimar! 🙂
André. Bom dia!
Sou iniciante no Delphi.
Usei suas a sua orientação para enviar e-mail pelo delphi 7 e funcionou perfeitamente. No entanto, não estou conseguindo implementar o processo numa Thread.
Há possibilidades de me enviar um exemplo de Enviar e-mail com Thread?
Desde já obrigado!
Olá, Rui!
O código do artigo deveria funcionar em uma thread. Vou entrar em contato com você para pedir o seu código, ok?
Abraço!
André, boa tarde! o código está perfeito, mas preciso passar pelo proxy, pode me ajudar?
Olá, Alexandre, tudo bem?
Para configurar o proxy, você precisa vincular um componente
TIdSocksInfo
à propriedadeSocksInfo
do componenteTIdSSLIOHandlerSocket
.O componente
TIdSocksInfo
disponibiliza as propriedades necessárias para configuração, como Host, Port, Username e Password.Abraço!
André, bom dia! Fiz a vinculação do componente, mas ainda não tive sucesso, vc poderia enviar um exemplo aplicando no seu código, por favor!
Olá, Alexandre!
Infelizmente não tenho um ambiente disponível com proxy aqui para fazer o teste, mas vou entrar em contato com você.
Abraço!
O usuário e senha são obrigatórios quando seto UseTLS com utUseRequireTLS ?
Olá, Alberto.
Se não me engano, a obrigatoriedade do usuário e senha é uma característica do webmail que você está utilizando, independente do protocolo.
Abraço!
Boa tarde.
Utilizei o seu exemplo acima para enviar email. Já coloquei as DLLs na pasta onde está o programa e dentro da pasta bin do Delphi. Mas quando rodo ele mostra o seguinte erro: Could not load SSL library. O que pode estar faltando já que eu copiei o seu exemplo? Utilizo o Delphi 7. Desde já agradeço a sua ajuda.
Olá, Francisco, tudo bem?
Se as DLLs já estão na mesma pasta em que está o executável, o envio deveria funcionar. A mensagem “Could not load SSL library” significa que o programa não está encontrando as duas DLLs necessárias.
Talvez esse erro possa estar relacionado com a versão das DLLs. Experimente baixá-las deste link:
https://www.andrecelestino.com/wp-content/files/DLL-SSL-Delphi7.rar
Abraço!
Tudo legal e com você?
Obrigado pelo retorno.
Fiz o que você orientou e agora aparece esse erro: ‘Error Connecting with SSL’. Deve está faltando algum detalhe que não sei o que é. Pode me ajudar mais uma vez?
Desde já agradeço maus uma vez sua atenção
Olá, Francisco!
Acredito que o erro se refere ao TLS. Este link pode ajudá-lo.
Abraço!
Olá André ! Boa tarde !
Ótimo artigo. Era justamente o que eu procurava. Bom ver que um artigo postado a tantos anos, ainda está ajudando a muitas pessoas. Obrigado.
Olá, Mario, boa tarde!
Fico feliz por ter ajudado! Em breve pretendo melhorar esse artigo e também criar um componente já pronto para fazer esses envios.
Obrigado pelo comentário!
Abraço.
Utilizando uma conta do HOTMAIL.
IdSmtp->AuthenticationType = atLogin;
IdSmtp->Username = Conta;
IdSmtp->Password = Senha;
IdSmtp->Port = intToStr(587);
IdSmtp->Host = “smtp.live.com”;
IdSSLSocket->SSLOptions->Method = sslvTLSv1;
IdSSLSocket->SSLOptions->Mode = sslmUnassigned;
IdSmtp->IOHandler = IdSSLSocket;
IdSmtp->Connect( 5000 );
-> Me ocorre erro ao fazer login para enviar o e-mail, “Error connecting with SSL.”
-> Tentei também com:
IdSSLSocket->SSLOptions->Method = sslvSSLv23;
IdSSLSocket->SSLOptions->Mode = sslmClient;
E persiste o erro.
-> Pode me ajudar?
Olá, Danrlei, como vai?
Experimente configurar os componentes da forma como está neste comentário:
https://www.andrecelestino.com/delphi-xe-envio-de-e-mail-com-componentes-indy/#comment-1298
Abraço!
Excelente, me ajudou muitíssimo. Eu só usava o bol, agora utilizarei outros provedores.
Muito obrigado.
Legal, André! 🙂
Ola, André meu nome é bruno, entrei em contato com você esses dias e você me respondeu pelo email [email protected] , tive problema para te responder por esse email.
Amigo Estou usando o delphi 7. entre em contato comigo por essses outro email fazendo favor..
Criei uma classe baseada no seu exemplo:
unit UEmail;
interface
uses
Classes, SysUtils, IdSMTP, IdMessage, IdSSLOpenSSL;
type
TOrigem = (torSuporte);
TConexao = (tcxSSl, tcxTLS);
TEmail = class(TComponent)
private
FNome : String;
FHost : String;
FPorta : Integer;
FAnexos : TStringList;
FMsgErro : String;
FAssunto : String;
FUserName : String;
FPassword : String;
FMensagem : String;
FEMailOrig : String;
FEMailDest : TStringList;
public
function EnviaEmail: Boolean; overload; virtual;
function EnviaEmail(POrigem : TOrigem; PEMailDest : String; PAssunto : String;
PMensagem : String; PAnexos : String): Boolean; overload; virtual;
function EnviaEmail(PUserName : String; PPassword : String; PPorta : Integer;
PHost : String; Conexao : TConexao; PNome : String; PEMailOrig : String;
PEMailDest : String; PAssunto : String; PMensagem : String;
PAnexos : String): Boolean; overload; virtual;
function EnviaEmail(PUserName : String; PPassword : String; PPorta : Integer;
PHost : String; Conexao : TConexao; PNome : String; PEMailOrig : String;
PEMailDest : TStringList; PAssunto : String; PMensagem : String;
PAnexos : TStringList): Boolean; overload; virtual;
published
property Nome : String read FNome write FNome;
property Host : String read FHost write FHost;
property Porta : Integer read FPorta write FPorta;
property Anexos : TStringList read FAnexos write FAnexos;
property Assunto : String read FAssunto write FAssunto;
property MsgErro : String read FMsgErro write FMsgErro;
property UserName : String read FUserName write FUserName;
property Password : String read FPassword write FPassword;
property Mensagem : String read FMensagem write FMensagem;
property EMailOrig : String read FEMailOrig write FEMailOrig;
property EMailDest : TStringList read FEMailDest write FEMailDest;
end;
function EnviaEmail(PUserName : String; PPassword : String; PPorta : Integer;
PHost : String; Conexao : TConexao; PNome : String; PEMailOrig : String;
PEMailDest : TStringList; PAssunto : String; PMensagem : String;
PAnexos : TStringList): Boolean; overload;
function EnviaEmail(PUserName : String; PPassword : String; PPorta : Integer;
PHost : String; Conexao : TConexao; PNome : String; PEMailOrig : String;
PEMailDest : String; PAssunto : String; PMensagem : String;
PAnexos : String): Boolean; overload;
implementation
uses
UUtil, UExcecao;
function EnviaEmail(PUserName : String; PPassword : String; PPorta : Integer;
PHost : String; Conexao : TConexao; PNome : String; PEMailOrig : String;
PEMailDest : TStringList; PAssunto : String; PMensagem : String;
PAnexos : TStringList): Boolean;
var
Email : TEmail;
begin
try
Email := TEmail.Create(Nil);
Result := Email.EnviaEmail(PUserName, PPassword, PPorta, PHost, Conexao, PNome,
PEMailOrig, PEMailDest, PAssunto, PMensagem, PAnexos);
finally
FreeAndNil(Email);
end;
end;
function EnviaEmail(PUserName : String; PPassword : String; PPorta : Integer;
PHost : String; Conexao : TConexao; PNome : String; PEMailOrig : String;
PEMailDest : String; PAssunto : String; PMensagem : String;
PAnexos : String): Boolean; overload;
var
Email : TEmail;
begin
try
Email := TEmail.Create(Nil);
Result := Email.EnviaEmail(PUserName, PPassword, PPorta, PHost, Conexao, PNome,
PEMailOrig, PEMailDest, PAssunto, PMensagem, PAnexos);
finally
FreeAndNil(Email);
end;
end;
function TEmail.EnviaEmail: Boolean;
begin
Result := EnviaEmail(FUserName, FPassword, FPorta, FHost, tcxTLS, FNome, FEMailOrig,
FEMailDest, FAssunto, FMensagem, FAnexos)
end;
function TEmail.EnviaEmail(POrigem: TOrigem; PEMailDest, PAssunto,
PMensagem, PAnexos: String): Boolean;
begin
FPassword := EmptyStr;
FUserName := LerINI('ARQUIVO', 'EMAIL', 'USERNAME', EmptyStr);
FPorta := StrToInt(LerINI('ARQUIVO', 'EMAIL', 'PORTA', '0'));
FHost := LerINI('ARQUIVO', 'EMAIL', 'HOST', EmptyStr);
case POrigem of
torSuporte :
begin
FNome := 'Suporte';
FEMailOrig := '[email protected]';
end;
end;
Result := EnviaEmail(FUserName, FPassword, FPorta, FHost, tcxTLS, FNome, FEMailOrig,
PEMailDest, PAssunto, PMensagem, PAnexos)
end;
function TEmail.EnviaEmail(PUserName, PPassword: String; PPorta: Integer;
PHost: String; Conexao: TConexao; PNome, PEMailOrig, PEMailDest,
PAssunto, PMensagem, PAnexos: String): Boolean;
var
sAux : String;
nIndex : Integer;
oAnexos,
oEMailDest : TStringList;
begin
try
oAnexos := TStringList.Create;
oEMailDest := TStringList.Create;
sAux := EmptyStr;
for nIndex := 1 to Length(PEMailDest) do
begin
if (nIndex = Length(PEMailDest)) or (PEMailDest[nIndex] = ';') then
begin
oEMailDest.Add(sAux);
sAux := EmptyStr;
end
else
sAux := sAux + PEMailDest[nIndex];
end;
for nIndex := 1 to Length(PAnexos) do
begin
if (nIndex = Length(PAnexos)) or (PAnexos[nIndex] = ';') then
begin
oAnexos.Add(sAux);
sAux := EmptyStr;
end
else
sAux := sAux + PAnexos[nIndex];
end;
if oEMailDest.Count > 0 then
Result := EnviaEmail(PUserName, PPassword, PPorta, PHost, Conexao, PNome, PEMailOrig,
oEMailDest, PAssunto, PMensagem, oAnexos)
else
begin
Result := False;
MsgErro := 'Nenhum destinário informado!';
end;
finally
FreeAndNil(oAnexos);
FreeAndNil(oEMailDest);
end;
end;
function TEmail.EnviaEmail(PUserName : String; PPassword : String; PPorta : Integer;
PHost : String; Conexao : TConexao; PNome : String; PEMailOrig : String;
PEMailDest : TStringList; PAssunto : String; PMensagem : String;
PAnexos : TStringList): Boolean;
var
nIndex: Integer;
IdSSLIOHandlerSocket: TIdSSLIOHandlerSocket;
IdSMTP: TIdSMTP;
IdMessage: TIdMessage;
begin
Result := True;
IdSSLIOHandlerSocket := TIdSSLIOHandlerSocket.Create(Self);
IdSMTP := TIdSMTP.Create(Self);
IdMessage := TIdMessage.Create(Self);
try
case Conexao of
tcxSSl :
begin
IdSSLIOHandlerSocket.SSLOptions.Method := sslvSSLv23;
IdSSLIOHandlerSocket.SSLOptions.Mode := sslmClient;
end;
tcxTLS :
begin
IdSSLIOHandlerSocket.SSLOptions.Method := sslvTLSv1;
IdSSLIOHandlerSocket.PassThrough := True;
IdSSLIOHandlerSocket.SSLOptions.Mode := sslmServer;
end;
end;
if UserName = EmptyStr then
IdSMTP.AuthenticationType := atNone
else
IdSMTP.AuthenticationType := atLogin; //atNone
IdSMTP.Port := Porta;
IdSMTP.Host := Host;
IdSMTP.Username := UserName;
IdSMTP.Password := Password;
try
IdSMTP.Connect;
IdSMTP.Authenticate;
except
on E : Exception do
begin
if not (Owner is TExcecao) then
EExcecao.MyException(Self, E);
Result := False;
MsgErro := 'Falha com a conexão SMTP: ' + E.Message;
Exit;
end;
end;
IdMessage.From.Address := EMailOrig;
IdMessage.From.Name := Nome;
IdMessage.ReplyTo.EMailAddresses := IdMessage.From.Address;
if EMailDest.Count = 1 then
IdMessage.Recipients.EMailAddresses := EMailDest[0]
else
for nIndex := 0 to EMailDest.Count - 1 do
IdMessage.Recipients.Add.Text := EMailDest[nIndex];
IdMessage.Subject := Assunto;
IdMessage.Body.Text := Mensagem;
for nIndex := 0 to PAnexos.Count do
if FileExists(PAnexos[nIndex]) then
TIdAttachment.Create(IdMessage.MessageParts, PAnexos[nIndex]);
try
IdSMTP.Send(IdMessage);
except
on E : Exception do
begin
if not (Owner is TExcecao) then
EExcecao.MyException(Self, E);
Result := False;
MsgErro := 'Falha ao enviar e-mail: ' + E.Message;
Exit;
end;
end;
finally
FreeAndNil(IdMessage);
FreeAndNil(IdSSLIOHandlerSocket);
FreeAndNil(IdSMTP);
end;
end;
end.
Olá, Eduardo.
Muito obrigado! Espero que os próximos leitores vejam seu comentário. Vai ajudá-los bastante!
Abraço.