Clique para saber mais...
  Home     Download     Produtos / Cursos     Revista     Vídeo Aulas     Fórum     Contato   Clique aqui para logar | 14 de Janeiro de 2026
  Login

Codinome
Senha
Salvar informações

 Esqueci minha senha
 Novo Cadastro

  Usuários
84 Usuários Online

  Revista ActiveDelphi
 Assine Já!
 Edições
 Sobre a Revista

  Conteúdo
 Apostilas
 Artigos
 Componentes
 Dicas
 News
 Programas / Exemplos
 Vídeo Aulas

  Serviços
 Active News
 Fórum
 Produtos / Cursos

  Outros
 Colunistas
 Contato
 Top 10

  Publicidade

  [Artigos]  Enviar E-mail usando TIdSMTP + SSL - Indy / Delphi
Publicado por KMerlotti : Quinta, Dezembro 30, 2010 - 12:11 GMT-3 (1276 leituras)
Comentários 1 Comentário   Enviar esta notícia a um amigo Enviar para um amigo   Versão para Impressão Versão para impressão
Ryan Padilha Este post aborda o uso do componente Indy 9 + suporte a SSL (conexão segura de dados) no Delphi 7. Como a aplicação exemplo mostrada logo abaixo é extremamente simples, utilizaremos a biblioteca ZeosLib com o banco de dados SQLite, do qual pode ser facilmente implementado em qualquer aplicação standalone (local). Caso tenha dúvidas em como utilizar a biblioteca ZeosLib com o SQLite, fique a vontade para entrar em contato comigo!

Introdução

Em alguns momentos é necessário que nossa aplicação automatize o envio de e-mail para os clientes. Dependendo da conta de e-mail (servidor SMTP) que utilizamos para o envio automatizado, isto pode se tornar uma tarefa trabalhosa e demorada, pois precisamos conhecer diversos aspectos de como trabalha o servidor SMTP que queremos utilizar.

Um exemplo corriqueiro é o uso de uma conta de e-mail do Gmail, este servidor SMTP em particular requer autenticação e utiliza conexão segura de dados usando SSL, especificamente TLS sobre a porta 465. Abaixo é detalhado a configuração para o envio de e-mail utilizando contas do Gmail.

 

Configuração envio de e-mail (servidor SMTP)

Nome da conta: exemplo@gmail.com
Servidor: smtp.gmail.com
Porta: 465
Opção 1: servidor requer autenticação (selecionada)
Opção 2: usar conexão segura via TLS (porta 465)

Nota: Caso não consiga conectividade com o servidor SMTP com a configuração citada, verifique se algum programa firewall ou antivírus está impedindo a conexão para as portas 465, 587, 995, 993.

 

Implementação no Delphi

1. Testando a conectividade com o servidor SMTP

Para o teste de conectividade devemos criar um form com os campos edit’s: servidor SMTP, porta, usuário, senha; os campos checkbox: meu servidor requer autenticação, utilizar conexão segura SSL/TLS; e um botão "Testar Conexão" para verificarmos se a configuração esta correta; os componentes Indy: TIdSMTP (aba Indy) e TIdSSLIOHandlerSocket (aba Indy/IO Handlers). Veja a figura 1:


Figura 1 - Interface de exemplo para configuração do programa para o envio de e-mail, com os componentes Indy9

Para efetuarmos uma conexão segura SSL utilizando o componente TIdSSLIOHandlerSocket, ainda é necessário a utilização da biblioteca OpenSSL, que pode ser baixada aqui: indy_OpenSSL096m.zip. Após o download do arquivo, descompacte-o em qualquer diretório e copie as duas dll’s (libeay32.dll e ssleay32.dll) para o diretório onde sua aplicação está.

Obs.: Caso queira mais informações ou a versão mais recente da biblioteca, ou até mesmo os arquivos mais antigos (diretório archive), visite o site do projeto: indy.fulgan.com/SSL

No componente TIdSMTP, atribua para a propriedade IOHandler o componente TIdSSLIOHandlerSocket. A informação que vem do form devemos atribuir as propriedades do TIdSMTP para testar se a configuração inserida no form está correta. Quando clicamos no botão testar conexão podemos efetuar isto, conforme mostrado no código-fonte abaixo.

//funcao AllTrim - remove espacos em branco do lado direito e esquedo da string
function AllTrim(buffer: string): string;
var
   I: integer;
begin
   buffer := Trim(buffer);
   for I := 1 to Length(buffer) do begin
      if Copy(buffer, I, 1 ) <> ' ' then
         Break;
 
      buffer := Copy(buffer, I + 1, Length(buffer) - 1);
      Application.ProcessMessages;
   end;
   AllTrim := buffer;
end;
 
