W3docs

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âmetroObrigatórioDescrição
$toSimEndereço(s) do(s) destinatário(s). Vários endereços são separados por vírgula, ex.: "[email protected], [email protected]".
$subjectSimA linha de assunto. Não deve conter quebras de linha.
$messageSimO corpo da mensagem. Cada linha deve ser separada por \r\n e ter no máximo 70 caracteres.
$additional_headersNãoCabeçalhos extras como From, Cc, Bcc, Content-Type. Uma string (separada por CRLF) ou, desde o PHP 7.2, um array associativo.
$additional_paramsNãoFlags 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 false diz 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().

Prática

Prática
O que está correto sobre a função PHP mail() de acordo com o conteúdo da URL fornecida?
O que está correto sobre a função PHP mail() de acordo com o conteúdo da URL fornecida?
Was this page helpful?