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の設定ができて、さくらインターネットのサーバにも受け入れられるようになったよ。