mail()
Conheça a função mail() do PHP, usada para enviar mensagens de e-mail diretamente a partir de um script PHP.
A função mail() envia mensagens de e-mail diretamente a partir de um script PHP. É a forma mais simples de enviar e-mail de forma nativa, e este guia aborda sua sintaxe e parâmetros, como os cabeçalhos funcionam, o envio de mensagens HTML e para múltiplos destinatários, as vulnerabilidades de segurança a evitar e quando você deve recorrer a uma biblioteca dedicada.
O que é a Função mail()?
A função mail() é uma função nativa do PHP que entrega um e-mail ao agente de transferência de e-mail (MTA) do sistema — tipicamente o sendmail no Linux — ou ao servidor SMTP configurado no php.ini. Por depender dessa configuração local, mail() frequentemente retorna false (ou falha silenciosamente na entrega) em uma máquina de desenvolvimento que não possui um MTA instalado. Ela não abre uma conexão SMTP por conta própria, portanto não consegue autenticar-se em um provedor externo como o Gmail.
Um valor de retorno true significa apenas que a mensagem foi aceita para entrega pelo MTA — não é uma garantia de que o e-mail chegou à caixa de entrada do destinatário.
Sintaxe
mail(
string $to,
string $subject,
string $message,
array|string $additional_headers = [],
string $additional_params = ""
): bool| Parâmetro | Obrigatório | Descrição |
|---|---|---|
$to | Sim | Endereço(s) do(s) destinatário(s). Vários endereços são separados por vírgula, ex.: "[email protected], [email protected]". |
$subject | Sim | A linha de assunto. Não deve conter quebras de linha. |
$message | Sim | O corpo da mensagem. Cada linha deve ser separada por \r\n e ter no máximo 70 caracteres. |
$additional_headers | Não | Cabeçalhos extras como From, Cc, Bcc, Content-Type. Uma string (separada por CRLF) ou, desde o PHP 7.2, um array associativo. |
$additional_params | Não | Flags extras passadas à linha de comando do MTA (ex.: -f para definir o remetente do envelope). |
Como Usar a Função mail()
Aqui está um exemplo completo em texto simples que constrói os cabeçalhos e verifica o valor de retorno:
<?php
$to = '[email protected]';
$subject = 'Test email';
$message = 'This is a test email from PHP';
// Additional headers
$headers = 'From: [email protected]' . "\r\n"
. 'Reply-To: [email protected]' . "\r\n"
. 'X-Mailer: PHP/' . phpversion();
// Send the email and check the result
if (mail($to, $subject, $message, $headers)) {
echo "Email sent successfully.";
} else {
echo "Email delivery failed.";
}
?>Definimos o destinatário, o assunto e a mensagem, e então construímos os cabeçalhos. Como mail() retorna um boolean, é uma boa prática verificar o valor de retorno em vez de assumir o sucesso. O cabeçalho From é importante: sem ele, muitos servidores de e-mail rejeitam a mensagem ou a marcam como spam.
Enviando um E-mail HTML
Para enviar HTML em vez de texto simples, adicione Content-Type: text/html aos cabeçalhos. Sem isso, o cliente exibe as tags brutas como texto.
<?php
$to = '[email protected]';
$subject = 'HTML email test';
$message = '<h1>Hello</h1><p>This message is <b>HTML</b>.</p>';
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=UTF-8\r\n";
$headers .= "From: [email protected]\r\n";
mail($to, $subject, $message, $headers);
?>Múltiplos Destinatários, Cc e Bcc
Coloque vários endereços em $to (separados por vírgula) para a linha "Para" visível, e use os cabeçalhos Cc/Bcc para cópias:
<?php
$to = '[email protected], [email protected]';
$subject = 'Team update';
$message = 'See attached agenda.';
$headers = "From: [email protected]\r\n";
$headers .= "Cc: [email protected]\r\n";
$headers .= "Bcc: [email protected]\r\n";
mail($to, $subject, $message, $headers);
?>Os destinatários em Bcc ficam ocultos para todos os demais, enquanto os endereços em Cc são visíveis para todos os destinatários.
Segurança: Evitando Injeção de Cabeçalho
Se qualquer parte do destinatário, assunto ou cabeçalhos vier de entrada do usuário — por exemplo, um formulário de contato — um invasor pode injetar quebras de linha extras para adicionar seus próprios cabeçalhos Cc/Bcc e usar seu servidor para enviar spam. Sempre valide endereços e remova quebras de linha antes de passá-los para mail():
<?php
$email = $_POST['email'] ?? '';
// Reject anything that is not a valid email address
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
exit('Invalid email address.');
}
// Strip CR/LF so the value can't inject new headers
$email = str_replace(["\r", "\n"], '', $email);
?>Use filter_var() com FILTER_VALIDATE_EMAIL para validar, e consulte Validação de Formulários PHP e Tratamento de URL/E-mail em Formulários para padrões de processamento seguro de formulários.
Limitações e Quando Usar uma Biblioteca
mail() é adequada para mensagens simples e de baixo volume, mas tem limitações reais:
- Não consegue autenticar-se em um servidor SMTP externo (sem usuário/senha, handshake TLS).
- Não oferece suporte nativo a anexos — é necessário construir as partes MIME manualmente.
- O relatório de erros é mínimo: um retorno
falsediz pouco sobre por que a entrega falhou.
Para produção, e-mail transacional ou qualquer coisa com anexos, use uma biblioteca dedicada como PHPMailer ou Symfony Mailer. Elas tratam autenticação SMTP, codificação, anexos e oferecem relatórios de erros muito melhores.
Conclusão
A função mail() oferece uma maneira rápida de enviar e-mail diretamente do PHP e é bem adequada para notificações simples quando um MTA funcional está disponível. Lembre-se de que seu sucesso depende da configuração do servidor, que você deve se proteger contra injeção de cabeçalho com dados fornecidos pelo usuário, e que sistemas de produção geralmente são melhor atendidos pelo PHPMailer ou Symfony Mailer. Para leitura relacionada, explore Funções PHP e a função header().