Wie füge ich Kopfzeilen zu ausgehenden E-Mails hinzu?

Ich möchte ausgehenden E-Mails auf meinen Websites einen zusätzlichen Header hinzufügen, damit ich einfach feststellen kann, welche Site eine bestimmte E-Mail gesendet hat. (Ich habe ein Standardfunktionalitäts-Plug-in auf all meinen Websites installiert, so dass dies einfach genug ist, und die Konfiguration meines E-Mail-Clients zum Filtern und anderweitigen Handeln in diesem Header wäre eine erstaunliche Zeitersparnis.)

Ich dachte, das wäre eine einfache Sache, in die wp_mail function zu wp_mail , aber offensichtlich ist es nicht.

Zuerst habe ich Folgendes versucht:

 add_filter('wp_mail', 'ws_add_site_header'); function ws_add_site_header() { return array('headers' => 'X-WU-Site: ' . parse_url(get_site_url(), PHP_URL_HOST)); } 

Hier hatte mein Array Vorrang vor allem anderen, was die Mail-Einstellungen (etwa Gravity Forms) verändert hatte, so dass HTML-E-Mails als nackter HTML-Code erschienen und nicht gut formatiert waren. Sinnvoll, da der Content-type: header, den GF hinzugefügt hat, bereinigt wurde. Aber meine Kopfzeile wurde der E-Mail hinzugefügt. Da andere auch davon abhängig sind, dass sie hübsche E-Mails erhalten (unter anderem die Entwickler und Endnutzer aller meiner Websites, unter anderem), ist das nicht akzeptabel.

Einer meiner Kollegen schlug dann vor, meine Sachen durch wp_parse_args () zu leiten, also:

 add_filter('wp_mail', 'ws_add_site_header'); function ws_add_site_header($args) { $new_header = array('headers' => 'X-WU-Site: ' . parse_url(get_site_url(), PHP_URL_HOST)); return wp_parse_args($args, $new_header); } 

Damit ist es, als ob meine function nicht existiert – mein Header wird nicht hinzugefügt, aber auch die Header und Mail-Einstellungen anderer werden nicht entfernt.

Was ist der richtige Weg, um einer ausgehenden E-Mail eine Kopfzeile hinzuzufügen, ohne andere eventuell vorhandene Filter zu überlisten?

Solutions Collecting From Web of "Wie füge ich Kopfzeilen zu ausgehenden E-Mails hinzu?"

Hier ist eine Alternative, die direkt die AddCustomHeader Methode der PHPMailer Instanz verwendet:

 /** * Add a custom header. * $name value can be overloaded to contain * both header name and value (name:value) * @access public * @param string $name Custom header name * @param string $value Header value * @return void */ public function addCustomHeader($name, $value = null) { if ($value === null) { // Value passed in as name:value $this->CustomHeader[] = explode(':', $name, 2); } else { $this->CustomHeader[] = array($name, $value); } } 

Hier können wir sehen, dass es zwei Möglichkeiten gibt, es zu benutzen:

Beispiel 1:

Hier übergeben wir nur die Header-Informationen in der $name Eingabe-Zeichenfolge, die getrennt ist mit :

 add_action( 'phpmailer_init', function( $phpmailer ) { $phpmailer->AddCustomHeader( 'X-WU-Site: ' . parse_url( get_site_url(), PHP_URL_HOST ) ); } ); 

Beispiel # 2:

Hier sind sowohl $name als auch $value nicht leer:

 add_action( 'phpmailer_init', function( $phpmailer ) { $phpmailer->AddCustomHeader( 'X-WU-Site', parse_url( get_site_url(), PHP_URL_HOST ) ); } ); 

Dank dem oben Gesagten habe ich meinen zentralen Fehler erkannt – mir war nicht ganz klar, dass die Argumente, die übergeben wurden, ein mehrdimensionales Array waren.

Für jetzt habe ich die function so umgesetzt:

 function ws_add_site_header($email) { $email['headers'][] = 'X-WU-Site: ' . parse_url(get_site_url(), PHP_URL_HOST) ; return $email; } 

Mein Lesen der wp_mail () Quelle (siehe: https://core.trac.wordpress.org/browser/tags/4.4.2/src/wp-includes/pluggable.php#L235 ) führt mich zu der Annahme, dass die Header Die Komponente kann ein Array oder eine große Zeichenkette oder möglicherweise ein schrecklicher Mischmasch der beiden sein, aber die Verwendung eines Arrays ist wahrscheinlich die sicherere / korrektere Option.

Ich mag die verschiedenen phpmailer Antworten, aber es scheint nur ein bisschen sauberer zu versuchen, Dinge mit WordPress eingebauten zu tun.

PHP- headers sind Strings. Sie können sie nicht als Array analysieren. Sie müssen einen zusätzlichen Header als Zeichenfolge mit \r\n hinzufügen, um sicherzustellen, dass er in der nächsten Zeile hinzugefügt wird.

Beispiel:

 add_filter('wp_mail', 'ws_add_site_header', 99); function ws_add_site_header($args) { $args['headers'] .= !empty($args['headers']) ? "\r\n" : ''; $args['headers'] .= 'X-WU-Site: ' . parse_url(get_site_url(), PHP_URL_HOST); return $args; } 

Beachten Sie bitte auch, dass Sie zusätzliche Header mit der Priorität 99 hinzufügen, damit kein anderes Plugin es ersetzen kann, wenn es nicht prüft, ob die Header bereits vorhanden sind. Wenn nötig, 999 .