Perché wp_mail () non mi consente di impostare l'intestazione From: quando lo farà semplicemente la vecchia posta PHP ()?


32

Quando uso wp_mail( $to, $subject, $message, $headers )(con i valori in atto, ovviamente), l'e-mail viene inviata con un nome da e-mail che non è impostato ovunque io possa trovare (nemmeno nelle impostazioni di PHP o Apache). Tuttavia, l'utilizzo mail( $to, $subject, $message, $headers )invece funziona perfettamente. Cosa potrebbe succedere con wp_mail()questo?

Risposte:


44

Ciao @helenyhou:

È possibile impostare l'intestazione, ma non con un parametro. WordPress utilizza "hook" e gli hook necessari sono 'wp_mail_from'e 'wp_mail_from_name'hook.

Ecco gli hook che potresti aggiungere al functions.phpfile del tuo tema per modificare l' "From:"intestazione quando si utilizza wp_mail()l'indirizzo e-mail 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';
}

Stavo solo guardando i filtri e hai ragione, risolve il problema. Suppongo che il Codice debba essere aggiornato? codex.wordpress.org/Function_Reference/wp_mail Anche correlato: questo sembra influenzare molti plug-in di moduli, inclusi i potenti GravityForms. Attualmente sto scrivendo un modulo personalizzato, ma se è così che dovrebbe comportarsi WP, perché impostare le intestazioni usando il vecchio metodo normale funziona per gli altri (e anche per alcuni dei miei altri siti)?
Helenhousandi,

@helenyhou - Per evitare di influenzare altri moduli, è necessario aggiungere i filtri nel plug-in appena prima di chiamarli wp_mail()e rimuoverli subito dopo. Per quanto riguarda il motivo per cui l'impostazione delle intestazioni funziona, non so quali siano i tuoi altri casi d'uso, ma sarei sorpreso se wp_mail()funzionasse in questo modo.
MikeSchinkel,

2
Ahhhh ho trovato quello che stava succedendo - un altro plugin stava aggiungendo i filtri a livello globale per qualcosa che non chiedevo e di cui non posso rinunciare - cattivo, cattivo, cattivo. Quindi ora le intestazioni normali funzionano dopo tutto. Sembra che usare quei filtri sarebbe la migliore pratica, se ci sono.
Helenhousandi,

Solo una nota qui che qualsiasi filtro sta aggiungendo un plugin può essere rimosso tramite remove_filter (HOOK, FUNCTION).
Jason Coleman,

funziona solo se il dominio e-mail è uguale al sito.
Omer,

4

Bene, se stai usando il From: "Your Name" <youremail@example.com>\r\nformato nelle intestazioni, non dovresti avere problemi (a meno che tu non abbia un plugin installato che sovrascrive la funzione wp_mail).

Tuttavia, come ha detto Mike, puoi filtrare i valori finali con quei filtri, oppure puoi semplicemente installare questo plugin:

Invia da

Ti fornirà un'impostazione delle opzioni per determinare quale nome ed e-mail usare in wp_mail.


1

Mi dispiace rivivere una vecchia domanda ma non è meglio impostare le intestazioni in questo modo:

$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);

In questo modo non dovrai preoccuparti di usare un filtro e di rimuoverlo dopo wp_mail ().


2
Non ho impostato il filtro, un altro plug-in. Il filtro ha la precedenza sull'intestazione. Inoltre, dovresti davvero usare site_url()invece diget_bloginfo('wpurl')
helenhousandi il

Ma poi sicuramente quel plugin è male per non aver chiarito dopo se stesso .... non molto puoi farcela però :( in quel caso è meglio cambiare il mio plugin per usare il filtro nel caso in cui un altro plugin lo abbia rotto.
Brady

@helenyhou - +1 per avermi ricordato di site_url (). Ho anche cambiato il mio plugin per usare i filtri piuttosto che usare $ headers. Inoltre mi sono assicurato di rimuovere quei filtri una volta che ho inviato l'e-mail in modo da non intralciare nient'altro :)
Brady

sì, è quel plugin male per non avermi dato la possibilità di non usare quei filtri, ma per fortuna commentando i filtri risolti per il mio caso. Probabilmente chiederò in giro per vedere quale è meglio usare in futuro: un filtro per uso o le intestazioni più familiari. Le intestazioni sono probabilmente più efficienti, ma allora perché ci sono quei filtri? Sempre più domande :)
helenhousandi,

A partire dalla versione attuale, è totalmente accettabile usare get_bloginfo('wpurl'): questo ritorna site_url()già. get_bloginfo('home')e get_bloginfo('siteurl')sono deprecati. developer.wordpress.org/reference/functions/get_bloginfo
James M

1

È un po 'un trucco ma puoi anche usare il Reply Totag header:

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

Purtroppo questo aggiunge l'indirizzo e-mail all'elenco Da e rispondere significa che dovrai rimuovere manualmente l'indirizzo configurato nel wp_mail_fromfiltro.


Questo mi ha risolto. Hai salvato un compagno di vita! ;)
user382738,

0

Ho avuto lo stesso problema. Per me è emerso che il provider di hosting (BlueHost) stava impedendo di cambiare il campo da. Qui lo spiegano https://my.bluehost.com/cgi/help/206 .

Ho risolto il problema aggiungendo l'e-mail alle cassette postali cPanel proprio come si suol dire.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.