// - Rotina do botao abaixo testa a conexao com o servidor SMTP
// - Se a configuração do servidor SMTP estiver correta é imediatamente exibida
// uma mensagem de conexao com exito
// - Caso contrário quando a conexão é testada e demora-se muito para obter um
// retorno de resposta, é exibida uma mensagem de erro ao conectar no servidor SMTP
procedure TFrmConfEmail.btnConexaoClick(Sender: TObject);
begin
   Try
      Screen.Cursor  := crHourGlass;
      IdSMTP1.Host := AllTrim(edtServidorSMTP.Text);
      IdSMTP1.Username := AllTrim(edtUsuarioServ.Text);
      IdSMTP1.Password := AllTrim(edtSenhaServ.Text);
      IdSMTP1.Port  := StrToInt(AllTrim(edtPortaServ.Text));
 
      //-- requer autenticacao
      if chkServerRequerAut.Checked then
         IdSMTP1.AuthenticationType:= atLogin
      else
         IdSMTP1.AuthenticationType:= atNone;
 
      //-- conexao segura SSL
      if chkSSL.Checked then
         IdSMTP1.IOHandler := IdSSLIOHandlerSocket1
      else
         IdSMTP1.IOHandler := nil;
 
      if NOT IdSMTP1.Connected then
         IdSMTP1.Connect(2000);
 
      if IdSMTP1.Connected then
         ShowMessage('CONECTADO> Teste de conexão realizado com sucesso!')
      else
         ShowMessage('DESCONECTADO> Tesde de conexão FALHOU!');
   Except
      on E:Exception do
         ShowMessage(e.Message);
   end;
 
   IdSMTP1.Disconnect;
   Screen.Cursor:= crDefault;
end;

2. Enviando Email usando a configuração do Servidor SMTP


Figura 2 - Interface de exemplo para o envio de e-mail

Para enviarmos email devemos colocar o componente Indy IdMessage, do qual representa o cabeçalho e corpo do email, com recursos de CC, BCC e anexo. Os campos edit’s: conta de email padrão, assunto e mensagem do form acima são utilizados no corpo do email, compondo o assunto e mensagem do email enviado. Segue abaixo código-fonte para envio de email:

procedure EnviarEmail;
begin
    IdSMTP1.Host  := AllTrim(edtServidorSMTP.Text);
    IdSMTP1.Username := AllTrim(edtUsuarioServ.Text);
    IdSMTP1.Password := AllTrim(edtSenhaServ.Text);
    IdSMTP1.Port := StrToInt(AllTrim(edtPortaServ.Text));
 
    //-- requer autenticacao
    if chkServerRequerAut.Checked then
       IdSMTP1.AuthenticationType:= atLogin
    else
       IdSMTP1.AuthenticationType:= atNone;
 
    //-- conexao segura SSL
    if chkSSL.Checked then
       IdSMTP1.IOHandler := IdSSLIOHandlerSocket1
    else
       IdSMTP1.IOHandler := nil;
 
    IdMessage1.MessageParts.Clear;
    TIdAttachment.Create(IdMessage1.MessageParts, myFileXML);
 
    //-- ORIGEM
    IdMessage1.From.Address := AllTrim(edtContaEmail.Text);
    IdMessage1.Subject := AllTrim(edtAssunto.Text);
    IdMessage1.Body.Text := AllTrim(MemoMsg.Lines.Text);
 
    //-- DESTINO
    IdMessage1.Recipients.EMailAddresses := email_cliente@hotmail.com;
    IdMessage1.BccList.EMailAddresses := '';
    IdMessage1.CCList.EMailAddresses := '';
 
    if NOT IdSMTP1.Connected then
       IdSMTP1.Connect(2000);
 
    if IdSMTP1.Connected then
    begin
       //IdSMTP1.Authenticate;
       IdSMTP1.Send(IdMessage1);
       Application.ProcessMessages;
 
       IdSMTP1.Disconnect;
    end;
end;

Acredito que não exista mais segredos na utilização do componente Indy + SSL para envio de email! Caso tenha interesse em melhorar ou utilizar o exemplo exposto acima em suas aplicações, o código-fonte do mesmo pode ser baixado em aqui.

Espero que este post seja útil para a comunidade. Caso tenha alguma dúvida entre em contato comigo. Será um prazer ajudar.

Até o próximo artigo. “Isso é tudo pessoal!”

Por: Ryan Bruno C Padilha
Contato: ryan.sk@hotmail.com
Site: http://www.ryanpadilha.com.br



Comentários Comentários
   Ordem:  
Comentários pertencem aos seus respectivos autores. Não somos responsáveis pelo seus conteúdos.


por: osoegawa (pando2002@terra.com.br) : Jan 04, 2011 - 02:54
(Informações sobre o membro | Enviar uma mensagem)
Ryan,

Uso o mesmo código acima na minha aplicação e funciona ok (yahoo,gmail,ig,terra,etc). Para hotmail funciona (em meu ambiente de teste), porém percebi que em ALGUNS clientes está ocorrendo o erro "5.7.0 Must issue a STARTTLS command first". Do hotmail sempre configuro como porta 25,smtp.live.com e sem SSL, delphi 7. Já aconteceu isso com você?
  Edição 112

Revista ActiveDelphi

  50 Programas Fontes


  Produtos

Conheça Nossos Produtos

Copyright© 2001-2016 – Active Delphi – Todos os direitos reservados