Capítulo 8. O recurso mais utilizado na Internet é sem dúvida o . Neste capítulo iremos tratar deste assunto com extrema facilidade. - PDF
Capítulo 8. O recurso mais utilizado na Internet é sem dúvida o . Neste capítulo iremos tratar deste assunto com extrema facilidade.
Download "Capítulo 8. O recurso mais utilizado na Internet é sem dúvida o e-mail. Neste capítulo iremos tratar deste assunto com extrema facilidade."
Thalita Cerveira Canejo
1 Enviando s 111 Capítulo 8 Enviando s O recurso mais utilizado na Internet é sem dúvida o . Neste capítulo iremos tratar deste assunto com extrema facilidade. O Delphi 7 traz incorporado em sua biblioteca de componentes o famoso pacote INDY da empresa Nevrona (www.nevrona.com). Na versão 5, o Delphi trazia o pacote da empresa NETMasters que utilizava API do Windows para executar suas funções, e desde a versão 6, foi incluído o pacote INDY. O pacote da NetMasters era muito instável, devido aos inúmeros bugs tanto da parte da NETMasters, como também do Windows. A Nevrona adaptou seu excelente pacote (INDY) para o Kylix, baseado na tecnologia CLX. Com isso temos um excelente desempenho devido à engenharia do pacote. Neste capítulo iremos desenvolver um aplicativo para o envio de s, utilizando os novos componentes da Nevrona. Este aplicativo está registrado na SourceForge com o nome de Mailing.NET em A SourceForge é uma entidade responsável pelo gerenciamento de aplicações com código-fonte aberto, distribuídos sob a licença pública GNU. Um fator bastante importante deste projeto é que o mesmo poderá ser compilado em Kylix, pelo fato de ser baseado na tecnologia CLX. Início do Desenvolvimento Vamos iniciar um novo projeto CLX, e no formulário principal alterar as seguintes propriedades. TForm fm BorderWidth 5 Mailing.Net fm Vamos gravar a unit com o nome f_principal.pas e o projeto como MailingNet.DPR. Insira um objeto do tipo TPanel e altere as propriedades que seguem: 111
2 112 Delphi 7 Internet e Banco de Dados TPanel PnConfigura Align altop ((deixe em branco)) Height 180 PnConfigura Agora com o foco no formulário (objeto fm ), insira um objeto do tipo TSplitter e altere as seguintes propriedades: TSplitter Splitter1 Align altop MinSize 30 O objeto TSplitter é utilizado para dividir seções de um formulário. Em nosso projeto, terá a função de separar as áreas de configuração e texto. Ainda com o foco no formulário insira outro objeto do tipo TPanel e altere as propriedades, como a seguir: TPanel PnTexto Align alclient (((deixe em branco))) PnTexto Repare que estamos na fase de desenvolvimento da interface do aplicativo. Claro que é uma tarefa um pouco cansativa devido ao grande número de objetos do formulário. Mas amigos, acreditem, vale a pena o pequeno esforço. Agora com o foco no objeto PnTexto, insira um objeto do tipo TMemo e altere as propriedades que seguem: TMemo textodo Align alclient Lines (((deixe em branco))) Textodo Vamos dar uma pausa e observar como está ficando nosso aplicativo. A figura 8.1 ilustra esse grande momento.
3 Enviando s 113 Figura 8.1 Fase inicial do Mailing.Net Dando continuidade ao nosso projeto, vamos inserir os objetos que seguem dentro do painel PnConfigura. Para facilitar, colocamos em destaque a seção em que se encontra o referido objeto. Exemplo: [Standard]. TLabel [Standard] Texto Left 17 Top 19 TLabel [Standard] Assunto Left 17 Top 51 TEdit [Standard] Left 96 edtexto Text (((deixe em branco))) Top 16 Width 320
4 114 Delphi 7 Internet e Banco de Dados TEdit [Standard] Left 96 edassunto Text (((deixe em branco))) Top 46 Width 320 TSpeedButton [Additional] >> Flat True Left 420 btarquivo Top 16 Width 23 TButton [Standard] Envia Left 468 btenvia Top 85 Width 75 Ainda com o foco no objeto PnConfigura, insira um objeto do tipo TGroupBox e altere as propriedades que seguem: TGroupBox [Standard] Configuração Servidor SMTP Height 90 Left 16 gbconfigura Top 80 Width 425 Agora vamos suar a camisa e inserir alguns objetos dentro do container GbConfigura. Vamos ao batalhão de objetos do container GbConfigura.
5 Enviando s 115 TLabel [Standard] Host Left 16 Top 20 TLabel [Standard] Usuário Left 16 Top 44 TLabel [Standard] Conta Left 16 Top 69 TLabel [Standard] Porta Left 327 Top 20 TLabel [Standard] Senha Left 176 Top 44 TEdit [Standard] Color claqua Left 63
6 116 Delphi 7 Internet e Banco de Dados Text Top 16 Width 250 edhost coloque o endereço do seu servidor SMTP. Exemplo: smtp.provedor.com.br TEdit [Standard] Color claqua Left 63 edusuario Text Top 40 Width 106 TMaskEdit [Additional] coloque o usuário de sua conta SMTP. Exemplo: seunome Color claqua Left 216 PassWordChar * edsenha Text coloque a senha do usuário da conta de SMTP. Exemplo: suasenha Top 40 Width 97 TEdit [Standard] Color claqua Left 63 edconta Text Top 16 Width 250 coloque o endereço da conta de SMTP. Exemplo:
7 Enviando s 117 TMaskEdit [Additional] Color claqua EditMask 9999;1; Left 368 edporta Text 25 Top 16 Width 48 Puxa, ainda bem que esta parte acabou. Acredito que todos se cansaram, mas temos um belo formulário para envio de s. A figura 8.2 ilustra o nosso formulário neste momento. Detalhes do Projeto Figura 8.2 Fase final do design do formulário Antes de prosseguirmos com o projeto, vamos conhecê-lo melhor. O Mailing.Net utiliza como base o mesmo banco de dados no padrão Interbase empregado no capítulo 7. Na realidade utilizamos apenas dois campos da tabela de clientes: razao_social e . O campo razao_social será utilizado para substituir uma tag em nosso aplicativo e o campo para compor o destinatário. O mais interessante neste aplicativo é o uso do objeto TDataSetPageProducer, normalmente utilizado no desenvolvimento de aplicações Web, como vimos nos capítulos anteriores. Além disso, iremos utilizar um arquivo externo no padrão HTML para relacionar com o objeto TMemo. Insira um objeto do tipo TSQLConnection, e crie uma nova conexão clicando no botão +. Altere as seguintes propriedades.
8 118 Delphi 7 Internet e Banco de Dados TSQLConnection BancoDados Driver Interbase CommitRetaining True DataBase localhost:c:/cursoweb /clientes.gdb SQLDialect 3 LoginPrompt False BancoDados Insira um objeto do tipo TSQLDataSet e altere as propriedades que seguem: TSQLDataSet tbclientes tbclientes SQLConnection BancoDados CommandText select * from tbclientes Codificando o botão btarquivo O objeto btarquivo será responsável por carregar um arquivo externo (HTML) no objeto Textodo . Para nos auxiliar nesta tarefa, necessitamos de outro objeto: TOpenDialog. Insira um objeto do tipo TOpenDialog e altere as propriedades que seguem: TOpenDialog AbrirArquivo AbrirArquivo Agora vamos inserir o código do botão btarquivo no evento OnClick do mesmo. procedure Tfm .btArquivoClick(Sender: TObject); if AbrirArquivo.Execute then EdTexto:=AbrirArquivo.File; // Zera O Textodo Textodo .Clear; // Associa o Arquivo Texto/HTML com o // objeto Textodo Textodo .Lines.LoadFromFile(edTexto.Text);
9 Enviando s 119 Vamos estudar o código em detalhe: if AbrirArquivo.Execute then Esta linha verifica se o método Execute do objeto AbrirArquivo foi executado com êxito, ou seja, indaga se o usuário selecionou algum arquivo. EdTexto.Text:=AbrirArquivo.File; Associa o nome do arquivo selecionado no objeto AbrirArquivo ao objeto EdTexto. O método Clear limpa o conteúdo do objeto Textodo . Textodo .Clear; Textodo .Lines.LoadFromFile(edTexto.Text); Aqui estamos carregando (LoadFromFile) o arquivo (edtexto.text) dentro do objeto Textodo . Em resumo, poderemos digitar o texto ou então carregar um arquivo previamente criado. Falando mais um pouco dos objetos INDY Um dos grandes problemas da biblioteca NetMasters (utilizada até a versão 5 do Delphi) era o congelamento (Freeze) da aplicação em diversos momentos: na conexão, desconexão, entre outros, invariavelmente. A biblioteca da Nevrona (INDY) traz um componente que trata especificamente deste problema: IdAntiFreeze. Sua principal função é priorizar as tarefas da aplicação, evitando o efeito Freeze. Na realidade ele cria um processo, otimizando as tarefas relacionadas a objetos INDY. Vamos inserir um objeto do tipo TIdAntiFreeze, localizado na seção Indy Misc. Não é necessário alterar as propriedades deste objeto. Agora iremos inserir o objeto considerado coração da nossa aplicação: TIdSMTP, localizado na seção Indy Clients. Insira um objeto do tipo TIdSMTP em nosso projeto. Iremos codificar as propriedades deste objeto em tempo de execução. O objeto TidSMTP realiza a conexão da nossa aplicação Cliente com o servidor SMTP, responsável pela entrega dos s. Na realidade, nosso aplicativo apenas envia os s para um servidor SMTP e o mesmo se encarrega de distribuí-los. Poderíamos criar um servidor SMTP próprio que enviaria diretamente os s, mas devido à complexidade do caso, ficaremos com o exemplo mais simples. Vamos continuar com o nosso projeto. Insira um objeto do tipo TIdMessage, localizado na seção Indy Misc, e altere as propriedades que seguem: TIdMessage Mensagem ContentType text/html Mensagem Repare que a propriedade ContentType refere-se ao tipo MIME da mensagem, ou seja, o tipo de seu conteúdo. Configuramos para text/html para que as mensagens sejam enviadas com o padrão HTML ou texto (o padrão HTML predomina por conter recursos de formatação). Agora, amigos, iremos trabalhar com o nosso curinga : TDataSetPageProducer. Como visto nos capítulos anteriores, o objeto TDataSetPageProducer é responsável pela substituição automática de Tags transparentes relacionadas aos campos do DataSet vinculado.
10 120 Delphi 7 Internet e Banco de Dados Insira um componente do tipo TDataSetPageProducer e altere as propriedades que seguem: TDataSetPageProducer ppmensagem DataSet tbclientes ppmensagem Vejamos alguns exemplos da funcionalidade do nosso curinga. Prezado(a) <#RAZAO_SOCIAL>, Estamos enviando este boletim para o seu <br> <# >.... Em tempo de execução teremos: Prezado(a) Emerson Facunte, Estamos enviando este boletim para o seu O interessante é que podemos inserir quantas Tags forem necessárias, em qualquer posição. Vejamos outro exemplo: Prezado(a) <#RAZAO_SOCIAL>, Como cliente preferencial, você tem 10% de desconto em qualquer produto de nossa loja. Entretanto, Sr(a) <#RAZAO_SOCIAL>, esta oferta é por tempo limitado. Amigos, como observamos nos capítulos anteriores, poderemos produzir documentos HTML com ferramentas de terceiros, como DreamWeaver da Macromedia. Com isso teremos um mais elegante. Bem, finalmente vamos codificar o nosso glorioso botão btenvia. Insira o código que segue no evento OnClick do objeto btenvia. procedure Tfm .btEnviaClick(Sender: TObject); // Configura Cliente idsmtp1.userid:=edusuario.text; idsmtp1.password:=edsenha.text; idsmtp1.host:=edhost.text; idsmtp1.port:=strtoint(edporta.text); // Atribui o Conteudo do objeto Textodo // ao objeto PPMensagem ppmensagem.htmldoc:=textodo .lines;
11 Enviando s 121 // Abre a tabela Clientes tbclientes.open; tbclientes.first; // Conecta ao Servidor SMTP idsmtp1.connect; try with Mensagem do // Atribui o conteúdo do edassunto // ao objeto Mensagem.Subject Subject:=edAssunto.Text; // Atribui o conteúdo do edconta // ao objeto Mensagem.From.Text From.Text:=edConta.Text; // inicia o laço while not(tbclientes.eof) do // Atribui o conteúdo do campo // ao objeto Mensagem.Recipients. Addresses Recipients. Addresses:=tbClientes.FieldBy(' ').Value; ReceiptRecipient.Address:=tbClientes.FieldBy(' ').Value; // Atribui o conteúdo do objeto ppmensagem // ao objeto Mensagem.Body.Text Body.Text:=ppMensagem.Content; // Envia a mensagem idsmtp1.send(mensagem); // Próximo registro tbclientes.next; // laço // with Mensagem finally // Disconecta Servidor idsmtp1.disconnect; Vamos analisar com cuidado este código. No primeiro bloco, estamos configurando o Cliente SMTP através do nosso objeto idsmtp1. // Configura Cliente idsmtp1.userid:=edusuario.text; idsmtp1.password:=edsenha.text; idsmtp1.host:=edhost.text; idsmtp1.port:=strtoint(edporta.text); Repare que estamos configurando o usuário da conta UserId, a senha Password, o HOST e a porta de conexão (Port). O bloco seguinte atribui o conteúdo do objeto TextodaMensagem ao objeto PPMensagem.
12 122 Delphi 7 Internet e Banco de Dados // Atribui o Conteudo do objeto Textodo // ao objeto PPMensagem ppmensagem.htmldoc:=textodo .lines; A propriedade HTMLDoc armazena um documento para ser processado pelo próprio objeto. O bloco que segue abre a tabela de Clientes e posiciona o ponteiro no primeiro registro: // Abre a tabela Clientes tbclientes.open; tbclientes.first; O bloco a seguir conecta o objeto idsmtp1 ao servidor de SMTP. // Conecta ao Servidor SMTP idsmtp1.connect; Agora estamos protegendo o código seguinte com o comando Try/Except/Finally. Em seguida estamos atribuindo o assunto da mensagem e o responsável pelo envio da mesma. with Mensagem do // Atribui o conteudo do edassunto // ao objeto Mensagem.Subject Subject:=edAssunto.Text; // Atribui o conteudo do edconta // ao objeto Mensagem.From.Text From.Text:=edConta.Text; Como as mensagens são enviadas uma a uma, fizemos um laço percorrendo toda a tabela de Clientes. while not(tbclientes.eof) do Neste ponto estamos configurando o destino. // Atribui o conteudo do campo // ao objeto Mensagem.Recipients. Addresses Recipients. Addresses:=tbClientes.FieldBy(' ').Value; ReceiptRecipient.Address:=tbClientes.FieldBy(' ').Value; Chegamos ao ponto mais interessante do nosso projeto. Neste bloco estamos associando o resultado do ppmensagem ao corpo da mensagem do objeto Mensagem. Quando chamamos o método Content, ativamos o processamento das informações contidas na propriedade HTMLDOC do objeto. // Atribui o conteúdo do objeto ppmensagem // ao objeto Mensagem.Body.Text Body.Text:=ppMensagem.Content; E finalmente enviamos a mensagem. // Envia a mensagem idsmtp1.send(mensagem); Bem, amigos, acredito que agora basta usar a imaginação para enviar os s de maneira personalizada. Com isso concluímos nosso projeto de envio de s, e de quebra refrescamos nossas idéias com um novo tipo de aplicação.
13 Enviando s 123 Figura 8.3 MailingNet em ação Listagem 8.1 Código completo do Mailing Net unit f_principal; interface uses SysUtils, Types, Classes, QGraphics, QControls, QForms, QDialogs, QStdCtrls, QExtCtrls, QButtons, QMask, DBXpress, FMTBcd, DB, SqlExpr, IdBaseComponent, IdAntiFreezeBase, IdAntiFreeze, IdMessage, HTTPApp, HTTPProd, DSProd, IdComponent, IdTCPConnection, IdTCPClient, IdMessageClient, IdSMTP; type Tfm = class(tform) PnConfigura: TPanel; Splitter1: TSplitter; pntexto: TPanel; Textodo TMemo; Label1: TLabel; Label2: TLabel; edtexto: TEdit; edassunto: TEdit; btarquivo: TSpeedButton; btenvia: TButton; gbconfigura: TGroupBox; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; edhost: TEdit; edusuario: TEdit; edconta: TEdit; Label7: TLabel; edsenha: TMaskEdit; edporta: TMaskEdit; BancoDados: TSQLConnection; tbclientes: TSQLDataSet; AbrirArquivo: TOpenDialog;
14 124 Delphi 7 Internet e Banco de Dados IdAntiFreeze1: TIdAntiFreeze; Mensagem: TIdMessage; ppmensagem: TDataSetPageProducer; IdSMTP1: TIdSMTP; procedure btarquivoclick(sender: TObject); procedure btenviaclick(sender: TObject); private { Private declarations } public { Public declarations } var fm Tfm ; implementation {$R *.xfm} procedure Tfm .btArquivoClick(Sender: TObject); if AbrirArquivo.Execute then EdTexto.Text:=AbrirArquivo.File; // Zera O Textodo Textodo .Clear; // Associa o Arquivo Texto/HTML com o objeto // Textodo Textodo .Lines.LoadFromFile(edTexto.Text); procedure Tfm .btEnviaClick(Sender: TObject); // Configura Cliente idsmtp1.userid:=edusuario.text; idsmtp1.password:=edsenha.text; idsmtp1.host:=edhost.text; idsmtp1.port:=strtoint(edporta.text); // Atribui o Conteudo do objeto Textodo // ao objeto PPMensagem ppmensagem.htmldoc:=textodo .lines; // Abre a tabela Clientes tbclientes.open; tbclientes.first; // Conecta ao Servidor SMTP idsmtp1.connect; try with Mensagem do
15 Enviando s 125 // Atribui o conteudo do edassunto // ao objeto Mensagem.Subject Subject:=edAssunto.Text; // Atribui o conteudo do edconta // ao objeto Mensagem.From.Text From.Text:=edConta.Text; // inicia o laço while not(tbclientes.eof) do // Atribui o conteudo do campo // ao objeto Mensagem.Recipients. Addresses Recipients. Addresses:=tbClientes.FieldBy(' ').Value; ReceiptRecipient.Address:=tbClientes.FieldBy(' ').Value; // Atribui o conteúdo do objeto ppmensagem // ao objeto Mensagem.Body.Text Body.Text:=ppMensagem.Content; // Envia a mensagem idsmtp1.send(mensagem); // Próximo registro tbclientes.next; // laço // with Mensagem finally // Disconecta Servidor idsmtp1.disconnect; end.
16 126 Delphi 7 Internet e Banco de Dados Anotações de Dúvidas? Preciso Revisar Anotações Gerais
236 Delphi 7 Internet e Banco de Dados Capítulo 12 Intraweb A grande revolução, e por que não dizer, a agradável surpresa presente na nova versão do Delphi: Intraweb. Desenvolvido pela empresa Atozed Software,