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:

<?php
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 'Config.php';
require_once 'Zend/Mail.php';
require_once 'Zend/Mime/Part.php';

$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(Config::getMailInstance());

Neste a imagem ficará a disposição para download. Veja como chegou em meu Gmail:

13-email2

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:

post10013\index2.php
<?php
require_once 'Config.php';
require_once 'Zend/Mail.php';
require_once 'Zend/Mime/Part.php';

$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(Config::getMailInstance());

Veja abaixo o E-mail recebido em meu Gmail com uma imagem anexada apresentada no corpo da mensagem.

13-email

Baixe aqui os exemplos desta página.

Fique por dentro de nossas novidades, ideias e atualizações