Bagaimana cara menambahkan header ke email keluar?

8

Saya ingin menambahkan header tambahan ke email keluar di situs saya, jadi saya dapat dengan mudah menentukan situs mana yang mengirim email yang diberikan. (Saya meletakkan plugin fungsionalitas standar di semua situs saya, jadi ini cukup mudah untuk dilakukan, dan mengonfigurasi klien email saya untuk difilter dan jika tidak bertindak pada tajuk ini akan menghemat waktu yang luar biasa.)

Saya pikir ini akan menjadi masalah sederhana memasukkan ke dalam wp_mailfungsi, tetapi ternyata tidak.

Pertama, saya mencoba ini:

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

Di sini, array saya lebih diutamakan daripada yang lain yang mengubah pengaturan email (katakanlah, Gravity Forms), jadi email HTML mulai muncul sebagai HTML kosong dan tidak diformat dengan baik. Masuk akal, karena header Tipe-konten: yang ditambahkan GF dihapus. Tetapi tajuk saya ditambahkan ke email. Karena yang lain juga bergantung pada penerimaan email yang bagus (semua pengembang konten dan pengguna akhir situs saya, antara lain saya yakin), itu tidak dapat diterima.

Salah satu kolega saya kemudian menyarankan untuk merutekan barang-barang saya melalui wp_parse_args (), jadi:

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

Dengan itu, seolah-olah fungsi saya tidak ada - tajuk saya tidak ditambahkan, tetapi tajuk dan pengaturan surat lainnya juga tidak dicopot.

Apa cara yang benar untuk menambahkan header ke email keluar, tanpa mengacaukan filter lain yang mungkin ada?

David E. Smith
sumber
Jika Anda ingin solusi sederhana, silakan gunakan Plugin Header Gratis Wordpress Email Gratis
Prashant Baldha
Plugin itu sebenarnya tidak mengatasi masalah. Itu menambahkan "header" ke badan email yang dihasilkan oleh WordPress; Saya mencoba menambahkan header SMTP, yang merupakan hal yang sama sekali berbeda.
David E. Smith

Jawaban:

7

Berkat hal di atas, saya menyadari kesalahan sentral saya - saya tidak begitu menyadari bahwa argumen yang diajukan adalah array multi-dimensi.

Untuk saat ini, saya telah mengimplementasikan kembali fungsi sebagai berikut:

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

Saya membaca sumber wp_mail () (lihat: https://core.trac.wordpress.org/browser/tags/4.4.2/src/wp-includes/pluggable.php#L235 ) membuat saya percaya bahwa header tersebut komponen bisa berupa array, atau string besar, atau mungkin mish-mash yang mengerikan dari keduanya, tetapi menggunakan array mungkin merupakan opsi yang lebih aman / lebih benar.

Saya memang suka berbagai jawaban phpmailer, tetapi sepertinya sedikit lebih bersih untuk mencoba melakukan hal-hal menggunakan built-in WordPress.

David E. Smith
sumber
6

Berikut ini adalah alternatif menggunakan langsung AddCustomHeadermetode PHPMailerinstance:

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

Di sini kita dapat melihat bahwa ada dua cara untuk menggunakannya:

Contoh 1:

Di sini kita hanya meneruskan informasi header di $namestring input, yang dipisahkan dengan:

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

Contoh # 2:

Ini keduanya $namedan $valuetidak kosong:

add_action( 'phpmailer_init', function( $phpmailer )
{   
    $phpmailer->AddCustomHeader( 
       'X-WU-Site', parse_url( get_site_url(), PHP_URL_HOST ) 
    );  
} );
birgire
sumber
Senang mengetahui jawaban ini :) Tapi saya ingin tahu apa efeknya jika seseorang mengaturnya $args['headers'] = 'key: value'melalui filter WP?
Sumit
The phpmailer_initkait kebakaran lambat ketika wp_mailpenyaring diterapkan dan header kustom dari filter yang juga ditambahkan melalui AddCustomHeader()metode, sejauh yang saya mengerti. @sumit
birgire
3

PHP headersadalah string. Anda tidak dapat menguraikannya sebagai array. Anda perlu menambahkan tajuk tambahan sebagai string dengan \r\nuntuk memastikannya ditambahkan di baris berikutnya.

Contoh:

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

Harap perhatikan juga menambahkan Anda header tambahan pada akhirnya dengan prioritas 99sehingga tidak ada plugin lain yang dapat menggantikannya jika tidak memeriksa bahwa header sudah ada. Jika perlu, buatlah 999.

Sumit
sumber
1
Saya menggali melalui sumber wp_mail () dan tampaknya seharusnya dapat menerima header sebagai array, atau sebagai potongan teks besar, dan mungkin kadang-kadang keduanya dicampur bersama. Tidak akan menyarankan melakukan itu secara umum tetapi selalu merupakan pilihan.
David E. Smith
@ DavidE.Smith benar. wp_mailmenerima larik untuk argumen tajuk dan WP akan menangani penambahan \ r \ n
Jan Beck
Harap dicatat saya sebutkan PHP headersbukan yang wp_mailmenerima. Terakhir header adalah string. Apa yang wp_mailditerima bukan pertanyaannya! @ JanBeck
Sumit
1
Ya, itulah pertanyaannya. Mengapa Anda membuka header PHP?
Jan Beck