Quarta-feira, 02 de janeiro de 2008 às 20h00

Zend Framework - Aprendendo a utilizar o Zend_Mail()

Faltam 0 dias! Inscreva-se agora! O maior encontro de profissionais web da américa latina.

Olá pessoal, como vão? Essa semana mostarei um exemplo de envio de e-mail utilizando o componente Zend_Mail() do Zend Framework. No artigo anterior, vimos uma visão geral do Zend Framework e sua instalação/configuração.

Recebi muitos e-mails nos últimos dias dizendo: "Poxa Júlio, era preciso escrever todas aquelas linhas para escrever um simples Hello, World?". À primeira vista parece complicado, mas "felizmente tudo aquilo" se faz necessário. Lembre-se que estamos trabalhando seguindo o padrão MVC (Modelo, Visão e Controlador) e precisamos fazer a divisão da programação do designer.

Ambiente utilizado:

  • Windows XP
  • PHP 5.2.3
  • Apache 2.0.61
  • Zend Framework 1.0.3

Nesse artigo aprenderemos:

  1. Enviar um email simples;
  2. Enviar um email HTML;
  3. Enviar um email com anexo.

Todos os exemplos acima, utilizando o SMTP do GMAIL para envio.

ATENÇÃO:

Para se conectar ao SMTP do GMAIL é necessário habilitar no PHP o suporte a SSL.

Windows: No php.ini descomente a linha:

extension=php_openssl.dll

No include_path do php.ini adicionei o caminho do Zend Framework.

Exemplo: include_path = ".;G:\pagina\zend\1.0.3\library"

Enviando um email simples (email_simples.php)

Como estaremos utilizando uma conta do GMAIL, teremos que se autenticar para utilizar o SMTP.


<?php
echo "<h1>Artigo iMasters - Zend_Mail()</h1>";
echo "<h4>Script desenvolvido por: Júlio César Martini</h4>"; 
require_once 'Zend/Mail.php';
require_once 'Zend/Mail/Transport/Smtp.php';

/**
CONFIGURAÇÃO PARA ENVIO DO EMAIL
*/

$smtp = "smtp.gmail.com";
$conta = "Aqui vc coloca o seu email do GMAIL.";
$senha = "Aqui vc coloca a sua senha do GMAIL.";
$de = "Aqui vc coloca o email de quem está enviando o email.";
$para = "Aqui vc coloca para quem vai o email. ";
$assunto = "Teste de envio de email - Artigo iMasters.";
$mensagem = "Isso é apenas um teste de envio utilizando o Zend_Mail().";

try {
$config = array (
'auth' => 'login',
'username' => conta,
'password' => senha,
'ssl' => 'ssl',
'port' => '465'
);

$mailTransport = new Zend_Mail_Transport_Smtp($smtp, $config);

$mail = new Zend_Mail();
$mail->setFrom($de);
$mail->addTo($para);
$mail->setBodyText($mensagem);
$mail->setSubject($assunto);
$mail->send($mailTransport);

echo "Email enviado com SUCESSSO!";
} catch (Exception $e){
echo ($e->getMessage());
}
?>

Resultado:

Se o email for enviado com SUCESSO, a seguinte tela será visualizada:

A tela abaixo, é uma possível mensagem de erro. "Usuário/Senha para conexão ao Gmail inválidas!". Para tratar as mensagens de erro, estou trabalhando com as excessões do PHP5 utilizando Try/Catch.

Enviando um email em HTML (email_html.php)

Para enviar um email HTML mudaremos apenas uma linha.

Utilizaremos mail->setBodyHtml em vez de mail->setBodyText.


<?
echo "<h1>Artigo iMasters - Zend_Mail()</h1>";
echo "<h4>Script desenvolvido por: Júlio César Martini</h4>";
require_once 'Zend/Mail.php';
require_once 'Zend/Mail/Transport/Smtp.php';

/**
CONFIGURAÇÃO PARA ENVIO DO EMAIL
*/
$smtp = "smtp.gmail.com";
$conta = "Aqui vc coloca a sua conta do GMAIL.";
$senha = "Aqui vc coloca o seu email do GMAIL.";
$de = "Aqui vc coloca o email de quem está enviando o email.";
$para = "Aqui vc coloca para quem vai o email. ";
$assunto = "Teste de envio de email em HTML - Artigo iMasters.";
$mensagem = "Isso é apenas um teste de envio utilizando o <b>Zend_Mail()</b>.<br><br>Até mais, <br>Júlio César Martini<br><i>Colunista PHP - iMasters</i>";

