Enviar e-mails com anexos utilizando PHP

Enviar e-mails com anexos utilizando PHP

Neste artigo vamos ver como é possível fazer o envio de e-mails com anexo utilizando PHP. Vamos ver dois exemplos de como fazer isso, um utilizando uma função nativa do PHP e outra utilizando uma biblioteca.

O que você vai aprender neste artigo?

 

* Enviar e-mail com anexo utilizando a função mail().

* Enviar e-mail com anexo utilizando a biblioteca PHPMailler.

 

Usando a funcão mail()

 

Uma mensagem de email é composta de um cabeçalho e um corpo, sendo que o corpo da mensagem pode ser separado em várias partes. 

Cada parte da mensagem é separada por um boundary. O boundary é uma string aleatória que deve aparecer no email apenas quando for para indicar uma parte do email.

O PHP possui uma função chamada mail() utilizada para o envioa de mensagens de e-mail. Sua sintaxe é a seguinte:

 

mail(destinatario, assunto, mensagem, cabecalhos);

 

Seus parâmetros são:

- Destinatario: O e-mail que deve receber a mensagem.

- Assunto: O assunto da mensagem.

- Mensagem: O conteúdo da mensagem.

- Cabeçalhos: Cabeçalhos do e-mail.

 

Observação: O remetente de um e-mail deve ser um e-mail válido no domínio.

Vamos começar definindo o cabeçalho da mensagem e a mensagem a ser enviada:

 

$destinatario = "destinatario@teste.com.br";

$remetente = "remetente@teste.com.br"; 

//Cabeçalho da mensagem

$boundary = "XYZ-" . date("dmYis") . "-ZYX";

$headers = "MIME-Version: 1.0" . PHP_EOL;

$headers .= "Content-Type: multipart/mixed; ";

$headers .= "boundary=" . $boundary . PHP_EOL;

$headers .= "$boundary" . PHP_EOL;

$conteudo_mensagem = "Mensagem para testar o envio de anexos com PHP";

 

Perceba que para criar o boundary foi utilizada a data no formato dia mes ano minutos e segudos, junto com uma string de prefixo e sufixo;

Agora vamos abrir um arquivo local e guardar seu conteúdo numa variável chamada "anexo".

 

$caminho = "/caminho_para_o_arquivo";

$tipoArquivo = mime_content_type($caminho);

$nomeArquivo = basename($caminho);

$fp = fopen( $caminho, "rb" ); 

$anexo = fread( $fp, filesize($caminho)); 

$anexo = chunk_split(base64_encode($anexo)); 

fclose( $fp ); 

 

As funções que utilizamos para abrir o anexo foram:

- mime_content_type: Informa qual o MIME type do arquivo. MIME significa Multipurpose Internet Mail Extension, ele é um padrão que define o tipo de arquivo.

- basename: Ao informar o caminho do arquivo, retorna apenas o nome do arquivo.

- fopen: Abre um arquivo.

- fread: Faz a leitura de um arquivo até uma determinada posição, em nosso exemplo ele faz a leitura do arquivo até o seu final.

- filesize: Retorna o tamanho do arquivo em bytes.

- chunk_split: Divide uma string em pequenos pedaços para facilitar o envio.

- base64_encode: Codifica o anexo no formato base64.

- fclose: Fecha um arquivo.

Agora vamos configurar a mensagem. Precisamos de dois boundaries, um para o texto da mensagem e outro para o anexo que vamos enviar.

 

$mensagem = "--$boundary" . PHP_EOL;

$mensagem .= "Content-Type: text/html; charset=\'utf-8\'" . PHP_EOL;

$mensagem.= "$conteudo_mensagem";

$mensagem .= "--$boundary" . PHP_EOL;

$mensagem .= "Content-Type: ". $tipoArquivo ."; name=\"". $nomeArquivo . "\"" . PHP_EOL;

$mensagem .= "Content-Transfer-Encoding: base64" . PHP_EOL;

