[Delphi 7] Envio de e-mail com componentes Indy

[Delphi] Envio de e-mail com componentes IndyCerta 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!

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.

Em seguida, já no projeto, devemos declarar as units que fazem referência à estes 3 componentes:

uses
  IdSMTP, IdMessage, IdSSLOpenSSL;

 

Por fim, basta implementar o código abaixo no botão que fará o envio do e-mail:

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.Address := 'meu.email@gmail.com';
    IdMessage.From.Name := 'Meu Nome';
    IdMessage.ReplyTo.EMailAddresses := IdMessage.From.Address;
    IdMessage.Recipients.EMailAddresses := 'destinatario@email.com';
    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, a implementação também é bem simples!

Primeiro, declare a unit ComObj na uses do seu formulário:

uses
  ComObj;

 E no botão para envio do e-mail, use este código:

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!


 

Compartilhe!
Share on FacebookTweet about this on TwitterShare on LinkedInShare on Google+Pin on PinterestEmail this to someone

190 comentários

  1. 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.

    1. 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!

  2. 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…

  3. 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.

  4. Muito bom cara! Procurei em todo lugar e não dava jeito, essa sua implementação foi show de bola! Obrigado!

  5. 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 ???

  6. 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?

    1. 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 ‘andre@gmail.com’ e ‘123456’, respectivamente.

  7. 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!

    1. 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!

  8. No Delphi XE o comando TIdAttachment.Create aparentemente não existe, alterei para TIdAttachmentFile.Create e funcionou perfeitamente.

    Obrigado!

    1. 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!

  9. Bom dia, estou tentando utilizar o seu código para abrir o thunderbird e não estou encontrando nenhuma solução, tens alguma dica?

    1. 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 "to=destinatario@email.com.br,attachment=''file:///c:/test.txt''",
      nil, SW_SHOWNORMAL);

      Abraço!

  10. 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?

  11. 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”

    1. 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!

  12. 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?

    1. 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!

  13. 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

  14. 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 !!!

    1. 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!

  15. 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 := ‘meu_email_terra@terra.com.br’;
    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 := ‘meu_email_terra@terra.com.br’;
    IdMessage.From.Name := ‘Ricardo – Terra’;
    IdMessage.ReplyTo.EMailAddresses := IdMessage.From.Address;
    IdMessage.Recipients.EMailAddresses := ‘destinatario_desejado@provedordele.com.br’;
    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;

  16. 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?

    1. 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!

  17. Usei esta dica e Esta dando o seguinte erro.
    Socket error #10061 connection refused voces sabem que erro e este.

    1. 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!

  18. 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á!

    1. Olá, Alexsander! Ótima pergunta.
      Para enviar o e-mail para mais de um destinatário, basta substituir a linha:
      IdMessage.Recipients.EMailAddresses := 'destinatario@email.com';
      por:
      IdMessage.Recipients.Add.Text := 'destinatario1@email.com';
      IdMessage.Recipients.Add.Text := 'destinatario2@email.com';

      Abraço!

  19. Ola andre esta aparecendo a seguinte mensagem no meu codigo..

    “failed to set data for ””

    quando executo meu codigo, o que pode ser?

  20. 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?

  21. Boa Tarde André, tenho que fazer essa mesma aplicação com autenticação TLS como faço??? Host para envio: smtp.office365.com

    1. 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!

  22. 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.

    1. 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!

  23. 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.

  24. 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 := ‘meuemail@gmail.com’;
    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 := ‘meuemail@gmail.com’;
    IdMessage.From.Name := ‘MeuNomeEmailGmail’;
    IdMessage.ReplyTo.EMailAddresses := IdMessage.From.Address;
    IdMessage.Recipients.EMailAddresses := ‘destinatario@email.com’;
    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.

    1. 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.

  25. 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( ‘emailoffice365@dominio.com.br’, // Email
    ‘emailoffice365@dominio.com.br’, // 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: eu@vc.com;teste@teste.com…
    w_PARA_CC, // Destinatario em Copia, ex: eu@vc.com;teste@teste.com…
    w_PARA_CCO, // Destinatario em Copia Oculta, ex: eu@vc.com;teste@teste.com…
    w_ANEXO, // ANEXO
    w_assunto ); // Assunto

    1. 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(‘contateste@contacom.com.br’, // Email
      ‘contateste@contacom.com.br’, // 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
      ‘aqlqxqcqhqs@gmail.com’, // Destinatario, ex: eu@vc.com;teste@teste.com…
      ”, // Destinatario em Copia, ex: eu@vc.com;teste@teste.com…
      ”, // Destinatario em Copia Oculta, ex: eu@vc.com;teste@teste.com…
      ”, // 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

    1. 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!

  26. 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.

  27. 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?

    1. 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!

  28. 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

    1. 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!

  29. Boa Tarde André, muito bom seu artigo, o primeiro da Net que funciona perfeitamente, estou procurando à meses um artigo como este, ótimo, parabens.

  30. 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 xx@gmail.com 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.

  31. 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á.

    1. 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!

  32. 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

    1. 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!

  33. 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’;

    1. 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!

  34. 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 😀

  35. 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.

    1. 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!

  36. 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é.

  37. 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…

    1. 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!

  38. 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?

    1. 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!

  39. 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.

    1. 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!

  40. 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

    1. 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!

  41. 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

  42. 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

  43. 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.

  44. 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!

  45. Bom dia André, obrigado por sua atenção, infelizmente não funcionou; continua com o erro “Could not load SSL library”

  46. 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

  47. 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

  48. 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!

    1. 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!

  49. 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.

    1. 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;

  50. 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?

  51. 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

  52. 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’

  53. 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????

  54. 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?

  55. 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.

  56. 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.

  57. 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

  58. 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!

    1. 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!

  59. 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.

  60. 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;

    1. 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!

  61. 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…

    1. 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!

  62. 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.

    1. 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!

    2. 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.

    3. 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!

  63. 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.

    1. 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!

    2. 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.

    3. 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

  64. 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.

    1. Olá, André!
      Muito obrigado pela ajuda, deu tudo certo!
      Valeu mesmo!!!

      Att,
      Wesley Menezes

  65. 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 .

  66. 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

    1. 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:

      // declaração do evento
      procedure OnMailSend(Sender: TObject; var Cancel: WordBool);
      // implementação do evento
      procedure OnMailSend(Sender: TObject; var Cancel: WordBool);
      begin
        ShowMessage('Enviado!');
      end;
      // código de envio do e-mail
      var
        oMsg: _MailItem;
        oEmail: TMailItem;
      begin
        // adicione o componente "OutlookApplication" no formulário
        oMsg := OutlookApplication1.CreateItem(olMailItem) as _MailItem;
      
        oEmail := TMailItem.Create(nil);
        try
          oEmail.ConnectTo(oMsg);
          oEmail.OnSend := OnMailSend;
      
          oMsg.Recipients.Add('destinatario@email.com');
          oMsg.Display(True);
        finally
          oEmail.Free;
        end;
      end;

      Deixo claro que não testei esse código, já que “abandonei” o Outlook há algum tempo, rsrs.
      Abraço!

    2. 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!

    3. 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.

  67. 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 ?

    1. 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!

    2. 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.

    1. 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:

      procedure TMinhaThread.Execute;
      begin
        inherited;
        EnviarEmail;
      end;

      E para chamá-la seria algo como:

      var
        Thread: TMinhaThread;
      begin
        Thread := TMinhaThread.Create;
        Thread.Execute;
      end;

      Abraço!

  68. 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 !

    1. 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!

  69. 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 !

  70. 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.

  71. 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?

  72. 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.

  73. 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?

    1. 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!

  74. 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.

  75. 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.

    1. 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!

  76. 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.

  77. 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?

  78. 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

    1. 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!

  79. 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.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Preencha o campo abaixo * Time limit is exhausted. Please reload CAPTCHA.