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

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().

Tags:

Comentários

  • 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

  • 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 = “contato@cidosom.com.br”;
    $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'”;

    ?>

  • Matheus

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

  • suupern

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

  • 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.

  • adriano mendes

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

  • Gabriel Rodrigo

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

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

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

  • Ivo

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

  • Silvanei Soares Santos

    Cara salvou o dia.

  • Ótima dica!

  • Valeu cara! Me ajudou também =)

  • Marcelo Guillaumon Emmel

    Fantástico! Muito obrigado!

  • Carlos Moreira

    Cara, onde tu descobriu isso?!