$mensagem .= "Content-Disposition: attachment; nomeArquivo=\"". $nomeArquivo . "\"" . PHP_EOL;

$mensagem .= "$anexo" . PHP_EOL;

$mensagem .= "--$boundary" . PHP_EOL;

if(mail($destinatario, $assunto, $mensagem, $headers)) {

echo "Mensagem enviada com sucesso!";

} else {

echo "Ocorreu um erro ao enviar a mensagem!";

}

 

 

Usando a biblioteca PHPMailler()

 

Como você viu, utilizar a funçao mail() para enviar um arquivo é algo muito trabalhoso. Uma forma mais fácil de mandar e-mails com anexo é utilizar a biblioteca PHPMailler. Você pode baixar esta biblioteca a partir deste link:

 

https://github.com/PHPMailer/PHPMailer

 

Primeiro você precisa incluir a biblioteca no seu script e criar um objeto com as configurações do e-mail.

 

require_once("caminho_para_o_phpmailer/class.phpmailer.php");

$email = new PHPMailer();

$email->IsHTML(true);

$email->SMTPDebug = 0;

 

As seguintes opções foram configuradas:

 

- IsHTML: Ao ser definido como true, ativa o envio de conteúdo em HTML na sua mensagem.

- SMTPDebug: Ativa o modo de debug, ao marcar zero ele é desativado. As opções são de 1 a 4, sendo 1 e 2 as mais comuns para ver erros no envio e as opções 3 e 4 são utilizadas quando não é possível estabelecer conexão com o servidor de e-mail.

 

A seguir você precisa informar as configurações do seu serviço de e-mail.

 

$email->IsSMTP(); 

$email->Port = ""; 

$email->setFrom("email@email.com.br", "Nome do remetente");

$email->Host = "";

$email->SMTPAuth = true; 

$email->Username = "nome do usuario"; 

$email->Password = "senha";

 

Nas configurações do seu serviço de e-mail, você tem as seguintes opções:

 

- IsSMTP(): Define que a mensagem será enviada por SMTP.

- Port: Porta do servidor SMTP.

- setFrom: Endeço de e-mail do remetente e nome de exibição.

- Host: Endereço do servidor SMTP.

- SMTPAuth: Quando o servidor exige autenticação para disparo do e-mail deve ser informada a opçao true e o username e password devem ser informados.

- Username: Usuário do servidor SMTP.

- Password: Senha da caixa postal utilizada para o disparo do e-mail.

 

Uma vez configurada a forma de enviar o e-mail, você precisa configurar a mensagem a ser enviada

 

$email->From = "nome@exemplo.com.br";

$email->FromName  = "Seu nome";

$email->Subject   = "Assunto";

$email->Body      = "Corpo do email";

$email->AddAddress("destinatario@exemplo.com.br" );

$anexo = "caminho_do_arquivo_a_se_anexado";

$email->AddAttachment( $anexo , "nome_do_arquivo_e_extensao" );

if (!$email->send()) {

echo "Erro: " . $email->ErrorInfo;

} else {

echo "Mensagem enviada com sucesso!";

}

$email->Send();

 

Para o envio da mensagem as seguintes configurações são necessárias: 

 

- From: E-mail do remetente.

- FromName: Nome do remetente.

- Subject: Assunto do e-mail.

- Body: Mensagem a ser enviada.

- AddAddress: Endereço de e-mail que deve receber a mensagem.

- AddAttachment: Adiciona um anexo.

- Send(): Envia a mensagem.

 

 

Outros conteudos que podem ser de seu interesse

Calculando distâncias com PHP
04/06/2023PHP

Calculando distâncias com PHP

Veja como calcular a distância entre duas coordenadas com PHP

Saiba mais...
Calcular a diferença entre horas utilizando PHP
20/03/2022PHP

Calcular a diferença entre horas utilizando PHP

Aprenda como calcular a diferença de horas utilizando PHP

Saiba mais...

Conteúdo sobre banco de dados sem complicação!