Enviar E-mail Indy Delphi
-
Upload
eduardo-mendonca-da-silva -
Category
Documents
-
view
38 -
download
1
description
Transcript of Enviar E-mail Indy Delphi
Enviar E-mail usando TIdSMTP + SSL – Indy Delphi
Este post aborda o uso do componente Indy 9 + suporte a SSL (conexão segura de dados) no RAD 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 – entre em contato comigo. (no
mês de Dezembro/2010 será publicado o artigo “Construindo aplicações Delphi com SQLite e ZeosLib”
na Active Delphi).
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 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
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: [email protected]
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 tenha 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:
Para efetuarmos uma conexão segura SSL utilizando o componente TIdSSLIOHandlerSocket, ainda é
necessário a utilização 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 diretório, copie as duas
dll’s (libeay32.dll e ssleay32.dll) para o diretório onde sua aplicação está.
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.
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 configuração do servidor SMTP estiver correta é imediatamente exibida
// uma mensagem de conexao com exito // - Caso contrário quando a conexão é 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 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;
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:
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 := [email protected]; 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 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 função AllTrim remove os espaços da direita e da esquerda de uma
string, segue código 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;