Warum kann ich mit wp_mail () nicht den From: -Header setzen, wenn dies mit normalen alten PHP-Mails () möglich ist?

32

Wenn ich wp_mail( $to, $subject, $message, $headers )(natürlich mit Werten an Ort und Stelle) verwende, wird die E-Mail mit einem Absendernamen und einer E-Mail gesendet, die nirgendwo zu finden sind (nicht einmal in den PHP- oder Apache-Einstellungen). mail( $to, $subject, $message, $headers )Stattdessen funktioniert die Verwendung jedoch einwandfrei. Was könnte passieren wp_mail(), um dies zu verursachen?

helenhousandi
quelle

Antworten:

44

Hallo @helenyhou:

Sie können den Header setzen, nur nicht mit einem Parameter. WordPress verwendet "Hooks" und die benötigten Hooks sind 'wp_mail_from'und 'wp_mail_from_name'Hooks.

Hier sind die Haken, die Sie möglicherweise zur functions.phpDatei Ihres Themas hinzufügen, um den "From:"Header bei Verwendung wp_mail()der E-Mail-Adresse zu ändern 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
quelle
Ich habe nur nach den Filtern gesucht und Sie haben Recht, es behebt das Problem. Ich nehme an, der Codex sollte aktualisiert werden? codex.wordpress.org/Function_Reference/wp_mail Auch im Zusammenhang: Dies scheint viele Formular-Plugins zu betreffen, einschließlich der mächtigen GravityForms. Ich schreibe gerade ein benutzerdefiniertes Formular, aber wenn WP sich so verhalten soll, warum funktioniert das Setzen der Header mit der regulären alten Methode für andere (und sogar für einige meiner anderen Websites)?
helenhousandi
@helenyhou - Um keine Auswirkungen auf andere Formulare zu haben, müssen Sie die Filter direkt vor dem Aufruf in Ihr Plugin einfügen wp_mail()und sie anschließend sofort entfernen. Was die Gründe für das Setzen der Header angeht, weiß ich nicht, wie Ihre anderen Anwendungsfälle aussehen, aber ich wäre überrascht, wenn wp_mail()das so funktionieren würde.
MikeSchinkel
2
Ahhhh, ich habe herausgefunden, was passiert ist - ein anderes Plugin hat die Filter global für etwas hinzugefügt, das ich nicht gewünscht habe und das ich nicht deaktivieren kann - schlecht, schlecht, schlecht. Nun funktionieren die regulären Header also doch. Die Verwendung dieser Filter scheint jedoch eine bewährte Methode zu sein, wenn sie vorhanden sind.
helenhousandi
Nur eine Anmerkung hier, dass jeder Filter, den ein Plugin hinzufügt, über remove_filter (HOOK, FUNCTION) entfernt werden kann.
Jason Coleman
Dies funktioniert nur, wenn die Domain von der E-Mail mit der Site identisch ist.
Omer
4

Wenn Sie das From: "Your Name" <[email protected]>\r\nFormat in Ihren Kopfzeilen verwenden, sollten Sie kein Problem haben (es sei denn, Sie haben ein Plugin installiert, das die Funktion wp_mail überschreibt).

Wie Mike bereits sagte, können Sie die endgültigen Werte mit diesen Filtern filtern oder einfach dieses Plugin installieren:

Senden von

Sie erhalten eine Optionseinstellung, mit der Sie bestimmen können, welcher Name und welche E-Mail-Adresse in wp_mail verwendet werden soll.

John P Bloch
quelle
1

Es tut uns leid, eine alte Frage wiederzubeleben, aber ist es nicht besser, sie über die Überschriften wie folgt festzulegen:

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

Auf diese Weise brauchen Sie sich keine Gedanken über die Verwendung eines Filters zu machen und anschließend um nach wp_mail () zu entfernen.

Brady
quelle
2
Ich habe den Filter nicht gesetzt, ein anderes Plugin schon. Der Filter hat Vorrang vor dem Header. Außerdem sollten Sie site_url()stattget_bloginfo('wpurl')
helenhousandi am
Aber dann ist dieses Plugin sicher schlecht, um nicht nach sich selbst aufzuräumen ... aber nicht viel kann man dagegen tun :( in diesem Fall ändere ich mein Plugin besser, um Filter zu verwenden, nur für den Fall, dass ein anderes Plugin es kaputt gemacht hat.
Brady
@helenyhou - +1 für die Erinnerung an site_url (). Ich habe auch mein Plugin geändert, um Filter zu verwenden, anstatt $ -Header zu verwenden. Außerdem habe ich mich vergewissert, diese Filter zu entfernen, sobald ich die E-Mail gesendet habe, damit mir nichts mehr im Wege steht :)
Brady
Ja, das Plugin ist schlecht, weil ich keine Option habe, diese Filter nicht zu verwenden, aber zum Glück hat es für meinen Fall funktioniert, wenn ich die Filter auskommentiere. Ich werde mich wahrscheinlich umsehen, was in Zukunft besser zu verwenden ist - ein Per-Use-Filter oder die bekannteren Header. Die Header sind wahrscheinlich effizienter, aber warum gibt es dann diese Filter? Immer mehr Fragen :)
helenhousandi
Ab der aktuellen Version ist die Verwendung völlig akzeptabel get_bloginfo('wpurl'): Dies kehrt site_url()bereits zurück. get_bloginfo('home')und get_bloginfo('siteurl')sind veraltet. developer.wordpress.org/reference/functions/get_bloginfo
James M
1

Es ist ein bisschen ein Hack, aber Sie können auch das Reply ToHeader-Tag verwenden:

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

Leider dies fügt die E - Mail - Adresse der Liste Von und Antwort Mittel müssen Sie manuell die in den konfigurierten Adresse entfernen wp_mail_fromFilter.

Sjors Hijgenaar
quelle
Das hat es für mich behoben. Du hast einen Lebensgefährten gerettet! ;)
user382738
0

Ich hatte das gleiche problem Für mich stellte sich heraus, dass der Hosting-Anbieter (BlueHost) das Aus-Feld nicht ändern konnte. Hier erklären sie es https://my.bluehost.com/cgi/help/206 .

Ich habe das Problem behoben, indem ich die E-Mail zu cPanel-Postfächern hinzugefügt habe.

Tigran
quelle