Enviar e-mails com anexos utilizando PHP
Veja duas formas de 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.