Módulo 5

Trabalhando com E-mails

Neste módulo estaremos aprendendo a utilizar duas das mais importantes tags incorporadas no Cold Fusion, a <CFMAIL> e a <CFPOP>. Estas tags realizam toda a interface com os servidores de e-mail, possibilitando o envio e recebimento de e-mails através de aplicações ColdFusion.
Como muitos já devem saber, os servidores de e-mail trabalham com dois protocolos padrões para transacionar um e-mail. São eles o SMTP (Simple Mail Transfer Protocol) e o POP (Post Office Protocol), o primeiro responsável pelo envio de mensagens, e o segundo pelo recebimento de mensagens.
Para começarmos a trabalhar com e-mails iremos ver como fazer para enviá-los.

Enviando E-mails com CFMAIL

Em muitas aplicações criadas poderemos estar querendo informar ao usuário, através do e-mail, qualquer resultado, alteração ou informação ocorridas, para isso utilizaremos esta tag. Sendo bastante flexível a tag CFMAIL permite gerar e-mails dinâmicos. Seu uso é semelhante ao da tag CFOUTPUT, sua diferença é que ao invés de gerar texto, é gerado uma mensagem de e-mail no padrão SMTP.
Antes de iniciarmos a construção de uma aplicação utilizando esta tag, é necessário que se configure o acesso a um servidor de e-mail no Administrador do ColdFusion (ColdFusion Application Server).

Para isso faça:

  1. Abra o Cold Fusion Administrator
  2. Na seção Miscellaneous clique na opção Mail
  3. No campo Mail Server coloque o seu servidor de e-mail
  4. Deixe os campos Port e Connection Timeout com os valores padrões
  5. Clique no botão Apply para salvar a configuração

Agora que já configuramos o servidor de e-mail, veremos alguns atributos da tag CFMAIL que nos ajudarão a desenvolver nossas aplicações.

AtributoDescrição
TO Obrigatório. Nele você irá colocar o e-mail do destinatário
FROM Obrigatório. Aqui você irá colocar o e-mail do remetente
CC Opcional. Como nos programas de e-mail, este parâmetro permite enviar e-mails para mais de um destinatário
BCC Opcional. Permite o envio para mais de um e-mail sem que os demais destinatários saibam da existência dos demais e-mails.
SUBJECT Obrigatório. O assunto do e-mail.
TYPE Opcional. Caso você deseje mandar um e-mail no formato HTML, deve especificar este parâmetro (TYPE=”HTML”)
MIMEATTACH Opcional. Especifica o caminho para o arquivo a ser anexado junto a mensagem.
QUERY Opcional. Indica qual o nome da query a qual você deseja obter dados.
MAXROWS Opcional. Especifica o máximo de e-mails que você quer mandar
STARTROW Opcional. Especifica em qual linha da query deve iniciar os envios de e-mails

Enviando e-mail baseado em um formulário

Como a tag CFMAIL é bem flexível, ela permite que enviemos um e-mail através dos dados enviados por um formulário. Aquie veremos como enviar um e-mail utilizando esta propriedade.
Primeiro vamos criar o formulário:
form_email.cfm
<HTML>
     <HEAD>
          <TITLE>Envio de E-mail através de formulário</TITLE>
     </HEAD>
     <BODY>
          <FORM METHOD=”POST” ACTION=”envia_email.cfm”>
               Nome: <INPUT TYPE=”TEXT” NAME=”nome”><BR>
               E-mail: <INPUT TYPE=”TEXT” NAME=”email”><BR>
               Empresa: <INPUT TYPE=”TEXT” NAME=”empresa”><BR>
               Mensagem:<BR>
               <TEXTAREA NAME=“mensagem” COLS=”50” ROWS=”5”></TEXTAREA><BR>
               <INPUT TYPE=SUBMIT VALUE=”Enviar”>
          </FORM>
     </BODY>
</HTML>

