Manul Tech

WordPressのwp_mail関数は文字化けもなく(たぶん)、簡単にメールを送信できる便利なやつだけど、一部の受信メールサーバーには届いていないことが最近わかったから、その解決方法。


「届いてないよ」と言われて

一部の人にメール届いてないよと言われて、どうせメールの受信設定がおかしいか迷惑メール扱いになってんだろと思ってたんだけど、念の為にpostfixのログを見てみたら、ホントに届いていなかった。疑ってごめんね。

status=bounced (host ◯◯◯.sakura.ne.jp[△△△.△△.△△△.△△△] said: 553 5.1.8 <□□□@localhost.localdomain>… Domain of sender address □□□@localhost.localdomain does not exist (in reply to MAIL FROM command))

宛先はさくらインターネットのメールサーバーだったんだけど、「localhost.localdomain」なんてドメインねぇじゃん、受け取れるわけねぇじゃん、って事だよね。Gmail宛には届いてるからサーバによってここの部分は緩かったりするのね、初めて知った。

どうやってsender addressを変更すんの

ググったら、PHPのmail関数では第5引数に、頭に「-f」を付けたアドレスを指定してあげればいいらしいのがわかった。

でもさー、mail関数だと環境によっては文字化けとかするよねー確かー嫌だなーwp_mailで何とかなんないのー。

なりました

でもwp_mail関数自体にはmail関数でいうところの第5引数にあたる引数はない。ググっても情報が出てこないからwp_mail関数のソースを追ってみた。内部ではphpMailerを利用してたのね。で、phpMailerのソースを追ってみたら「Sender」ってメンバ変数にアドレスを設定すればいいみたい。publicだから直接アクセスもできるっぽい。
でも直接ソースをいじるのはなーって思いながら読み進めてくと最後の方にありました。

do_action_ref_array( 'phpmailer_init', array( &$phpmailer ) );

まるっとphpMailerのインスタンスを引数に突っ込んであるから、これを使用して

add_action('phpmailer_init', 'add_mail_sender');
function add_mail_sender($phpmailer){
	$phpmailer->Sender = 'xxx@example.com';
	
	return $phpmailer;
}

これでオッケ。最後のreturnはいらないかも。いや、試してないから分かんないけど。
これでめでたくwp_mail関数でsenderの設定ができて、さくらインターネットのサーバにも受け入れられるようになったよ。