Pourquoi wp_mail () ne me laisse-t-il pas définir l'en-tête From: quand tout à fait vieux PHP mail () le fera?

32

Lorsque j'utilise wp_mail( $to, $subject, $message, $headers )(avec les valeurs en place, bien sûr), l'e-mail est envoyé avec un nom d'origine et un e-mail qui n'est défini nulle part (ni même dans les paramètres PHP ou Apache). Cependant, utiliser à la mail( $to, $subject, $message, $headers )place fonctionne très bien. Qu'est-ce qui pourrait arriver avec wp_mail()cela?

Helenhousandi
la source

Réponses:

44

Bonjour @helenyhou:

Vous pouvez définir l'en-tête, mais pas avec un paramètre. WordPress utilise « crochets » et les crochets dont vous avez besoin sont 'wp_mail_from'et 'wp_mail_from_name'crochets.

Voici les points d'ancrage que vous pouvez ajouter au functions.phpfichier de votre thème pour modifier l'en- "From:"tête lors de l'utilisation wp_mail()de l'adresse de messagerie 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';
}
Mike Schinkel
la source
Je regardais juste les filtres et vous avez raison, cela corrige le problème. Je suppose que le Codex devrait être mis à jour? codex.wordpress.org/Function_Reference/wp_mail Également lié: cela semble affecter de nombreux plugins de formulaire, y compris le puissant GravityForms. J'écris actuellement un formulaire personnalisé, mais si c'est ainsi que WP est censé se comporter, pourquoi la définition des en-têtes à l'aide de l'ancienne méthode fonctionne-t-elle pour d'autres (et même pour certains de mes autres sites)?
helenhousandi
@helenyhou - Pour éviter d'affecter d'autres formulaires, vous devez ajouter les filtres dans votre plug-in juste avant d'appeler wp_mail(), puis les supprimer juste après. Pour ce qui est de savoir pourquoi définir les en-têtes fonctionne, je ne sais pas quels sont vos autres cas d'utilisation, mais je serais surpris si wp_mail()cela fonctionnerait ainsi.
MikeSchinkel
2
Ahhhh, j'ai trouvé ce qui se passait - un autre plugin ajoutait les filtres globalement pour quelque chose que je n'avais pas demandé et dont je ne pouvais pas me passer - mauvais, mauvais, mauvais. Alors maintenant, les en-têtes habituels fonctionnent après tout. On dirait que l'utilisation de ces filtres serait la meilleure pratique cependant, s'ils y figurent.
Helenhousandi
Il suffit de noter ici que tout filtre ajouté par un plugin peut être supprimé via remove_filter (HOOK, FUNCTION).
Jason Coleman
cela ne fonctionne que si le domaine de messagerie est identique à celui du site.
Omer
4

Eh bien, si vous utilisez le From: "Your Name" <[email protected]>\r\nformat dans vos en-têtes, vous ne devriez pas avoir de problème (sauf si vous avez installé un plugin qui remplace la fonction wp_mail).

Cependant, comme l'a dit Mike, vous pouvez filtrer les valeurs ultimes avec ces filtres, ou simplement installer ce plugin:

Envoyé de

Cela vous donnera un paramètre d’options pour déterminer quel nom et quel email utiliser dans wp_mail.

John P Bloch
la source
1

Désolé de revivre une vieille question mais ne vaut-il pas mieux définir via les en-têtes comme ceci:

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

De cette façon, vous n’aurez plus à vous soucier d’utiliser un filtre puis à supprimer après wp_mail ().

Brady
la source
2
Je n'ai pas défini le filtre, un autre plugin l'a fait. Le filtre a la priorité sur l'en-tête. En outre, vous devriez vraiment utiliser site_url()au lieu deget_bloginfo('wpurl')
helenhousandi
Mais alors sûrement que ce plugin est mauvais pour ne pas effacer après lui-même .... pas beaucoup que vous pouvez faire à ce sujet cependant :( dans ce cas, je ferais mieux de changer mon plugin pour utiliser le filtre juste au cas où un autre plugin l'a cassé.
Brady
@helenyhou - +1 pour me rappeler de site_url (). J'ai également changé mon plugin pour utiliser des filtres plutôt que d'utiliser $ headers. De plus, je me suis assuré de supprimer ces filtres une fois que j'ai envoyé l'e-mail pour ne rien gêner :)
Brady
oui, c’est mauvais pour ce plugin de ne pas me donner l’option de ne pas utiliser ces filtres mais, heureusement, de commenter les filtres qui ont fonctionné pour mon cas. Je vais probablement demander autour de moi pour savoir lequel est préférable d'utiliser à l'avenir - un filtre par utilisation ou les en-têtes plus familiers. Les en-têtes sont probablement plus efficaces, mais alors pourquoi ces filtres sont-ils là? Toujours plus de questions :)
helenhousandi
A partir de la version actuelle, il est tout à fait acceptable d’utiliser get_bloginfo('wpurl'): ceci retourne site_url()déjà. get_bloginfo('home')et get_bloginfo('siteurl')sont obsolètes. developer.wordpress.org/reference/functions/get_bloginfo
James M
1

C'est un peu un hack, mais vous pouvez aussi utiliser la Reply Tobalise header:

$headers = 'Reply-To: "Aaren A. Aarenson" <[email protected]>';

Malheureusement, cela ajoute l'adresse e-mail à la liste De, et répondre signifie que vous devrez supprimer manuellement l'adresse configurée dans le wp_mail_fromfiltre.

Sjors Hijgenaar
la source
Cela a résolu le problème pour moi. Vous avez sauvé un compagnon de vie! ;)
user382738
0

J'ai eu le même problème. Pour moi, il est apparu que le fournisseur d'hébergement (BlueHost) empêchait de changer de champ. Ici, ils expliquent https://my.bluehost.com/cgi/help/206 .

J'ai résolu le problème en ajoutant l'e-mail aux boîtes aux lettres cPanel, comme ils le disent.

Tigrane
la source