Por que o wp_mail () não permite que eu defina o cabeçalho From: quando o antigo PHP mail () o fará?


32

Quando eu uso wp_mail( $to, $subject, $message, $headers )(com valores no local, é claro), o email é enviado com um nome e um email que não estão definidos em nenhum lugar que eu possa encontrar (nem mesmo nas configurações do PHP ou Apache). No entanto, o uso mail( $to, $subject, $message, $headers )funciona muito bem. O que poderia estar acontecendo wp_mail()para causar isso?

Respostas:


44

Olá @helenyhou:

Você pode definir o cabeçalho, mas não com um parâmetro. O WordPress usa "ganchos" e os ganchos que você precisa são 'wp_mail_from'e 'wp_mail_from_name'ganchos.

Aqui estão os ganchos que você pode adicionar ao functions.phparquivo do seu tema para modificar o "From:"cabeçalho ao usar wp_mail()o endereço de email Helen Hou-Sandi <helenyhou@example.com>:

add_filter('wp_mail_from','yoursite_wp_mail_from');
function yoursite_wp_mail_from($content_type) {
  return 'helenyhou@example.com';
}
add_filter('wp_mail_from_name','yoursite_wp_mail_from_name');
function yoursite_wp_mail_from_name($name) {
  return 'Helen Hou-Sandi';
}

Eu estava apenas olhando os filtros e você está certo, isso resolve o problema. Suponho que o Codex deve ser atualizado? codex.wordpress.org/Function_Reference/wp_mail Também relacionado: isso parece afetar muitos plugins de formulário por aí, incluindo os poderosos GravityForms. No momento, estou escrevendo um formulário personalizado, mas se é assim que o WP deve se comportar, por que a configuração dos cabeçalhos usando o método antigo regular funciona para outras pessoas (e até para alguns dos meus outros sites)?
— 10239 helievousandi

@helenyhou - Para não afetar outros formulários, você precisa adicionar os filtros no seu plugin antes de chamar wp_mail()e depois removê-los imediatamente. Quanto ao porquê definir os cabeçalhos, não sei quais são os outros casos de uso, mas ficaria surpreso se wp_mail()funcionasse dessa maneira.
— 21411 MikeSchinkel

2
Ahhhh, descobri o que estava acontecendo - outro plug-in estava adicionando os filtros globalmente para algo que eu não pedi e não posso optar por sair - ruim, ruim, ruim. Então agora os cabeçalhos regulares funcionam, afinal. Parece que usar esses filtros seria uma prática recomendada, se eles estiverem lá.
— helenhousandi

Apenas uma observação aqui de que qualquer filtro que um plug-in está adicionando pode ser removido via remove_filter (HOOK, FUNCTION).
— 21138 Jason Coleman

só funciona se o domínio de e-mail for igual ao site.
— Omer

4

Bem, se você estiver usando o From: "Your Name" <youremail@example.com>\r\nformato em seus cabeçalhos, não deverá ter problemas (a menos que tenha um plug-in instalado que substitua a função wp_mail).

No entanto, como Mike disse, você pode filtrar os valores finais com esses filtros ou apenas instalar este plugin:

Enviar de

Ele fornecerá uma configuração de opções para determinar qual nome e email usar no wp_mail.


1

Desculpe reviver uma pergunta antiga, mas não é melhor definir os cabeçalhos da seguinte maneira:

$subject  = "MyPlugin: Alert (".get_bloginfo('wpurl').")";
$headers  = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type: text/html; charset=".get_bloginfo('charset')."" . "\r\n";
$headers .= "From: MyPlugin <".$this->settings['from_address'].">" . "\r\n";
wp_mail($this->settings['notify_address'], $subject, $alertMessage, $headers);

Dessa forma, você não precisa se preocupar em usar um filtro e removê-lo depois de wp_mail ().


2
Eu não configurei o filtro, outro plugin o fez. O filtro tem precedência sobre o cabeçalho. Além disso, você realmente deve usar site_url()em vez deget_bloginfo('wpurl')
— helenhousandi

Mas certamente esse plug-in é ruim por não ter resolvido o problema ... não é muito o que você pode fazer sobre isso :( Nesse caso, é melhor eu mudar meu plug-in para usar o filtro, caso outro plugin o tenha quebrado.
— Brady

@helenyhou - +1 por me lembrar sobre site_url (). Também mudei meu plug-in para usar filtros, em vez de usar $ headers. Além disso, eu tenho a certeza de remover esses filtros depois de já ter enviado o e-mail de modo a não ficar no caminho de qualquer outra coisa :)
— Brady

sim, esse plug-in é ruim por não ter me dado a opção de não usar esses filtros, mas felizmente comentando os filtros elaborados para o meu caso. Provavelmente vou pedir para ver qual é melhor usar no futuro - um filtro por uso ou os cabeçalhos mais familiares. Os cabeçalhos são provavelmente mais eficientes, mas por que esses filtros existem? Sempre mais perguntas :)
— helenhousandi

A partir da versão atual, é totalmente aceitável usar get_bloginfo('wpurl'): Isso site_url()já retorna . get_bloginfo('home')e get_bloginfo('siteurl')estão obsoletos. developer.wordpress.org/reference/functions/get_bloginfo
— James M

1

É um pouco complicado, mas você também pode usar a Reply Totag header:

$headers = 'Reply-To: "Aaren A. Aarenson" <aaron@somemail.com>';

Infelizmente, isso adiciona o endereço de email à lista De, e responder significa que você precisará remover manualmente o endereço configurado no wp_mail_fromfiltro.


Isso consertou para mim. Você salvou um companheiro de vida! ;)
— user382738

0

Eu tive o mesmo problema. Para mim, descobriu-se que o provedor de hospedagem (BlueHost) estava impedindo de alterar o campo de. Aqui eles explicam https://my.bluehost.com/cgi/help/206 .

Corrigi o problema adicionando o email às caixas de correio do cPanel da maneira que eles dizem.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.