Come aggiungere intestazioni alla posta elettronica in uscita?


8

Voglio aggiungere un'intestazione aggiuntiva alle e-mail in uscita sui miei siti, in modo da poter determinare facilmente quale sito ha inviato una determinata e-mail. (Ho messo un plug-in di funzionalità standard su tutti i miei siti, quindi questo è abbastanza facile da fare e configurare il mio client di posta elettronica per filtrare e altrimenti agire su questa intestazione sarebbe un fantastico risparmio di tempo.)

Ho pensato che sarebbe stata una semplice questione di collegarsi alla wp_mailfunzione, ma evidentemente non lo è.

Innanzitutto, ho provato questo:

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

Qui, il mio array ha avuto la precedenza su qualsiasi altra cosa che ha modificato le impostazioni di posta (diciamo Gravity Forms), quindi le e-mail HTML hanno iniziato a comparire come HTML nudo e non ben formattate. Ha senso, poiché l'intestazione Content-type: GF aggiunta è stata cancellata. Ma la mia intestazione è stata aggiunta all'email. Dal momento che altri dipendono anche dalla ricezione di belle e-mail (tutti gli sviluppatori di contenuti e gli utenti finali dei miei siti, tra l'altro ne sono certo), ciò non è accettabile.

Uno dei miei colleghi ha quindi suggerito di instradare le mie cose attraverso wp_parse_args (), quindi:

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

Detto questo, è come se la mia funzione non esistesse: la mia intestazione non viene aggiunta, ma nemmeno le intestazioni e le impostazioni di posta degli altri vengono rimosse.

Qual è il modo corretto di aggiungere un'intestazione a un'e-mail in uscita, senza rimescolare altri filtri che potrebbero esistere?


Se desideri una soluzione semplice, utilizza il plug
— Pluger

Quel plugin in realtà non risolve il problema. Aggiunge una "intestazione" al corpo delle e-mail generate da WordPress; Stavo cercando di aggiungere un'intestazione SMTP, che è una cosa completamente diversa.
— David E. Smith,

Risposte:


7

Grazie a quanto sopra, mi sono reso conto del mio errore centrale: non mi ero reso conto del tutto che gli argomenti passati erano una matrice multidimensionale.

Per ora, ho implementato di nuovo la funzione in questo modo:

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

La mia lettura della fonte wp_mail () (vedi: https://core.trac.wordpress.org/browser/tags/4.4.2/src/wp-includes/pluggable.php#L235 ) mi porta a credere che le intestazioni Il componente può essere un array, o una stringa di grandi dimensioni, o forse qualche orribile miscuglio dei due, ma che l'utilizzo di un array è probabilmente l'opzione più sicura / più corretta.

Mi piacciono le varie risposte di phpmailer, ma sembra solo un po 'più pulito provare a fare le cose usando i built-in di WordPress.


6

Ecco un'alternativa che utilizza direttamente il AddCustomHeadermetodo PHPMailerdell'istanza:

/**
 * 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);
    }
}

Qui possiamo vedere che ci sono due modi per usarlo:

Esempio 1:

Qui passiamo solo le informazioni dell'intestazione nella $namestringa di input, separate da:

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

Esempio n. 2:

Qui ci sono entrambi $namee $valuenon vuoti:

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

Bello sapere questa risposta :) Ma sono curioso di sapere quale effetto avrà se qualcuno lo imposta $args['headers'] = 'key: value'tramite i filtri WP?
— Sumit

L' phpmailer_inithook si attiva più tardi rispetto a quando wp_mailviene applicato il filtro e anche le intestazioni personalizzate di quel filtro vengono aggiunte attraverso il AddCustomHeader()metodo, per quanto ne capisco. @sumit
— birgire

3

PHP headerssono stringhe. Non è possibile analizzarli come array. Devi aggiungere un'intestazione aggiuntiva come stringa con \r\nper assicurarti che sia aggiunta nella riga successiva.

Esempio:

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

Nota inoltre di aggiungere infine le intestazioni aggiuntive con priorità in 99modo che nessun altro plug-in possa sostituirlo se non verifica che le intestazioni siano già presenti. Se necessario, fallo 999.


1
Ho esaminato la fonte di wp_mail () e apparentemente dovrebbe essere in grado di accettare le intestazioni come matrici o come grossi pezzi di testo, e forse a volte i due si sono mescolati insieme. Non consiglierei di farlo in generale, ma è sempre un'opzione.
— David E. Smith,

@ DavidE.Smith è corretto. wp_mailaccetta un array per l'argomento header e WP si occuperà di aggiungere \ r \ n
— Jan Beck

Si prega di notare che non ho menzionato PHP headersciò che wp_mailaccetta. Alla fine le intestazioni sono stringhe. Ciò che wp_mailaccetta non era la domanda! @JanBeck
— Sumit

1
Sì, questa era la domanda. Perché visualizzi le intestazioni PHP?
— Jan Beck,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.