Agora veremos como montar o envio do e-mail:
enviar_email.cfm
<CFMAIL FROM=”suporte@coldfusionbrasil.com.br” TO=”#Form.email#”
     SUBJECT=”Tutorial Módulo 5”>
     Nome: #Form.nome#
     Empresa: #Form.empresa#
     Mensagem:
     #Form.mensagem#
</CFMAIL>
<HTML>
     <HEAD>
          <TITLE>Envio de E-mail através de formulário</TITLE>
     </HEAD>
     <BODY>
          <FONT SIZE=3>E-mail enviado com sucesso!</FONT>
     </BODY>
</HTML>

Utilizando query para enviar e-mails

Podemos utilizar uma query no envio de e-mails se por exemplo desejamos enviar um relatório de vendas para a diretoria da empresa. Vamos criar agora a query e o envio deste e-mail:
relatorio_email.cfm
<CFQUERY DATASOURCE=”Vendas” NAME=”Relatorio”>
     SELECT cod_prod, nome_prod, preco_prod, qtde_venda from VENDAS
</CFQUERY>
<CFMAIL QUERY=”Relatorio” FROM=”webmaster@empresa.com.br”
     TO=”diretoria@empresa.com.br” SUBJECT=”Relatório de Vendas”>
     Caros Srs.,
     Segue o relatório de vendas:
     <CFOUTPUT>
     #cod_prod# - #nome_prod# - #preco_prod# - #qtde_venda#
     </CFOUTPUT>
    Atenciosamente,
    WebMaster
</CFMAIL>

Enviando e-mail para múltiplos destinatários

Podemos enviar através de uma query um e-mail para múltiplos destinatários. No exemplo a seguir, mostraremos como mandar um aviso para todos os setores de uma mesma empresa.

aviso_email.cfm
<CFQUERY DATASOURCE=”Empresa” NAME=”Aviso”>
     SELECT email from SETORES
</CFQUERY>
<CFMAIL QUERY=”Aviso” FROM=”gerencia@empresa.com.br”
     TO=”#email#” SUBJECT=”Aviso n. 1”>
     AVISO
     Todos os setores devem mandar seus relatórios até no máximo 25/07
     A Gerência
</CFMAIL>

Enviando arquivos anexados ao e-mail

O Cold Fusion também permite o envio de arquivos anexados por e-mail. Veremos abaixo como devemos proceder para fazer isto.
arquivo_email.cfm
<CFMAIL FROM=”info@empresa.com.br” TO=”desenvolvimento@empresa.com.br”
     SUBJECT=”Arquivo Requisitado” MIMEATTACH=”C:\MANUAL.DOC”>
     Segue anexado o Manual requisitado.
</CFMAIL>

Recebendo E-mails com CFPOP

Já sabemos como devemos proceder para inserir envio de e-mails em nossas aplicações, agora iremos ver como funciona a situação inversa, ou seja, como receber e-mails. A tag CFPOP além de permitir o recebimento de mensagens, permite também que as mensagens sejam apagadas do servidor.
Para conhecermos melhor está tag, abaixo veremos alguns de seus atributos:

AtributoDescrição
SERVER Obrigatório. O nome Host ou endereço IP do servidor POP
USERNAME Opcional. Identifica o nome da conta de usuário, se não especificado é criada uma conexão anônima (anonymous)
PASSWORD Opcional. A senha da conta de usuário
ACTION Opcional. Especifica a ação no servidor. Existem três possibilidades:
- GetHeaderOnly – (Padrão) Retorna apenas o cabeçalho da mensagem
- GetAll – Retorna todas as informações da mensagem
- Delete – Apaga a mensagem do servidor POP
NAME Obrigatório para as ações “GetHeaderOnly” e “GetAll”, especifica o nome query
MESSAGENUMBER Obrigatório para a ação “Delete”
ATTACHMENTPATH Opcional. Permite anexos serem escritos para um diretório especifico na ação “GetAll”.
MAXROWS Opcional. Especifica o máximo de e-mails que você quer visualizar
STARTROW Opcional. Especifica em qual linha deve iniciar os e-mails. Essa opção é ignorada se o atributo MESSAGENUMBER for especificado.

