The symfony Cookbook

Como enviar um email

You are currently browsing
the website for symfony 1

Visit the Symfony2 website


About

You are currently reading "The symfony Cookbook" which is licensed under the Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported License license.

Master symfony

Be trained by SensioLabs experts (2 to 6 day sessions -- French or English).
trainings.sensiolabs.com

Books on symfony

Learn more about symfony with the official guides.
books.sensiolabs.com

L'audit Qualité par SensioLabs

200 points de contrôle de votre applicatif web.
audit.sensiolabs.com

Chapter Content

Visão Geral

Instalando

Configuração

Gerando o e-mail

Enviar um e-mail HTML

Enviando um e-mail em várias partes

Usando diferentes configurações de conexão

Usando os servidores SMTP do Gmail

Embutindo imagens

Anexos

Listas de Destinatários

Enviando emails a partir de uma tarefa (task)

Documentação adicional

symfony training
Be trained by symfony experts
Feb 21: Köln (Getting Started with Symfony2 - English)
Feb 27: Köln (Mastering Symfony2 - English)
Mar 05: Köln (Web Development with Symfony2 - Deutsch)
Mar 05: Montreal (Web Development with Symfony2 - English)
Mar 05: Montreal (Getting Started with Symfony2 - English)
and more...

Search


powered by google
You are currently browsing "The symfony Cookbook" in Brazilian Portuguese for the 1.2 version - Switch to version: - Switch to language:
Creative Commons License This work is licensed under a Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported License.
Translation of this work into another language is explicitly allowed.
This version of symfony is not maintained anymore.
If some of your projects still use this version, consider upgrading as soon as possible.

Visão Geral

Enviar emails é uma tarefa comum para todos os desenvolvedores web, e o symfony 1.1 torna esta tarefa mais fácil do que nunca usando o Swift Mailer.

O Swift Mailer é uma poderosa biblioteca PHP5 totalmente orientada a objetos, que irá satisfazer 120% das suas necessidades de email.

Ela está disponível em um diretório SVN separado, e por isso o seu projeto não irá ter problemas só porque voce decidiu atualizar a biblioteca. É voce quem decide se quer atualizar para uma versão mais nova.

A forma de enviar emails pelo symfony é muito simples. Voce cria um partial ou um componente que irá manipular o conteúdo do email, e usar o Swift para enviá-lo de uma forma bastante flexível.

Instalando

Se o seu projeto já estiver usando SVN, voce pode instalá-lo usando o comando svn:externals:

$ cd /path/to/symfony/project
$ mkdir -p lib/vendor
$ svn propedit svn:externals .

E depois adicione a seguinte linha:

swift http://swiftmailer.svn.sourceforge.net/svnroot/swiftmailer/tags/php5/3.3.3/lib/

Se o seu projeto não estiver usando SVN, voce ainda pode baixá-lo pelo subversion usando os seguintes comandos:

$ cd /path/to/symfony/project
$ mkdir -p lib/vendor
$ svn checkout http://swiftmailer.svn.sourceforge.net/svnroot/swiftmailer/tags/php5/3.3.3/lib/ swift

Depois disso, limpe o cache para forçar o symfony a enxergar os novos diretórios que foram criados, e pronto!

Configuração

Não há configuração específica de email.

Para manter o seu projeto flexível, voce deve utilizar o arquivo de configuração app.yml para inserir os endereços de email. Desse modo, voce pode ter vários remetentes/destinatários de acordo com o ambiente(environment) que voce estiver trabalhando. E caso alguém precise alterá-los, não será necessário vasculhar todo o código do projeto. O lugar onde fazer a alteração será bastante óbvio.

Gerando o e-mail

A partir do symfony 1.1, voce pode pegar facilmente o conteudo de partials ou componentes a partir de uma ação:

$corpoDoEmail = $this->getPartial('mailBody', array('name' => 'Vitor Mello'));

ou

$corpoDoEmail = $this->getComponent('mail', 'mailBody', array('name' => 'Vitor Mello'));

Enviar um e-mail HTML

Agora, vamos enviar o email acima usando o Swift:

try
{
  // Criar a mensagem e o objeto que irá enviar os emails
  $mailer = new Swift(new Swift_Connection_NativeMail());
  $mensagem = new Swift_Message('Assunto do Email', $corpoDoEmail, 'text/html');
 
  // Enviar
  $mailer->send($mensagem, $destinatario, $remetente);
  $mailer->disconnect();
}
catch (Exception $e)
{
  $mailer->disconnect();
 
  // tratar os erros aqui
}

Enviando um e-mail em várias partes

