送信メールにヘッダーを追加する方法は?


8

サイトの送信メールにヘッダーを追加したいので、特定のメールを送信したサイトを簡単に特定できます。(私はすべてのサイトに標準機能プラグインを配置しているので、これは簡単に実行できます。メールヘッダーをフィルターに設定し、このヘッダーを操作するように構成すると、時間を大幅に節約できます。)

これはwp_mail関数にプラグインするという単純な問題だと思っていましたが、明らかにそうではありません。

まず、私はこれを試しました:

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

ここで、私の配列はメール設定を変更した他のもの(たとえば、Gravity Forms)よりも優先されたため、HTMLメールは裸のHTMLとして表示され、適切にフォーマットされませんでした。GFが追加したContent-type:ヘッダーがスクラブされているため、理にかなっています。しかし、私のヘッダーはメールに追加されました。他の人もかなりのメールを受信することに依存しているため(私のサイトのすべてのコンテンツ開発者とエンドユーザー、とりわけ私は確信しています)、それは受け入れられません。

次に、私の同僚の1人が、wp_parse_args()を使用して自分のものをルーティングすることを提案しました。

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

これで、私の機能が存在しないかのように見えます-私のヘッダーは追加されませんが、他のヘッダーもメール設定も削除されません。

存在する可能性のある他のフィルターをスクランブルすることなく、送信メールにヘッダーを追加する正しい方法は何ですか?



そのプラグインは実際には問題に対処していません。WordPressによって生成されたメールの本文に「ヘッダー」を追加します。SMTPヘッダーを追加しようとしましたが、これはまったく別のものです。
David E. Smith

回答:


7

上記のおかげで、私は自分の中心的な間違いに気づきました。渡された引数が多次元配列であることを私はまったく理解していませんでした。

今のところ、このように関数を再実装しました:

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

wp_mail()ソースを読んだ(https://core.trac.wordpress.org/browser/tags/4.4.2/src/wp-includes/pluggable.php#L235を参照)と、ヘッダーがコンポーネントは、配列、大きな文字列、または恐らく2つの恐ろしいミッシュマッシュにすることができますが、配列を使用する方がおそらくより安全で正しいオプションです。

私はさまざまなphpmailerの回答が好きですが、WordPressのビルトインを使用して何かをしようとするのは少しすっきりしているように見えます。


6

インスタンスのAddCustomHeaderメソッドを直接使用する別の方法を次に示し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);
    }
}

ここでは、2つの使用方法があることがわかります。

例1:

ここでは、ヘッダー$name文字列のみを入力文字列で渡します。:

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

例2:

空と空の両方が$nameあり$valueます:

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

この答えを知ってよかったです:)しかし、誰かが$args['headers'] = 'key: value'WPフィルターを介して設定した場合にどのような影響があるのか​​知りたいです。
Sumit 2016年

phpmailer_initフック火災後の場合よりもwp_mailフィルタが適用され、そのフィルタからカスタムヘッダーをも介して追加されているAddCustomHeader()限り、私はそれを理解するように、方法。@sumit
バージィ

3

PHP headersは文字列です。それらを配列として解析することはできません。\r\n次の行に追加されるようにするには、追加のヘッダーを文字列として追加する必要があります。

例:

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

また、最後に追加のヘッダーを優先的に追加することに注意してください99。ヘッダーがすでに存在することを確認していない場合、他のプラグインはそれを置き換えることができません。必要な場合はそれを作ります999


1
私はwp_mail()のソースを掘り下げました、そしてそれはどうやら配列または大きなテキストのチャンクのいずれかとしてヘッダーを受け入れることができると思われます、そしておそらく2つは一緒に混合されます。それを一般的に行うことは勧めませんが、それは常にオプションです。
David E. Smith

@ DavidE.Smithは正しいです。wp_mailヘッダー引数の配列を受け入れ、WPが\ r \ nの追加を処理します
Jan Beck

私が受け入れるPHP headersものでwp_mailはないことに言及したこと注意してください。最後にヘッダーは文字列です。何んwp_mail受け入れることは問題ではありませんでした!@JanBeck
Sumit

1
はい、それが問題でした。なぜPHPヘッダーを表示するのですか?
Jan Beck
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.