Variáveis Query CFPOP

A tag CFPOP também tem algumas variáveis específicas, que irão nos fornecer o total de mensagens no servidor, data, e-mail do remetente e destinatário, assunto, mensagem e outros. Essas variáveis são especificadas através de seu nome query (atributo NAME). Veremos agora algumas delas:

VariávelDescrição
nome_query.RecordCount Mostra o total de e-mails
nome_query.CurrentRow Mostra o número do e-mail que está sendo processado no momento
As variáveis a seguir são usadas somente para as ações “GetHeaderOnly” e “GetAll”
nome_query.date Mostra a data do e-mail
nome_query.from Mostra o e-mail do remetente
nome_query.messagenumber Mostra o número do e-mail
nome_query.subject Mostra o assunto
nome_query.to Mostra o e-mail do destinatário
As variáveis abaixo são usadas somente com a ação “GetAll”
nome_query.body Mostra a mensagem
nome_query.header Mostra o cabeçalho da mensagem
nome_query.attachments Mostra o nome dos arquivos anexados
nome_query.attachmentfiles Mostra o nome do arquivo mais o caminho especificado no atributo
ATTACHMENTPATH

Recebendo cabeçalho de mensagens

Em algumas aplicações pode ser interessante apenas saber algumas poucas informações sobre os e-mails existentes no servidor, e é isto que veremos aqui.
Utilizaremos a ação GetHeaderOnly para obtermos apenas o cabeçalhos das mensagens.

cabecalho_email.cfm
<CFPOP SERVER=”127.0.0.1” USERNAME=”teste“ PASSWORD=”77%%88”
     ACTION=GetHeaderOnly NAME=”Teste”>
<CFOUTPUT QUERY=”teste”>
     De: #teste.to#<BR>
     Para: #teste.from#<BR>
     Assunto: #teste.subject#<BR>
     Data: #teste.date#<BR>
</CFOUTPUT>

Recebendo mensagens completas

Agora iremos ver como procederemos para receber e-mail por completo, incluindo o corpo e arquivos anexados.
completo_email.cfm
<CFPOP SERVER=”127.0.0.1” USERNAME=”teste“ PASSWORD=”77%%88”
     ACTION=GetAll ATTACHMENTPATH=”c:\anexos” NAME=”Teste”>
<CFOUTPUT QUERY=”teste”>
     N. Mensagem: #teste.messagenumber#<BR>
     De: #teste.to#<BR>
     Para: #teste.from#<BR>
     Assunto: #teste.subject#<BR>
     Data: #teste.date#<BR>
     Anexo: #teste.attachments#<BR>
</CFOUTPUT>

Apagando mensagens

Apagar um mensagem do servidor pode ser muito útil, já que por padrão elas não são apagadas do servidor POP. Para isto utilizamos a ação “Delete” junto com o atributo MessageNumber.
apaga_email.cfm
<CFPOP SERVER=”127.0.0.1” USERNAME=”teste“ PASSWORD=”77%%88”
     ACTION=Delete MESSAGENUMBER=”1”>

Utilizando CFPOP de forma dinâmica

Como em muitas outras tags, a CFPOP permite que sejam colocados valores dinâmicos, que podem ser passados através de um formulário ou uma query. Um caso muito comum para se utilizar um formulário é no caso de se passar o Username e o Password através deles, já que por medidas de segurança não é recomendável que os mesmos fiquem aparentes na aplicação. Vamos ver agora um exemplo desses:
login_email.cfm
<HTML>
     <HEAD>
          <TITLE>Verificando e-mails</TITLE>
     </HEAD>
     <BODY>
          <FORM METHOD=”POST” ACTION=”verifica_email.cfm”>
               Username: <INPUT TYPE=”TEXT” NAME=”username”><BR>
               Password: <INPUT TYPE=”PASSWORD” NAME=”password”><BR>
               Empresa: <INPUT TYPE=”TEXT” NAME=”empresa”><BR>
              <INPUT TYPE=SUBMIT VALUE=”Verificar”>
         </FORM>
    </BODY>
