Como adicionar cabeçalhos a e-mails enviados?

8

Eu quero adicionar um cabeçalho adicional aos e-mails enviados em meus sites, para que eu possa determinar com facilidade qual site enviou um determinado e-mail. (Eu coloquei um plugin de funcionalidade padrão em todos os meus sites, então isso é bastante fácil de fazer, e configurar meu cliente de e-mail para filtrar e agir nesse cabeçalho seria uma incrível economia de tempo.)

Eu pensei que isso seria uma simples questão de se conectar à função wp_mail , mas evidentemente não é.

Primeiro, tentei isso:

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

Aqui, minha matriz teve precedência sobre qualquer outra coisa que modificasse as configurações de e-mail (digamos, Gravity Forms), portanto os e-mails HTML começaram a aparecer como HTML simples e não muito bem formatados. Faz sentido, já que o cabeçalho Content-type: que o GF adicionou foi apagado. Mas meu cabeçalho foi adicionado ao email. Como os outros também dependem de receber e-mails bonitos (todos os desenvolvedores de conteúdo e usuários finais de meus sites, entre outros, tenho certeza), isso não é aceitável.

Um dos meus colegas sugeriu o roteamento de minhas coisas através de wp_parse_args (), assim:

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

Com isso, é como se minha função não existisse - meu cabeçalho não foi adicionado, mas os cabeçalhos e as configurações de e-mail dos outros não foram removidos.

Qual é a maneira correta de adicionar um cabeçalho a um email de saída, sem embaralhar nenhum outro filtro que possa existir?

    
por David E. Smith 25.03.2016 / 17:15

3 respostas

6

Graças ao acima, eu percebi o meu erro central - eu não sabia muito bem que os argumentos sendo passados eram um array multidimensional.

Por enquanto, reimprimi a função assim:

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

Minha leitura da fonte wp_mail () (veja: ) me leva a acreditar que o componente headers pode ser um array, ou uma grande string, ou possivelmente um horrível mish-mash dos dois, mas que usar um array é provavelmente a opção mais segura / correta .

Eu gosto das várias respostas do phpmailer, mas parece um pouco mais limpo tentar fazer coisas usando os built-ins do WordPress.

    
por David E. Smith 25.03.2016 / 22:39
6

Aqui está uma alternativa usando diretamente o método AddCustomHeader da instância PHPMailer :

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

Aqui podemos ver que há duas maneiras de usá-lo:

Exemplo # 1:

Aqui, apenas passamos as informações de cabeçalho na string de entrada $name , que é separada por :

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

Exemplo # 2:

Aqui estão os dois $name e $value não vazios:

add_action( 'phpmailer_init', function( $phpmailer )
{   
    $phpmailer->AddCustomHeader( 
       'X-WU-Site', parse_url( get_site_url(), PHP_URL_HOST ) 
    );  
} );
    
por birgire 25.03.2016 / 17:51
3

PHP headers são strings. Você não pode analisá-los como array. Você precisa adicionar um cabeçalho adicional como string com \r\n para garantir que ele seja adicionado na próxima linha.

Exemplo:

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

Por favor, note também adicionar cabeçalhos adicionais com prioridade 99 para que nenhum outro plugin possa substituí-lo se não estiver verificando os cabeçalhos já presentes. Se necessário, use 999 .

    
por Sumit 25.03.2016 / 17:38