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.