Você está na página 1de 4

Enviar E-mail usando TIdSMTP + SSL Indy Delphi

Este post aborda o uso do componente Indy 9 + suporte a SSL (conexo segura de dados) no RAD Delphi 7.
Como a aplicao exemplo mostrada logo abaixo extremamente simples, utilizaremos a biblioteca ZeosLib
com o banco de dados SQLite, do qual pode ser facilmente implementado em qualquer aplicao standalone
(local). Caso tenha dvidas em como utilizar a biblioteca ZeosLib com o SQLite entre em contato comigo. (no
ms de Dezembro/2010 ser publicado o artigo Construindo aplicaes Delphi com SQLite e ZeosLib
na Active Delphi).
Introduo
Em alguns momentos necessrio que nossa aplicao 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 o servidor
SMTP que queremos utilizar trabalha.
Um exemplo corriqueiro o uso de uma conta de e-mail do Gmail, este servidor SMTP em particular, requer
autenticao e utiliza conexo segura de dados usando SSL, especificamente TLS sobre a porta 465. Abaixo
detalhado a configurao para o envio de e-mail utilizando contas do Gmail.
Configurao envio de e-mail (servidor SMTP)
Nome da conta: exemplo@gmail.com
Servidor: smtp.gmail.com
Porta: 465
Opo 1: servidor requer autenticao (selecionada) Opo 2: usar conexo segura via TLS (porta 465)
Nota: Caso no tenha conectividade com o servidor SMTP com a configurao citada, verifique se algum
programa firewall ou antivrus est impedindo a conexo para as portas 465, 587, 995, 993.
Implementao no Delphi
1. Testando a conectividade com o servidor SMTP
Para o teste de conectividade devemos criar um form com os campos edits: servidor SMTP, porta, usurio,
senha; os campos checkbox: meu servidor requer autenticao, utilizar conexo segura SSL/TLS e um boto
Testar conexo para verificarmos se a configurao esta correta; os componentes Indy: TIdSMTP (aba Indy) e
TIdSSLIOHandlerSocket (aba Indy/IO Handlers) veja a figura 1:

Para efetuarmos uma conexo segura SSL utilizando o componente TIdSSLIOHandlerSocket, ainda
necessrio a utilizao da biblioteca OpenSSL, que pode ser baixada do site indy.fulgan.com/SSL. Efetue o
download do arquivo indy_OpenSSL096m.zip, descompacte este arquivo em qualquer diretrio, copie as duas
dlls (libeay32.dll e ssleay32.dll) para o diretrio onde sua aplicao est.
No componente TIdSMTP, atribua para a propriedade IOHandler o componente TIdSSLIOHandlerSocket.
A informao que vem do form devemos atribuir as propriedades do TIdSMTP para testar se a configurao
inserida no form est correta. Quando clicamos no boto testar conexo podemos efetuar isto, conforme
mostrado no cdigo-fonte abaixo.

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

// - Rotina do botao abaixo testa a conexao com o servidor SMTP


// - Se a configurao do servidor SMTP estiver correta imediatamente exibida
// uma mensagem de conexao com exito
// - Caso contrrio quando a conexo testada demora-se muito para obter um
// retorno de resposta e exibida uma mensagem de erro ao conectar no servidor
SMTP
procedure TFrmConfEmail.btnConexaoClick(Sender: TObject);
begin
Try
Screen.Cursor
:= crHourGlass;
IdSMTP1.Host
:= Trim(edtServidorSMTP.Text);
IdSMTP1.Username := Trim(edtUsuarioServ.Text);
IdSMTP1.Password := Trim(edtSenhaServ.Text);
IdSMTP1.Port
:= StrToInt(Trim(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 conexo realizado com sucesso!')
else
ShowMessage('DESCONECTADO> Tesde de conexo FALHOU!');
Except
on E:Exception do
ShowMessage(e.Message);
end;
IdSMTP1.Disconnect;
Screen.Cursor:= crDefault;
end;

Para enviarmos email devemos colocar o componente Indy IdMessage, do qual representa o cabealho e
corpo do email, com recursos de CC, BCC e anexo. Os campos edits: conta de email padro, assunto e
mensagem do form acima so utilizados no corpo do email, compondo o assunto e mensagem do email
enviado. Segue abaixo cdigo-fonte para envio de email:

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

procedure EnviarEmail;
begin
IdSMTP1.Host
:= Trim(edtServidorSMTP.Text);
IdSMTP1.Username := Trim(edtUsuarioServ.Text);
IdSMTP1.Password := Trim(edtSenhaServ.Text);
IdSMTP1.Port
:= StrToInt(Trim(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 := Trim(edtContaEmail.Text);
IdMessage1.Subject
:= Trim(edtAssunto.Text);
IdMessage1.Body.Text
:= Trim(MemoMsg.Lines.Text);
//-- DESTINO
IdMessage1.Recipients.EMailAddresses
IdMessage1.BccList.EMailAddresses
IdMessage1.CCList.EMailAddresses

:= email_cliente@hotmail.com;
:= '';
:= '';

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 no exista mais segredos na utilizao do componente Indy + SSL para envio de email.
Caso tenha interesse em melhorar ou utilizar o exemplo exposto acima em suas aplicaes, o cdigo-fonte do
mesmo pode ser baixado em http://downloads.named.com.br/delphi/EnviarEmail_IndySSL.rar.
Espero que este post seja til para a comunidade.
Isso tudo pessoal!

Ah sim, somente para esclarecimento a funo AllTrim remove os espaos da direita e da esquerda de uma
string, segue cdigo abaixo:
function AllTrim( Dados: string ): string;
var
Contar: integer;
begin
Dados := Trim( Dados );
for Contar := 1 to Length( Dados ) do begin
if Copy( Dados, Contar, 1 ) <> then Break;
Dados := Copy( Dados, Contar + 1, Length( Dados ) 1 );
Application.ProcessMessages;
end;
AllTrim := Dados;
end;