W3docs

PHP Mail

Aprenda a usar a função mail() do PHP para enviar mensagens de e-mail diretamente de um script PHP.

A função integrada mail() do PHP envia e-mail diretamente de um script — sem necessidade de bibliotecas extras. É a forma mais rápida de disparar uma notificação, uma mensagem de "fale conosco" ou um link de redefinição de senha. Este capítulo explica a assinatura da função, apresenta exemplos de texto simples e HTML, e aborda as armadilhas de segurança e entregabilidade que costumam surpreender desenvolvedores em produção.

O que a Função mail() Faz

mail() entrega uma mensagem ao agente de transferência de e-mail (MTA) local do servidor — o programa (como Sendmail, Postfix ou Exim) que de fato retransmite o e-mail para o mundo externo. O PHP não se comunica diretamente com servidores SMTP remotos; ele apenas enfileira a mensagem localmente. Se o host não tiver um MTA funcional, mail() retorna false e nada é enviado.

A função retorna um booleano: true se a mensagem foi aceita para entrega (diferente de entregue), e false em caso de falha.

Sintaxe

mail(
    string $to,
    string $subject,
    string $message,
    array|string $additional_headers = [],
    string $additional_params = ""
): bool
ParâmetroObrigatórioDescrição
$toSimEndereço(s) do destinatário. Separe múltiplos endereços com vírgula.
$subjectSimLinha de assunto. Não deve conter quebras de linha.
$messageSimO corpo do e-mail. As linhas devem ser separadas por \r\n e ter no máximo 70 caracteres.
$additional_headersNãoCabeçalhos extras como From, Reply-To ou Content-Type. A partir do PHP 7.2, pode ser um array associativo.
$additional_paramsNãoFlags de linha de comando extras passadas ao MTA (por exemplo, o remetente do envelope via -f).

Enviando um E-mail em Texto Simples

Este é o caso mais comum: uma mensagem de texto simples com alguns cabeçalhos.

<?php
$to      = '[email protected]';
$subject = 'Test email';
$message = 'This is a test email from PHP.';

// Additional headers
$headers  = 'From: [email protected]' . "\r\n";
$headers .= 'Reply-To: [email protected]' . "\r\n";
$headers .= 'X-Mailer: PHP/' . phpversion();

if (mail($to, $subject, $message, $headers)) {
    echo 'Email sent successfully.';
} else {
    echo 'Failed to send email.';
}
?>

Definimos o destinatário, o assunto e o corpo, depois construímos uma string de cabeçalhos. O cabeçalho From identifica o remetente, Reply-To controla para onde vão as respostas, e X-Mailer é informativo. Os cabeçalhos são unidos com \r\n (retorno de carro + alimentação de linha), que é o terminador de linha exigido pelo protocolo de e-mail.

Enviando um E-mail HTML

Para enviar HTML formatado, adicione Content-type: text/html aos cabeçalhos. Sem ele, o destinatário verá as tags brutas em vez da marcação renderizada.

<?php
$to      = '[email protected]';
$subject = 'HTML email';
$message = '
<html>
<body>
    <h1>Hello!</h1>
    <p>This message is <strong>formatted with HTML</strong>.</p>
</body>
</html>';

// To send HTML mail, the Content-type header must be set
$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);
?>

Enviando para Múltiplos Destinatários

Passe uma lista separada por vírgulas em $to, ou use os cabeçalhos Cc/Bcc:

<?php
$to      = '[email protected], [email protected]';
$subject = 'Team update';
$message = 'Meeting moved to 3 PM.';

$headers  = 'From: [email protected]' . "\r\n";
$headers .= 'Bcc: [email protected]' . "\r\n";

mail($to, $subject, $message, $headers);
?>

Proteção Contra Injeção de Cabeçalhos

Se qualquer parte de um cabeçalho — especialmente From ou Reply-To — vier de entrada do usuário (como um formulário de contato), um atacante pode injetar quebras de linha extras para adicionar seus próprios cabeçalhos e transformar seu script em um relay de spam. Nunca coloque dados brutos do usuário em cabeçalhos. Valide e sanitize primeiro:

<?php
// $_POST['email'] comes from an untrusted form
$email = filter_var($_POST['email'] ?? '', FILTER_VALIDATE_EMAIL);

if ($email === false) {
    exit('Invalid email address.');
}

// Strip any line breaks that could be used to inject headers
$email = str_replace(["\r", "\n"], '', $email);

$headers = 'From: ' . $email . "\r\n";
mail('[email protected]', 'Contact form', 'New message', $headers);
?>

Veja filter_var() e o capítulo PHP Filter para mais informações sobre validação de entrada, e PHP Form Validation para tratar dados de formulário com segurança.

Entregabilidade e Notas de Produção

Nota: A função mail() depende do MTA local do servidor. Em muitos ambientes de hospedagem modernos, ela falha silenciosamente ou cai na caixa de spam sem configuração adequada. Para aplicações reais, prefira uma biblioteca estabelecida como PHPMailer ou Symfony Mailer, que suportam autenticação SMTP, anexos, codificação e enfileiramento. Qualquer que seja a rota escolhida, configure registros válidos de SPF, DKIM e DMARC para o seu domínio, para que os provedores de caixa de entrada confiem nas suas mensagens.

Um retorno true significa apenas que o MTA aceitou a mensagem — não é uma confirmação de entrega. Para rastrear a entrega real, rejeições e aberturas, use um serviço de e-mail transacional.

Casos de Uso Comuns

  • Formulários de contato — colete uma mensagem e envie por e-mail ao proprietário do site (combine com PHP Form Handling).
  • Notificações — confirmações de pedidos, alertas, redefinições de senha.
  • Relatórios — scripts agendados que enviam um resumo por e-mail.

Conclusão

A função mail() do PHP oferece uma maneira rápida e sem dependências de enviar e-mail a partir de um script: forneça o destinatário, o assunto e o corpo, depois adicione cabeçalhos para o remetente, endereço de resposta ou conteúdo HTML. Tenha em mente suas limitações — ela depende de um MTA configurado, retorna aceitação em vez de entrega, e nunca deve receber dados do usuário não sanitizados em seus cabeçalhos. Para qualquer coisa além de e-mails simples e de baixo volume, use uma biblioteca dedicada. Para continuar aprendendo, explore PHP Functions e PHP Strings.

Prática

Prática
Quais são os parâmetros da função mail() do PHP?
Quais são os parâmetros da função mail() do PHP?
Was this page helpful?