Linguagem: enviar um e-mail com anexo

Dezembro 2016

Os e-mails, bem como as páginas web, são enviadas com cabeçalhos (headers em inglês).
Estes cabeçalhos servem para exibir alguns detalhes necessários como o endereço do destinatário, daquele que envia, a data, o objeto do e_mail, etc.
Eles são organizados da seguinte forma:
Nome_cabeçalho: valeor\n\r  
Nome_cabeçalho: valor\n\r  
[...]  
Nome_cabeçalho: valeur\n\n\r  

Corpo da mensagem..  

Sabendo que "\n" significa nova linha, "\r" colocação em início de linha.

É em parte mexendo nestes cabeçalhos que podemos enviar um e-mai, com anexo através de um programa.
O cabeçalho especifica o tipo de mensagem: e-mail html, email, texto etc.
Para enviar um e-mail com anexo, deve ser dado o tipo multiparest / mixed quer dizer que encontraremos muitas partes deste e-mail (aqui, a mensagem principal e anexo).

Para separar essas partes, usamos o que é chamado de "fronteira" (boundary <ital> <Ital /> em Inglês).
Esta fronteira deve ser uma seqüência de caracteres única para não ser encontrado em sua mensagem principal.

Tomemos por exemplo "didondinaditondelosdudosdodudundodudindon" ( caracteres acsii de preferência, não sei como um cliente mail reagirá com caracteres evoluídos).

Para os nossos cabeçalhos, só vamos declarar o endereço do remetente, a versão do MIME e o tipo de mensagem e, como é uma mensagem com um anexo, que deve especificar a fronteira:

From: remetente@domínio.br\r\n  
MIME-Versão: 1.0\r\n  
Content-Type: multipart/mixed; boundary="didondinaditondelosdudosdodudundodudindon"\r\n\n

(Note que no final dos cabeçalhos eles se caracterizam por dois saltos de linha)
Para começar uma parte do corpo do e-mail, comecemos por exibir nossa fronteira. Quando a fronteira abre a parte, ela é precedida de dois hífens: "--". Terminaremos com um salto a uma nova linha:
--didondinaditondelosdudosdodudundodudindon\n

A mensagem legível do e-mail será um simples texto. Coloca-se o estilo do tipo desta parte (com o jogo de caracteres que convém, aqui o jogo de caracteres utilizado pelo alfabeto português):
Content-Type: text/plain; charset=ISO-8859-1\r\n\n

Mensagem principal do e-mail .\n\n</pre>

A continuidade concerne o arquivo em anexo. Para colocar os dados binários em um e-mail, utilizamos um standard chamado base 64 que permite transformar estes dados em caracteres.

Vamos então lançar novamente nossa fronteira para delimitar esta parte e precisar nossos cabeçalhos:

_ O tipo do arquivo (vamos tomar um arquivo doc para Word)
_ O tipo de codificação do arquivo (aqui base 64)
_ A disposição do arquivo no e-mail (anexo) e seu nome.
--didondinaditondelosdudosdodudundodudindon\n  
Content-Type: application/msword; name="nom_fichier"\r\n  
Content-Transfer-Encoding: base64\r\n  
Content-Disposition: attachment; filename="nom_fichier"\r\n\n

Na continuidade nós exibiremos o conteúdo de nosso arquivo codificado em base64.

E enfim, nos iremos fechar nossa fronteira.
Para fechar uma fronteira, basta seguir e preceder os dois hífens "--", ou seja :
--didondinaditondelosdudosdodudundodudindon--\n


Pronto! O e-mail pode ser enviado.
Para concretizar tudo isto, vamos implementar o envio deste e-mail em php :
<?php  
$boundary='didondinaditondelosdudosdodudundodudindon';  
//Cabeçalho do e-mail.  
$headers="From: remetente@domínio.br\r\n  
MIME-Versão: 1.0\r\n  
Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n\n";  

//Corpo do e-mail começando pela mensagem principal   
$body="--". $boundary ."\n  
Content-Type: text/plain; charset=ISO-8859-1\r\n\n  
Mensagem principal do e-mail.\n\n";  

/* Anexo, digamos que nosso arquivo chama-se bidule.doc e que ele situa-se no diretório corrente  */  

$arquivo=file_get_contents('./bidule.doc');  
/* Utiliza-se  chunk_split() que organizará a codificação na base64 para se conformar aos standars. */  
$fichier=chunk_split( base64_encode($fichier) );  

//Escrita do anexo  
$body = $body . "--" .$boundary. "\n  
Content-Type: application/msword; name=\"nome_arquivo\"\r\n  
Content-Transfer-Encoding: base64\r\n  
Content-Disposition: attachment; filename=\"nom_arquivo\"\r\n\n  
$arquivo";  

//Fechamento da franteira  
$body = $body . "--" . $boundary ."--";  

//Envio do e-mail  
mail("destinatário@bidule.br", "sujet", $body, $headers);  
?>  

Pronto :-)

Fontes e documentos :
_ hochfeiler
_ fr2



Tradução feita por Ana Spadari

Veja também

Artigo original publicado por . Tradução feita por ninha25. Última modificação: 9 de janeiro de 2011 às 08:51 por ninha25.
Este documento, intitulado 'Linguagem: enviar um e-mail com anexo', está disponível sob a licença Creative Commons. Você pode copiar e/ou modificar o conteúdo desta página com base nas condições estipuladas pela licença. Não se esqueça de creditar o CCM (br.ccm.net) ao utilizar este artigo.