try {
$config = array (
'auth' => 'login',
'username' => conta,
'password' => senha,
'ssl' => 'ssl',
'port' => '465'
);

$mailTransport = new Zend_Mail_Transport_Smtp($smtp, $config);

$mail = new Zend_Mail();
$mail->setFrom($de);
$mail->addTo($para);
$mail->setBodyHtml($mensagem);
$mail->setSubject($assunto);
$mail->send($mailTransport);

echo "Email enviado com SUCESSSO!";
} catch (Exception $e){
echo ($e->getMessage());
}
?>

Resultado:

Compo pode-se observar na figura abaixo, o email enviado contêm texto negrito e itálico. Fácil, né?

Enviando um email com anexo (email_anexo.php)

No script abaixo, o usuário informará o email de destino e selecionará o arquivo a ser anexado ao email.


<?php
echo "<h1>Artigo iMasters - Zend_Mail()</h1>";
echo "<h4>Script desenvolvido por: Júlio César Martini</h4>";

/**
* Checa se o form foi enviado
*/
if($_POST) {

/**
* Inclue arquivos do Zend_Mail()
*/
require_once 'Zend/Mail.php';
require_once 'Zend/Mail/Transport/Smtp.php';

/**
* Recebe os campos do formulário
*/
$arqTmp = $_FILES["file"]["tmp_name"];
$arqName =$ _FILES["file"]["name"];
$arqType = $_FILES["file"]["type"];
$para = $_POST["para"];

/**
* Configuração do envio do email
*/
$smtp = "smtp.gmail.com";
$conta = "Aqui vc coloca a sua conta do GMAIL.";
$senha = "Aqui vc coloca a sua senha do GMAIL.";
$de = "Aqui vc coloca o email de quem está enviando o email.";
$assunto = "Teste de envio de email com Anexo - Artigo iMasters.";
$mensagem = "Isso é apenas um teste de envio utilizando o <b>Zend_Mail()</b>.<br><br>Até mais, <br>Júlio César Martini<br><i>Colunista PHP - iMasters</i>";

try {
$config = array (
'auth' => 'login',
'username' => conta,
'password' => senha,
'ssl' => 'ssl',
'port' => '465'
);

$mailTransport = new Zend_Mail_Transport_Smtp($smtp, $config);

$mail = new Zend_Mail();
$mail->setFrom($de);
$mail->addTo($para);
$mail->setBodyHtml($mensagem);
$mail->setSubject($assunto);
$mail->createAttachment(file_get_contents($arqTmp), $arqType, Zend_Mime::DISPOSITION_INLINE, Zend_Mime::ENCODING_BASE64, $arqName);
$mail->send($mailTransport);

echo "Email enviado com SUCESSSO!";
} catch (Exception $e){
echo ($e->getMessage());
} 
} else { ?>
<form method="post" enctype="multipart/form-data" name="form">
Arquivo: <input type="file" name="file" size="30" /> <br />
Enviar para: <input type="text" name="para" size="40" value="testeteste.com.br" /> <br />
<input name="Enviar" type="submit" id="Enviar" value="Enviar" />
</form>
<?php 
}
?>

Depurando:

Linha 20 a 23: Recebemos os campos do formulário.

Linha 28 a 33: Configuração da conta do GMAIL para o envio do email.

Linha 36: Monta um array com a configuração fornecida.

Linha 44: Tenta criar um "ponteiro" para envio de email via SMTP.

Linha 46: Instancia Zend_Mail();

Linha 47: Seta o email de quem está enviando.

Linha 48: Seta o email do usuário que estará recebendo.

Linha 49: Seta a mensagem em HTML a ser enviada.

Linha 50: Seta o assunto do email.

Linha 51: Atacha o arquivo enviado pelo usuário, veja que usamos a função file_get_contents() para ler o conteúdo enviado.

Linha 52: Finalmente o email é enviado.

Resultado:

Para maiores informações sobre o Zend_Mail() acesse:

http://framework.zend.com/manual/en/zend.mail.html

Confira abaixo, os artigos da série Zend Framework:

Zend Framework - Uma visão Geral

