Função mail() [PHP] – Acentuação correta no assunto

  • Última modificação: 15/02/2019
  • Tempo de leitura: 1 min.

O envio de e-mails com o PHP através da função mail() traz um problema para nós que usamos a Língua Portuguesa: a acentuação no campo assunto. Alguns clientes de e-mail até fazem a tradução de UTF-8 para ISO-8859-1, mas alguns simplesmente exibem tudo errado mesmo (um spoiler: mudar o charset no Content-Type não vai adiantar nada pro problema do assunto).

Alguns “utf8_encodes” e “utf8_decodes” depois, descobri uma solução bem fácil, basta transformar o assunto da seguinte forma:

$assunto = '=?UTF-8?B?'.base64_encode($assunto).'?=';

Depois é só usar a variável $assunto na chamada da função mail().

Felipe Elia

Associate Director of Platform Engineering na 10up, WordPress Core Contributor, Global Polyglots Mentor na comunidade internacional do WordPress e Locale Manager na comunidade WordPress Brasil.

Este post tem 18 comentários

  1. Genesio

    Muito obrigado. Funcionou perfeitamente.

  2. Jean

    Ótima dica! Solução simples e eficaz. Obrigadooooooooo!

  3. Renato

    O assunto era enviado em branco. Passei várias horas testando possibilidades, mudando servidores de SMTP… e nada resolvia.
    Muito Obrigado. Foi extremamente útil.

  4. Carlos Moreira

    Cara, onde tu descobriu isso?!

  5. Marcelo Guillaumon Emmel

    Fantástico! Muito obrigado!

  6. André

    Valeu cara! Me ajudou também =)

  7. Willian

    Ótima dica!

  8. Silvanei Soares Santos

    Cara salvou o dia.

  9. Ivo

    No subject funcionou, mas no conteudo do e-mail(texto) não…que coisa….

  10. Anderson dos Santos

    Cara, obrigado. To a horas testando um monte de função de decodificação do php a horas. O seu deu certo 😀

  11. Ramon

    cara ótima dica, funcionou perfeitamente.
    Muito obrigado, abraços!

  12. Gabriel Rodrigo

    Muito obrigado pela dica, também solucionou meu problema. Obrigado

  13. adriano mendes

    cara. ótima dica. nem sei como agradecer. abraço

  14. Edson Ribeiro

    Obrigado, excelente dica! Fazia tempo que eu estava querendo resolver esse problema no assunto dos e-mails, e deu certinho. Eu uso “feed back” de cadastro dos e-mails e mando e-emails “marketing” através de um site que criei para os usuários cadastrados. Se eu puder retribuir com alguma coisa pode contar comigo.

  15. suupern

    Muito obrigada!! Depois de horas de pesquisa, sua dica me ajudou muito!!

  16. Matheus

    A tempos sofro com este problema no bendito hotmail. Esta linha resolveu o problema. Obrigado!

  17. Ezequiel

    Olá Felipe, estou tentando usar sua dica em meu formulário e não estou conseguindo, pois não entendo bem de programação. Segue abaixo o código do arquivo php. Além desse php tenho o html. Se for possível me ajudar posso enviar os dois arquivos para você analisar.

    $email = $_POST[‘email’];
    $telefone = $_POST[‘telefone’];
    $cidade = $_POST[‘cidade’];
    $assunto = $_POST[‘assunto’];
    $textodamensagem = $_POST[‘textodamensagem’];

    //CABEÇALHO – ONFIGURAÇÕES SOBRE SEUS DADOS E SEU WEBSITE
    $nome_do_site=”www.cidosom.com.br”;
    $email_para_onde_vai_a_mensagem = “[email protected]”;
    $nome_de_quem_recebe_a_mensagem = “CIDO SOM”;
    $exibir_apos_enviar=’enviado.html’;

    //MAIS – CONFIGURAÇOES DA MENSAGEM ORIGINAL
    $cabecalho_da_mensagem_original=”From: $name \n”;
    $assunto_da_mensagem_original=”Contato no Site”;

    // FORMA COMO RECEBERÁ O E-MAIL (FORMULÁRIO)
    // ******** OBS: SE FOR ADICIONAR NOVOS CAMPOS, ADICIONE OS CAMPOS NA VARIÁVEL ABAIXO *************
    $configuracao_da_mensagem_original=”

    ENVIADO POR:\n
    Nome: $nome\n
    Email: $email\n
    Telefone: $telefone\n
    Cidade: $cidade\n
    Assunto: $assunto\n
    Mensagem: $textodamensagem\n
    ENVIADO EM: $date

    “;

    //CONFIGURAÇÕES DA MENSAGEM DE RESPOSTA
    // CASO $assunto_digitado_pelo_usuario=”s” ESSA VARIAVEL RECEBERA AUTOMATICAMENTE A CONFIGURACAO
    // “Re: $assunto”
    $assunto_da_mensagem_de_resposta = “Confirmação”;
    $cabecalho_da_mensagem_de_resposta = “From: $nome_do_site \n”;
    $configuracao_da_mensagem_de_resposta=”Obrigado por entrar em contato!\nEstaremos respondendo em breve…\nAtenciosamente,\n$nome_do_site\n\nEnviado em: $date”;

    // ****** IMPORTANTE ********
    // A PARTIR DE AGORA RECOMENDA-SE QUE NÃO ALTERE O SCRIPT PARA QUE O SISTEMA FINCIONE CORRETAMENTE
    // ****** IMPORTANTE ********

    //ESSA VARIAVEL DEFINE SE É O USUARIO QUEM DIGITA O ASSUNTO OU SE DEVE ASSUMIR O ASSUNTO DEFINIDO
    //POR VOCÊ CASO O USUARIO DEFINA O ASSUNTO PONHA “s” NO LUGAR DE “n” E CRIE O CAMPO DE NOME
    //’assunto’ NO FORMULARIO DE ENVIO
    $assunto_digitado_pelo_usuario=”s”;

    //ENVIO DA MENSAGEM ORIGINAL
    $headers = “$cabecalho_da_mensagem_original”;

    if($assunto_digitado_pelo_usuario==”n”){
    $assunto = “$assunto_da_mensagem_original”;
    }
    $seuemail = “$email_para_onde_vai_a_mensagem”;
    $mensagem = “$configuracao_da_mensagem_original”;
    mail($seuemail,$assunto,$mensagem,$headers);

    //ENVIO DE MENSAGEM DE RESPOSTA AUTOMATICA
    $headers = “$cabecalho_da_mensagem_de_resposta”;
    if($assunto_digitado_pelo_usuario==”n”){
    $assunto = “$assunto_da_mensagem_de_resposta”;
    }else{
    $assunto = “Re: $assunto”;
    }

    $mensagem = “$configuracao_da_mensagem_de_resposta”;
    mail($email,$assunto,$mensagem,$headers);
    echo “window.location=’$exibir_apos_enviar'”;

    ?>

  18. Saty

    Excelente dica, desse modo posso manter minha pagina na codificação utf-8 e ao mesmo tempo enviar e-mails sem erros nos caracteres do assunto.
    muito obrigado,

    Saty

Comentários encerrados.