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.
Todos os exemplos acima, utilizando o SMTP do GMAIL para envio.
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"
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());
}
?>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.

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());
}
?>Compo pode-se observar na figura abaixo, o email enviado contêm texto negrito e itálico. Fácil, né?

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
}
?>

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.

http://framework.zend.com/manual/en/zend.mail.html
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!
Bruno Rodrigues
Gostei da matéria é uma ótima dica, e o melhor de tudo está muito bem explicado
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
Acha que ele aumenta a produtividade melhor que CodeIgniter, CakePHP ou Simphony?
Carlos Gustavo
Pelamordedeus, Wanderlei, isso aí é dúvida pra fórum.
Williams Gomes Lucena
Olha muito legal esse tutorial, agora preciso saber como mandar os e-mails sem SSL.
Desde ja agradeço.
Ó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
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?
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
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
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.
2001 - iMasters FFPA Informática Ltda - Todos os direitos reservados.