Wie füge ich ausgehenden E-Mails Header hinzu?

8

Ich möchte ausgehenden E-Mails auf meinen Websites einen zusätzlichen Header hinzufügen, damit ich leicht feststellen kann, welche Website eine bestimmte E-Mail gesendet hat. (Ich habe auf allen meinen Websites ein Plugin für Standardfunktionen installiert, sodass dies einfach genug ist. Die Konfiguration meines E-Mail-Clients zum Filtern und anderweitigen Bearbeiten dieses Headers wäre eine erstaunliche Zeitersparnis.)

Ich dachte, dies wäre eine einfache Sache des Einsteckens in die wp_mailFunktion, aber offensichtlich ist es nicht so.

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 allen anderen Elementen, die die E-Mail-Einstellungen geändert haben (z. B. Gravity Forms), sodass HTML-E-Mails als reines HTML und nicht gut formatiert angezeigt wurden. Sinnvoll, da der von GF hinzugefügte Content-Type: -Header gelöscht wurde. Aber mein Header wurde der E-Mail hinzugefügt. Da andere auch darauf angewiesen sind, hübsche E-Mails zu erhalten (unter anderem alle Content-Entwickler und Endbenutzer meiner Websites, da bin ich mir sicher), ist dies nicht akzeptabel.

Einer meiner Kollegen schlug dann vor, meine Sachen über 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 so, als ob meine Funktion nicht existiert - mein Header wird nicht hinzugefügt, aber auch die Header und E-Mail-Einstellungen anderer werden nicht entfernt.

Was ist der richtige Weg, um einer ausgehenden E-Mail einen Header hinzuzufügen, ohne andere Filter zu verschlüsseln, die möglicherweise vorhanden sind?

David E. Smith
quelle
Wenn Sie eine einfache Lösung wünschen, verwenden Sie bitte das kostenlose Wordpress-Plugin für
Prashant Baldha
Dieses Plugin behebt das Problem nicht wirklich. Es fügt dem von WordPress generierten E-Mail-Text einen "Header" hinzu. Ich habe versucht, einen SMTP-Header hinzuzufügen, was eine ganz andere Sache ist.
David E. Smith

Antworten:

7

Dank des oben Gesagten habe ich meinen zentralen Fehler erkannt - ich habe nicht ganz erkannt, dass die übergebenen Argumente ein mehrdimensionales Array sind.

Im Moment habe ich die Funktion folgendermaßen neu implementiert:

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

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

Ich mag die verschiedenen Antworten von phpmailer, aber es scheint ein bisschen sauberer zu sein, Dinge mit den integrierten Funktionen von WordPress zu tun.

David E. Smith
quelle
6

Hier ist eine Alternative, die direkt die AddCustomHeaderMethode der PHPMailerInstanz 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 verwenden:

Beispiel 1:

Hier übergeben wir nur die Header-Informationen in der $nameEingabezeichenfolge, die durch getrennt ist:

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

Beispiel 2:

Hier sind beide $nameund $valuenicht leer:

add_action( 'phpmailer_init', function( $phpmailer )
{   
    $phpmailer->AddCustomHeader( 
       'X-WU-Site', parse_url( get_site_url(), PHP_URL_HOST ) 
    );  
} );
Birgire
quelle
Schön, diese Antwort zu kennen :) Aber ich bin gespannt, welchen Effekt es hat, wenn jemand sie $args['headers'] = 'key: value'über WP-Filter einstellt ?
Sumit
Der phpmailer_initHook wird später ausgelöst, als wenn der wp_mailFilter angewendet wird, und die benutzerdefinierten Header dieses Filters werden meines Wissens auch über die AddCustomHeader()Methode hinzugefügt . @sumit
Birgire
3

PHP headerssind Strings. Sie können sie nicht als Array analysieren. Sie müssen Ihren zusätzlichen Header als Zeichenfolge hinzufügen \r\n, 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;
}

Bitte beachten Sie auch, dass Sie endlich zusätzliche Header mit Priorität hinzufügen, 99damit kein anderes Plugin diese ersetzen kann, wenn nicht überprüft wird, ob bereits Header vorhanden sind. Wenn nötig, mach es 999.

Sumit
quelle
1
Ich habe die Quelle von wp_mail () durchgesehen und es soll anscheinend in der Lage sein, Header entweder als Arrays oder als große Textblöcke zu akzeptieren, und vielleicht vermischen sich die beiden manchmal miteinander. Ich würde nicht empfehlen, dies allgemein zu tun, aber es ist immer eine Option.
David E. Smith
@ DavidE.Smith ist richtig. wp_mailakzeptiert ein Array für das Header-Argument und WP kümmert sich um das Hinzufügen von \ r \ n
Jan Beck
Bitte beachten Sie, ich habe PHP headersnicht erwähnt , was zu wp_mailakzeptieren. Endlich sind Header Strings. Was wp_mailakzeptiert, war nicht die Frage! @ JanBeck
Sumit
1
Ja, das war die Frage. Warum rufen Sie PHP-Header auf?
Jan Beck