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?

helenhousandi
fonte

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 <[email protected]>:

add_filter('wp_mail_from','yoursite_wp_mail_from');
function yoursite_wp_mail_from($content_type) {
  return '[email protected]';
}
add_filter('wp_mail_from_name','yoursite_wp_mail_from_name');
function yoursite_wp_mail_from_name($name) {
  return 'Helen Hou-Sandi';
}
MikeSchinkel
fonte
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" <[email protected]>\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.

John P Bloch
fonte
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 ().

Brady
fonte
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" <[email protected]>';

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.

Sjors Hijgenaar
fonte
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.

Tigran
fonte