Perché wp_mail() non mi permette di impostare l'intestazione From: mentre la funzione PHP mail() lo consente?
Quando uso wp_mail( $to, $subject, $message, $headers )
(con i valori appropriati, ovviamente), l'email viene inviata con un nome mittente e un'email che non sono impostati da nessuna parte che riesco a trovare (nemmeno nelle impostazioni di PHP o Apache). Tuttavia, usando invece mail( $to, $subject, $message, $headers )
funziona perfettamente. Cosa potrebbe causare questo comportamento con wp_mail()
?

Ciao @helenyhou:
Puoi impostare l'intestazione, ma non con un parametro. WordPress utilizza gli "hook" e gli hook di cui hai bisogno sono 'wp_mail_from'
e 'wp_mail_from_name'
.
Ecco gli hook che potresti aggiungere al file functions.php
del tuo tema per modificare l'intestazione "From:"
quando usi wp_mail()
con l'indirizzo 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';
}

Stavo proprio guardando i filtri e hai ragione, risolve il problema. Suppongo che il Codex dovrebbe essere aggiornato? http://codex.wordpress.org/Function_Reference/wp_mail
Inoltre, correlato: sembra che questo influenzi molti plugin per moduli disponibili, incluso il potente GravityForms. Attualmente sto scrivendo un modulo personalizzato, ma se questo è il comportamento previsto da WP, perché impostare gli header utilizzando il vecchio metodo funziona per altri (e anche per alcuni dei miei altri siti)?

@helenyhou - Per evitare di influenzare altri moduli, dovresti aggiungere i filtri nel tuo plugin appena prima di chiamare wp_mail()
e poi rimuoverli subito dopo. Per quanto riguarda il motivo per cui impostare gli header funziona, non so quali siano i tuoi altri casi d'uso, ma sarei sorpreso se wp_mail()
funzionasse in quel modo.

Ahhhh ho capito cosa stava succedendo - un altro plugin stava aggiungendo i filtri globalmente per qualcosa che non avevo richiesto e da cui non potevo escludermi - male, male, male. Quindi ora gli header regolari funzionano dopo tutto. Sembra che utilizzare quei filtri sarebbe la migliore pratica, se sono presenti.

Nota che qualsiasi filtro aggiunto da un plugin può essere rimosso tramite remove_filter(HOOK, FUNCTION).

Bene, se stai utilizzando il formato From: "Tuo Nome" <tuaemail@example.com>\r\n
nelle tue intestazioni, non dovresti avere problemi (a meno che non sia installato un plugin 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:
Ti fornirà un'impostazione delle opzioni per determinare quale nome e email utilizzare in wp_mail()
.

Scusate se riapro una vecchia domanda, ma non è meglio impostare tramite gli header 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 è necessario preoccuparsi di utilizzare un filtro e poi rimuoverlo dopo wp_mail()
.

Non ho impostato io il filtro, è stato un altro plugin. Il filtro ha la precedenza sull'header. Inoltre, dovresti davvero usare site_url()
invece di get_bloginfo('wpurl')

Ma allora sicuramente quel plugin è fatto male perché non pulisce dopo sé stesso... non c'è molto che tu possa fare però :( in tal caso è meglio che modifichi il mio plugin per usare il filtro nel caso in cui un altro plugin lo abbia rotto.

@helenyhou - +1 per avermi ricordato di site_url(). Ho anche modificato il mio plugin per usare i filtri invece di usare $headers. Inoltre mi sono assicurato di rimuovere quei filtri una volta inviata l'email per non interferire con nient'altro :)

sì, è colpa di quel plugin che non mi dà l'opzione di non usare quei filtri, ma per fortuna commentare i filtri ha funzionato nel mio caso. Probabilmente chiederò in giro per capire cosa sia meglio usare in futuro - un filtro per ogni utilizzo o i più familiari header. Gli header sono probabilmente più efficienti, ma allora perché ci sono quei filtri? Sempre più domande :)

Nella versione corrente, è totalmente accettabile usare get_bloginfo('wpurl')
: Questo restituisce già site_url()
. get_bloginfo('home')
e get_bloginfo('siteurl')
sono deprecati. https://developer.wordpress.org/reference/functions/get_bloginfo/

È un po' un hack, ma puoi anche utilizzare il tag di intestazione Reply To
:
$headers = 'Reply-To: "Aaren A. Aarenson" <aaron@somemail.com>';
Sfortunatamente, questo aggiunge l'indirizzo email alla lista From, e rispondere significa che dovrai rimuovere manualmente l'indirizzo configurato nel filtro wp_mail_from
.

Ho avuto lo stesso problema. Nel mio caso è risultato che il provider di hosting (BlueHost) impediva la modifica del campo "from". Qui lo spiegano https://my.bluehost.com/cgi/help/206.
Ho risolto il problema aggiungendo l'email alle caselle di posta in cPanel come indicato.
