WordPress4.6から wp_mail関数の仕様が変わりました

main_wp461wp_mail
WordPress4.6から wp_mail関数の仕様が変りました。そして さらに WordPress4.6.1でちょっと変わりました。

WordPress4.6

まず、WordPress4.6に なってから wp_mail関数に 送る引数 $headers に「Reply-To」(返信先メールアドレス) が使えるようになりました。
使い方としたら wp_mailを使うコードがあれば「From」のところのように追記するだけです。

$headers  = 'From: My Name <myname@example.jp>' . "\r\n";
$headers .= 'Reply-To: Reply Name <replyname@example.jp>' . "\r\n";
 ・
 ・
wp_mail( 'test@example.org', 'subject', 'message', $headers, $attachments );

または

$headers[] = 'From: My Name <myname@example.jp>';
$headers[] = 'Reply-To: Reply Name <replyname@example.jp>';
 ・
 ・
wp_mail( 'test@example.org', 'subject', 'message', $headers, $attachments );

 



 

WordPress4.6.1

WordPress4.6.1 になって 変わったところはここです。
wp-includes/pluggable.php wp_mail()内

WordPress4.6
	$phpmailer->setFrom( $from_email, $from_name );

WordPress4.6.1
	$phpmailer->setFrom( $from_email, $from_name, false );

変わったのは「false」が追加されている所ですが、何に「false」をしているかというと、、

wp-includes/class-phpmailer.php を見ると

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . $address;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

これを見ると $auto のところに false が入りますね。
今までは $auto=true なので [Sender] にも「From」のメールアドレスが 設定されていましたが
WordPress4.6.1 からは $auto=false となるため [Sender] が空欄になってしまうという事です。
※[Sender]は 独自ドメインのメールを SPF に対応させる場合に使ったりします。

【参考】
Emails fail on certain server setups - Make WordPress Core
https://core.trac.wordpress.org/ticket/37736

 

でもやはり [Sender]に 入れたい場合は 以下のコードを my-plugin.php に張り付けてください。

/**
 * Fires after PHPMailer is initialized. 
 * @param PHPMailer &$phpmailer The PHPMailer instance, passed by reference. 
 * 
 * License: GPLv2 or later
 */
function nendebcom_initialized_mail_sender( $phpmailer ) {
	$phpmailer->Sender = 'xxxxx@example.com';	//Sender用のメールアドレス
}
add_action( 'phpmailer_init', 'nendebcom_initialized_mail_sender' );

もし WordPress4.6.1 になってから 一部の宛先へのメールが届かなくなったりしてたら、ここらへんをチェックしてもいいかもしれません。
 
 

参考

WordPress Codex 日本語版 関数リファレンス/wp mail
https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/wp_mail

WordPress Code Reference wp_mail()
https://developer.wordpress.org/reference/functions/wp_mail/