Anexando arquivos no E-mail
/* Esta é uma continuação do post Enviando E-mail através do Zend_Mail */
Anexar arquivo não é uma tarefa muito fácil no envio de e-mail tradicional. Metade dos tutoriais na Web não funciona e a outra metade não é la estas coisas. Mais com o Zend esta tarefa ficou muito simples.
Para ajudar nesta tarefa temos o método createAttachment que possui a seguinte sintaxe:
public function createAttachment($body,
$mimeType = Zend_Mime::TYPE_OCTETSTREAM,
$disposition = Zend_Mime::DISPOSITION_ATTACHMENT,
$encoding = Zend_Mime::ENCODING_BASE64,
$filename = null)
No $body passamos o binário da imagem podendo esta ser carregado através do file_get_contents ou do fopen.
Em $mimeType passamos o tipo do arquivo, sendo os pricipais listados em http://plugindoc.mozdev.org/winmime.php ou em http://www.webmaster-toolkit.com/mime-types.shtml. POr exemplo, para PDF você deve usar “application/pdf” e se for excel pode usar “application/excel” ou “application/vnd.ms-excel” ou “application/x-excel” ou “application/x-msexcel“.
No $disposition refere a forma com a qual o arquivo será anexado. Eu deixo este por padrão que é aceito sem problemas. O mesmo acontece com o $encoding que o melho é mesmo o Base64. E por ultimo o $filename que informamos o nome do arquivo.
Veja um exemplo:
<?php
require_once 'Zend/Config.php';
require_once 'Zend/Mail.php';
require_once 'Zend/Mail/Transport/Smtp.php';
require_once 'Zend/Mime/Part.php';
$config = array (
'auth' => 'login', // Email serão autenticados
'username' => 'email@servidor.com.br', // informa o login do E-mail
'password' => '123456789'); // senha
$mailTransport = new Zend_Mail_Transport_Smtp("smtp.servidor.com.br", $config);
$mail = new Zend_Mail();
$mail->createAttachment(file_get_contents("oti_imagem.jpg"),
'image/jpg',
Zend_Mime::DISPOSITION_ATTACHMENT,
Zend_Mime::ENCODING_BASE64,
"oti_imagem.jpg");
$mail->setFrom('fulano@servidor.com.br', 'Fulano')
->addTo('beltrano@gmail.com', 'Beltrano')
->setBodyText("Teste de mensagem")
->setSubject("Teste de assunto")
->send($mailTransport);
Neste a imagem ficará a disposição para download. Veja como chegou em meu Gmail:

Unexar a imagem e apresentar no corpo do E-mail
Para anexar temos que criar um objeto do tipo Zend_Mime_Part e informar principalmente um ID para este elemento. é através deste ID que iremos chamar a imagem no HTML. Para anexar uma imagem e apresentar usamos como $disposition = Zend_Mime::DISPOSITION_INLINE para não aparecer na lista de download.
Para ID eu simplesmente chamo a função md5 na data atual com formatação ISO 8601. Então passamos este componente para a função addAttachment() conforme abaixo.
<?php
require_once 'Zend/Config.php';
require_once 'Zend/Mail.php';
require_once 'Zend/Mail/Transport/Smtp.php';
require_once 'Zend/Mime/Part.php';
$config = array (
'auth' => 'login', // Email serão autenticados
'username' => 'email@servidor.com.br', // informa o login do E-mail
'password' => '123456789'); // senha
$mailTransport = new Zend_Mail_Transport_Smtp("smtp.servidor.com.br", $config);
$mp = new Zend_Mime_Part(file_get_contents("oti_imagem.jpg"));
$mp->id = md5(date('c'));
$mp->encoding = Zend_Mime::ENCODING_BASE64;
$mp->type = 'image/jpg';
$mp->disposition = Zend_Mime::DISPOSITION_INLINE;
$mail = new Zend_Mail();
$mail->setFrom('fulano@servidor.com.br', 'Fulano')
->addTo('beltrano@gmail.com', 'Beltrano')
->setBodyHtml('<img src="cid:' . $mp->id . '" alt="">')
->setSubject("Teste de assunto")
->addAttachment($mp)
->send($mailTransport);
Veja abaixo o E-mail recebido em meu Gmail com uma imagem anexada apresentada no corpo da mensagem.













