Manul Tech

wp_mail関数でちゃんとメールを送信する方法

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を付けたアドレスを指定してあげればいいらしいのがわかった。

教えて!goo
phpからメールを送信しようとするとpostfixが配信に失敗する?

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

コメント0