Alguns clientes de email não gostam muito de HTML, por isso é uma boa idéia enviar seus emails tanto em HTML como em texto puro.

try
{
  // Criar a mensagem e o objeto que irá enviar os emails
  $mailer = new Swift(new Swift_Connection_NativeMail());
  $mensagem = new Swift_Message('Assunto do email de testes');
 
  // Montar as várias partes do email
  $contextoDoEmail = array('name' => 'Vitor Mello');
  $mensagem->attach(new Swift_Message_Part($this->getPartial('mail/mailHtmlBody', $contextoDoEmail), 'text/html'));
  $mensagem->attach(new Swift_Message_Part($this->getPartial('mail/mailTextBody', $contextoDoEmail), 'text/plain'));
 
  // Enviar
  $mailer->send($mensagem, $destinatario, $remetente);
  $mailer->disconnect();
}
catch (Exception $e)
{
  $mailer->disconnect();
 
  // tratar erros aqui
}

Usando diferentes configurações de conexão

Quando voce instancia a classe Swift, voce pode utilizar diferentes objetos do tipo Swift_Connection.

Usando os servidores SMTP do Gmail

Por que alguém iria querer usar uma conta do gmail para enviar emails?

Quais são as limitações?

Veja como configurar um objeto do Swift:

$connection = new Swift_Connection_SMTP('smtp.gmail.com', 465, Swift_Connection_SMTP::ENC_SSL);
$connection->setUsername('romain@gmail.com');
$connection->setPassword('SuperSecurePassword');
 
$mailer = new Swift($connection);

Embutindo imagens

Para embutir imagens no seu email, voce precisar gerar algumas URLs a partir dos objetos anexados antes de exibir seu conteudo. Veja um exemplo de como fazer isto:

// Criar a mensagem e o objeto que irá enviar os emails
$mailer = new Swift(new Swift_Connection_NativeMail());
$mensagem = new Swift_Message('Assunto do email de Testes');
 
// Inline images
$images = array();
$images['symfony'] = new Swift_Message_Image(new Swift_File(sfConfig::get('sf_web_dir').'/images/symfony.gif'));
$images['swift']   = new Swift_Message_Image(new Swift_File(sfConfig::get('sf_web_dir').'/images/swift.jpg'));
 
$imageReferences = array();
foreach ($images as $name => $image)
{
  $imageReferences[$name] = $message->attach($image);
}
 
// Montar as várias partes do email
$mailContext = array('name' => 'Vitor Mello', 'images' => $imageReferences);
$mensagem->attach(new Swift_Message_Part($this->getPartial('mail/mailHtmlBody', $mailContext), 'text/html'));
$mensagem->attach(new Swift_Message_Part($this->getPartial('mail/mailTextBody', $mailContext), 'text/plain'));
 
// Send
$mailer->send($mensagem, $destinatario, $remetente);
$mailer->disconnect();

No seu partial/componente voce pode incluir facilmente as imagens embutidas da seguinte maneira:

<img src="<?php echo $images['symfony']; ?>" alt="Symfony Project" />
<img src="<?php echo $images['swift']; ?>" alt="Swift Mailer" />

Fácil, fácil, não?

Anexos

Felizmente, anexar um arquivo a um email é tão simples quanto gostaríamos que fosse:

$message->attach(new Swift_Message_Attachment(new Swift_File($file), $filename, $mime_type));

Listas de Destinatários

Na maioria da vezes, voce pode querer enviar o mesmo email para mais de uma pessoa, ou mesmo incluir outras pessoas como cópias carbono. Voce pode fazer isso facilmente usando a classe Swift_RecipientList.

$destinatarios = new Swift_RecipientList();
$destinatarios->addTo($to);
$destinatarios->addCc($cc);
$destinatarios->addBcc($bcc);

Se voce estiver enviando emails em um loop, não se esqueça de usar o método ->flush() na sua lista de $destinatarios, ou voce vai ter um trabalhão pra explicar porque alguém recebeu 500 cópias de uma newsletter.

Enviando emails a partir de uma tarefa (task)

O processo é exatamente igual à maneira como voce faria a partir de uma ação, com uma pequena diferença: Voce não pode mais utilizar os métodos da sfAction.

Voce precisará utilizar as funções get_partial() e get_component() contidas no PartialHelper ao invés dos métodos sfAction::getPartial() e sfAction::getComponent.

Documentação adicional

O site do SwiftMailer é uma mina de ouro de documentação e tutoriais.

Questions & Feedback

If you find a typo or an error, please register and open a ticket.

If you need support or have a technical question, please post to the official user mailing-list.