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.