</HTML>

verifica_email.cfm
<CFPOP SERVER=”127.0.0.1” USERNAME=”#form.username#“
     PASSWORD=”#form.password#” ACTION="GetAll" NAME=”Teste”>
<CFOUTPUT QUERY=”teste”>
     N. Mensagem: #teste.messagenumber#<BR>
     De: #teste.to#<BR>
     Para: #teste.from#<BR>
     Assunto: #teste.subject#<BR>
     Data: #teste.date#<BR>
</CFOUTPUT>

Criando Formulários com maior funcionalidade

O ColdFusion permite que sejam construídos formulários com controles customizados CFM que dispõe de uma melhor funcionalidade do que o formulário padrão do HTML. A tag utilizada para isto é a CFFORM, iremos ver agora como utilizar essa tag e alguns de seus controles.

Atributos CFFORM

AtributoDescrição
NAME Opcional. Nome do formulário que você irá criar
ACTION Obrigatório. O nome do CFM que irá processar os dados do formulário enviado
ONSUBMIT Opcional. Função Javascript que fará a validação dos campos do formulário
TARGET Opcional. O nome da janela ou frame onde será mostrada o retorno do formulário

Para que a CFFORM seja utilizada é necessário que se utilize alguns controles. Podem ser eles o CFINPUT ou CFSELECT.

CFINPUT

Esta tag cria os elementos botões radio, text ou checkbox podendo ser validadas, seu atributos são:

AtributoDescrição
TYPE Opcional. Seus valores podem ser:
- Text (Padrão)
- Radio
- Checkbox
- Password
NAME Obrigatório. O nome do campo
VALUE Opcional. O valor inicial do campo
REQUIRED Opcional. Identifica se o campo é obrigatório ou não. (Yes/No)
VALIDATE Opcional. Seus valores podem ser:
- date – Verifica a data no formato mm/dd/yyyy
- eurodate – Verifica a data no formato dd/mm/yyyy
- time – Verifica a hora em hh:mm:ss
- float – Verifica entrada de ponteiros
- integer – Verifica entrade de inteiros
ONVALIDATE Opcional. Nome de uma função Javascript usada para validar a entrada do usuário
MESSAGE Opcional. Uma mensagem texto que irá aparecer se a validação falhar.

Agora veremos um exemplo desta duas tags juntas:
cfform1.cfm
<CFFORM ACTION="recebe_form.cfm" METHOD="POST" NAME=”Formulario1”>
     <CFINPUT TYPE="Text" NAME="nome" REQUIRED="Yes">
     <CFINPUT TYPE="Text" NAME="data" MESSAGE="Entre com a data no formato correto (dd/mm/yy)"
          VALIDATE="date" REQUIRED="Yes">
     <INPUT TYPE="Submit" VALUE="Enviar">
</CFFORM>

CFSELECT

Esta tag constroi um list box que você pode incluir seus valores através de uma query, usando a tag html OPTION. Seus atributos são:

AtributoDescrição
NAME Obrigatório. Nome do campo que será criado
SIZE Opcional. Número de itens apresentados do list box
REQUIRED Opcional. Identifica se o campo é obrigatório ou não. (Yes/No)
MESSAGE Opcional. A mensagem irá aparecer ser REQUIRED=Yes e não for selecionado nenhum item
QUERY Opcional. Nome da query usada para incluir os valores

Veremos agora um exemplo do uso dessa tag:
cfform2.cfm
<CFQUERY DATASOURCE=”DB_Empregados” NAME=”Listagem”>
     SELECT * from Empregados
</CFQUERY>
<CFFORM ACTION="recebe_form.cfm" METHOD="POST" NAME=”Formulario1”>
     <CFSELECT NAME="NomesEmpregados" MESSAGE="Selecione um Nome” QUERY="Listagem"
          VALUE="Nome" REQUIRED="Yes">
          <OPTION value="">Selecione
     </CFSELECT>
</CFFORM>