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.