Enviar E-mail Indy Delphi

4
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 ZeosLibna 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:

description

Enviar E-mail Indy Delphi

Transcript of Enviar E-mail Indy Delphi

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

Page 2: Enviar E-mail Indy Delphi

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;

Page 3: Enviar E-mail Indy Delphi

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

Page 4: Enviar E-mail Indy Delphi

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;