Para baixar os scripts desse artigo, clique AQUI.

Semana que vem tem mais. Espero que vocês tenham gostado!

Não deixe de nos enviar críticas ou sugestões para o próximo assunto, afinal a coluna é de vocês.

Boa semana a todos! Até mais!

10 comentários

 Bruno Rodrigues
03/01/2008 08h24

Muito bom

Gostei da matéria é uma ótima dica, e o melhor de tudo está muito bem explicado

 Júlio César Martini
04/01/2008 07h41

Respondendo

Bruno, que bom que vc gostou do artigo. Sempre procuro escrever os artigos de maneira clara e objetiva. Não deixe de enviar as suas sugestões para o próximo artigo. Abraços!

 Carlos Gustavo
04/01/2008 09h55

Você usa o framework para tudo?

Acha que ele aumenta a produtividade melhor que CodeIgniter, CakePHP ou Simphony?

 Carlos Gustavo
07/01/2008 11h42

Isso é pra fórum

Pelamordedeus, Wanderlei, isso aí é dúvida pra fórum.

 Williams Gomes Lucena
08/05/2008 10h48

Zend E-mail sem SSL

Olha muito legal esse tutorial, agora preciso saber como mandar os e-mails sem SSL.

Desde ja agradeço.

 Alaerte Gabriel
18/05/2008 21h42

Legal

Ótimia matéria, deste modo os e-mails chegam autenticados, evitando ir para caixa de spam, além do mais o Zend é sem comentários, muito bom.
Matéria vem explicada, ta muito bom.

 Rogério Knop
03/06/2008 15h22

Problema

Boa tarde Júlio.

Ocorreu o seguinte erro quando fui rodar o script:
Warning: stream_socket_client() [function.stream-socket-client]: unable to connect to tcp://smtp.gmail.com:Array (Uma tentativa de conex?o falhou porque o componente conectado n?o respondeu corretamente ap?s um per?odo de tempo ou a conex?o estabelecida falhou porque o host conectado n?o respondeu. ) in D:\Apache2\zend\library\Zend\Mail\Transport\Smtp.php on line 97

Fatal error: Maximum execution time of 30 seconds exceeded in D:\Apache2\zend\library\Zend\Mail\Transport\Smtp.php on line 97

O que pode estar acontecendo?

 Alaerte Gabriel
06/06/2008 09h40

Local...

Você ta tentando executar em sua máquina local, se o SMTP não estiver configurado, você não vai conseguir, o ideal é você colocar em um servidor e executar.

 Paolo Melo
04/08/2008 11h38

Autenticação - Zend

Muito bom seu Artigo Júlio.
Meu parebéns mesmo.
Gostaria de saber se você pode me dar uma ajuda.
Na empresa onde eu trabalho, quando os usários logan pela primeira vez no sistema, ele cria uma conta de e-mail no G-Mail (pela nossa interface mesmo). Eu gostaria de saber se tem como assim que ele logar em nosso sistema, aquele usuário e senha já serem autenticados no GMail também, assim, ele só precisaria logar na nossa ferramenta para já estar logado no GMail.
Desde já agradeço.

 Alex Barbosa Ferreira
20/11/2008 17h49

Envio de email

Júlio,
antes de mais nada quero parabenizá-lo pelo trabalho.
Após estudar e adaptar seu código ao site que estou produzindo, percebi que após a mensagem de e-mail enviado com sucesso, não recebo nenhum e-mail em nenhuma caixa entrada referente aos e-mails cadastrados. Não tem aparecido nenhum log de erro aparente. O que pode estar acontecendo? Estou rodando em um máquina local com xampp e zend framework 1.7.0.

Cancelar resposta

Qual a sua opinião?

Faça login abaixo ou cadastre-se rapidamente.


Sobre o Autor
Júlio César Martini atualmente presta serviços de WebMaster/Programador para o UOL (http://www.uol.com.br), Graduado em Tecnólogo em Informática pela UNIFIAN - Faculdades Anhanguera e Pós-Graduado em Desenvolvimento de Software para Web pela UFSCAR. Foi o primeiro profissional a chegar à marca de 100 artigos publicados no iMasters e trabalha com PHP desde 2000. Site: http://www.juliocesarmartini.com

2001 - iMasters FFPA Informática Ltda - Todos os direitos reservados.