wake-up-neo.com

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

Ich möchte ausgehenden E-Mails auf meinen Websites einen zusätzlichen Header hinzufügen, damit ich leicht feststellen kann, von welcher Website eine bestimmte E-Mail gesendet wurde. (Ich habe auf allen meinen Websites ein Standardfunktionalitäts-Plug-in installiert, dies ist also einfach genug, und die Konfiguration meines E-Mail-Clients zum Filtern und anderen Eingriffen in diesen Header wäre eine erstaunliche Zeitersparnis.)

Ich dachte, das wäre eine einfache Sache, sich in die Funktion wp_mail einzufügen, aber das ist es offensichtlich 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));
}

In diesem Fall hatte mein Array Vorrang vor allen anderen Elementen, die die E-Mail-Einstellungen (z. B. Gravity Forms) geändert haben, sodass HTML-E-Mails als unformatiertes HTML angezeigt wurden und nicht gut formatiert waren. Sinnvoll, da der von GF hinzugefügte Content-Type: -Header gesäubert wurde. Aber mein Header wurde der E-Mail hinzugefügt. Da andere auch darauf angewiesen sind, hübsche E-Mails zu erhalten (ich bin mir sicher, alle Inhaltsentwickler und Endbenutzer meiner Websites), ist dies nicht akzeptabel.

Einer meiner Kollegen schlug dann vor, meine Daten über wp_parse_args () weiterzuleiten.

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.

Wie können Sie einer ausgehenden E-Mail einen Header hinzufügen, ohne andere möglicherweise vorhandene Filter zu verschlüsseln?

8
David E. Smith

Dank dem oben Gesagten habe ich meinen zentralen Fehler erkannt - ich wusste nicht so recht, dass die Argumente, die übergeben wurden, ein mehrdimensionales Array waren.

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;               
}

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

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

7
David E. Smith

Hier ist eine Alternative, die direkt die Methode AddCustomHeader der Instanz PHPMailer 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 sehen wir, dass es zwei Möglichkeiten gibt, es zu benutzen:

Beispiel 1:

Hier übergeben wir nur die Header-Informationen in der Eingabezeichenfolge $name, 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 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 ) 
    );  
} );
6
birgire

PHP headers sind Strings. Sie können sie nicht als Array analysieren. Sie müssen Ihren 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 auch, dass Sie endlich zusätzliche Header mit der Priorität 99 hinzufügen, damit kein anderes Plugin diese ersetzen kann, wenn nicht überprüft wird, ob bereits Header vorhanden sind. Bei Bedarf 999 eingeben.

3
Sumit