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
|