O artigo desta semana surgiu de uma dúvida de um aluno do curso de E-Commerce on-line da ClubeDelphi. Junior JR gostaria de saber como criar um CGI em WebBroker para enviar E-Mail usando os componentes Indy. Este tipo de aplicação é comum, por exemplo, na construção de WebMails.
Como o WebBroker e Indy também estão presentes no Kylix, veremos com compilar nossa aplicação de envio de E-Mails para rodar no Apache / Linux. Vamos lá!
Nota: neste exemplo usaremos o IIS como servidor Web, dessa forma é necessário que você tenha o mesmo instalado e em sua máquina, ou ainda o PWS. Para o exemplo rodar no Linux, é necessário que você tenha o Kylix e Apache.
Criando a aplicação WebBroker
Clique em File|New>Other>New e selecione a opção Web Server Applicationpara criar uma aplicação WebBroker.
Escolha o tipo CGI para este exemplo. Você poderá mais tarde facilmente converter a aplicação para outro tipo de servidor. Marcando a opção Cross-platform, o código gerado para o exemplo usará CLX e poderá ser recompilado no Kylix.
Configurando os componentes Indy
Coloque no WebModule da aplicação os componentes IdSMTP (Indy Clients) e IdMessage (Indy Misc).
Selecione o componente IdSMTP1 e digite na sua propriedade Host o endereço do servidor SMTP que você utiliza (ex. smtp.clubedelphi.com.br). Se o seu servidor requer autenticação para envio, preencha também as propriedades Username e Password.
Declare o seguinte método na seção private do WebModule:
private
procedure EnviaEMail(De,Para,Assunto, Texto: string);
Aperte Shift+Ctrl+C e implemente o método da seguinte forma:
procedure TWebModule1.EnviaEMail(De, Para, Assunto, Texto: string);
begin
IDSmtp1.Connect;
try
IdMessage1.From.Address := De;
IdMessage1.Recipients.EMailAddresses := Para;
IdMessage1.Subject := Assunto;
IdMessage1.Body.Text := Texto;
IdSMTP1.Send(IdMessage1);
finally
IdSMTP1.Disconnect;
end;
end;
O código anterior configura os componentes do Indy de acordo com os parâmetros passados e envia o E-Mail.
Criando a Action de Envio
Dê um duplo clique no WebModule e no editor Actions aperte Insert. Defina a propriedade Default da nova Action como True.
No seu evento OnAction digite o seguinte:
procedure TWebModule1.WebModule1WebActionItem1Action(Sender:TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
with Request do
EnviaEMail(
ContentFields.Values['DE'],
ContentFields.Values['PARA'],
ContentFields.Values['ASSUNTO'],
ContentFields.Values['TEXTO']);
Response.Content := 'E-Mail enviado com sucesso';
end;
Isso captura os valores dos campos passados para o Request e passa como parâmetro para o método EnviaEmail criado anteriormente.
Compilando e distribuindo a aplicação
Clique em Project|Options>Directories/Conditionals e na opção Output directory (Figura 5) digite “c:\inetpub\scripts” (diretório padrão de scripts do IIS). Clique em Ok e compile a aplicação.
Com isso, o arquivo executável já será automaticamente compilado dentro do diretório virtual do IIS.
Criando a página de envio
O último passo é criar o formulário HTML para entrada dos dados do E-Mail. Aqui está o conteúdo do arquivo EnviaEmail.html (salve-o dentro do diretório raiz do IIS, por padrão c:\inetpub\wwwroot):
<html>
Enviando E-Mails com WebBroker e Indy <BR>
<form method="POST" action="/scripts/project1.exe">
<table width="47%" border="1">
<tr>
<td width="20%">De</td>
<td width="80%"><input name="DE" type="Text" size="60"></td>
</tr>
<tr>
<td>Para</td>
<td><input Name="PARA" type="Text" size="60"></td>
</tr>
<tr>
<td>Assunto</td>
<td><input Name="ASSUNTO" type="Text" size="60"></td>
</tr>
<tr>
<td>Texto</td>
<td><textarea name="TEXTO" cols="55" rows="5"></textarea></td>
</tr>
</table>
<br><input name="submit" type="submit" value="Enviar">
</form>
</html>
Observe que o formulário irá postar os dados na aplicação WebBroker criada anteriormente (parâmetro Action).
Testando a aplicação
Abra um browser, acesse o endereço localhost/EnviaEmail.html e preencha o formulário e clique no botão Enviar.
Recompilando no Kylix 3
Para que nossa aplicação rode no Linux, precisamos recompilar nosso CGI no Kylix. Isso é bastante simples, e não será necessário alterar nenhuma linha no código fonte do projeto! O primeiro passo é reabrir o mesmo projeto no Kylix.
Clique em Project|Options>Directories/Conditionals e na opção Output directory (Figura 9) digite “/var/www/cgi-bin” (diretório padrão de scripts do Apache). Clique em Ok e compile a aplicação. Com isso, o arquivo binário será automaticamente compilado dentro do diretório virtual do Apache.
Salve nosso arquivo HTML dentro diretório /var/www/html e altere a linha do form para:
<form method="POST" action="/cgi-bin/Project1">
Abra um browser, acesse o endereço localhost/EnviaEmail.html, preencha o formulário e clique em Enviar.
Agora, faremos o mesmo procedimento de envio de emails usando o IntraWeb.
Criando a aplicação IntraWeb
Clique em File|New>Other>New>IntraWeb e selecione a opção IntraWeb Application Wizard. Selecione a opção StandAlone.
Configurando os componentes Indy
Coloque também quatro IWLabels, três IWEdits (chame-os de “edDe”, “edPara” e “edAssunto”), um IWMemo (“mmTexto”) e um IWButton (“btEnviar”). Todos esses componentes podem ser encontrados na paleta IW Standard.
Coloque também um IdSMTP (Indy Clients) e IdMessage (Indy Misc).
Selecione o componente IdSMTP1 e digite na sua propriedade Host o endereço do servidor SMTP que você utiliza (ex. smtp.clubedelphi.com.br). Se o seu servidor requer autenticação para envio, preencha também as propriedades Username e Password.
Declare o seguinte método na seção private do formulário:
private
procedure EnviaEMail(De,Para,Assunto,Texto: string);
Aperte Shift+Ctrl+C e implemente o método da seguinte forma:
procedure TIWForm1.EnviaEMail(De, Para, Assunto, Texto: string);
begin
IDSmtp1.Connect;
try
IdMessage1.From.Address := De;
IdMessage1.Recipients.EMailAddresses := Para;
IdMessage1.Subject := Assunto;
IdMessage1.Body.Text := Texto;
IdSMTP1.Send(IdMessage1);
finally
IdSMTP1.Disconnect;
end;
end;
O código anterior configura os componentes do Indy de acordo com os parâmetros passados e envia o E-Mail.
No evento OnClick do IWButton digite:
procedure TIWForm1.btEnviarClick(Sender: TObject); begin EnviaEMail(edDe.Text,edPara.Text,edAssunto.Text,mmTexto.Text); WebApplication.ShowMessage('E-Mail enviado com sucesso!'); end;
Testando a aplicação
Clique no menu Run|Parameters e na opção Parameters digite “/launchbrowser”, para que a aplicação ao ser executada já abra um browser automaticamente. Clique em OK e aparte F9 para rodar a aplicação.
Preencha os dados do e-mail e clique no botão Enviar.
Nesta última sessão veremos como enviar e-mails através de uma aplicação ASP.NET / Web Forms criada no Delphi 8 for .NET. Para enviar os e-mails, usaremos as classes nativas do .NET Framework, declaradas no namespace System.Web.Mail, ao invés de utilizarmos os componentes da Indy.
Criando a aplicação
No Delphi 8, clique em File|New>ASP.NET Web Application. Na caixa de diálogo que aparece, digite um nome para a aplicação, nesse caso “EnviaEmail”.
No Web Form principal da aplicação, coloque quatro componentes TexbBox, quatro Labels e um Button, todos da categoria Web Controls. Configure a propriedade ID dos TextBoxes para “edDe”, “edPara”, “edAssunto” e “edTexto”, respectivamente. Defina o Text do Button como “Enviar”. Defina ainda a propriedade TextMode do EdTexto para MultiLine.
No editor de código, na classe que define o Web Form, declare o seguinte na seção private:
private
procedure EnviaEMail(De, Para, Assunto, Texto: string);
Aperte Shift+Ctrl+C e implemente o método conforme mostrado a seguir:
procedure TWebForm1.EnviaEMail(De, Para, Assunto, Texto: string);
var
ms: MailMessage;
begin
{ Adicione System.Web.Mail no uses }
ms := MailMessage.Create;
ms.From := De;
ms.&To := Para;
ms.Subject := Assunto;
ms.Body := Texto;
SmtpMail.SmtpServer := 'smtp.brturbo.com';
SmtpMail.Send(ms);
end;
Lembre-se de declarar System.Web.Mail no uses. No Web Form, dê um duplo clique no botão e digite o seguinte:
procedure TWebForm1.Button1_Click(sender: System.Object; e: System.EventArgs);
begin
EnviaEMail(edDe.Text,edPara.Text,edAssunto.Text,edTexto.Text);
end;
Isso é tudo! Execute a aplicação e você deverá visualizar o formulário ASPX no browser. Preencha as informações do e-mail e clique em Enviar.
Para aqueles que ficaram interessados no desenvolvimento com ASP.NET, sugiro conferir o curso iniciado na edição 51 da Revista ClubeDelphi. É uma série de excelentes matérias escritas por Sanyo Moura mostrando como criar aplicações ASP.NET / Web Forms com o Delphi 8 for .NET.