急に、CGI から送信していたメールが、Gmail に届かなくなった。
maillog を確認すると、
550-5.7.26 This mail is unauthenticated, which poses a security risk to the550-5.7.26 sender and Gmail users, and has been blocked. The sender must550-5.7.26 authenticate with at least one of SPF or DKIM. For this message,550-5.7.26 DKIM checks did not pass and SPF check for [www.exsample.co.jp] did550-5.7.26 not pass with ip: [210.XXX.XXX.XXX]. The sender should visit550-5.7.26 https://support.google.com/mail/answer/81126#authentication for550 5.7.26 instructions on setting up authentication.
ああ、定番の 550 エラー・・・
www.exsample.co.jp ドメインの SPF レコードに、送信元サーバの IP 210.XXX.XXX.XXX が登録されていないので、怪しいからメールは受け取らんよ・・・という Gmail のエラー。
最近、セキュリティ対策でサーバ構成が変わって、www.exsample.co.jp が別のサーバの CNAME になったので(お客さんのサーバなので、俺の権限ではどうしようもない)、www.exsample.co.jp の TXT レコードが書けんのよね。なので、その中に SPF レコードも書けず・・・
ちなみに、example.co.jp の SPF レコードは存在する。
# nslookup -q=TXT exsample.co.jp
と引いてみると、
exsample.co.jp text = "v=spf1 ip4:202.XXX.XXX.XXX ip4:163.XXX.XXX.XXX ip4:210.XXX.XXX.XXX include:spf.securemx.jp ~all"
と返ってくる。
エンベロープ From を admin@www.exsample.co.jp から admin@exsample.co.jp に変えてやればいいというわけだ。
CGI の中では、
$mail_data = <<EOM;From: admin@exsample.co.jpTo: hogehoge@gmail.comSubject: TEST MAILMIME-Version: 1.0Content-type: text/plain; charset=ISO-2022-JPContent-Transfer-Encoding: 7bitX-Mailer: CGI-Scripttest death.EOMif (!open (MAIL,"| sendmail -t")) {print "Error : Mail Send\n";}print MAIL $mail_data;close(MAIL);
のように sendmail でメール送信をしている。
ここで、sendmail の引数に -f を追加してやれば、エンベロープ From を書き換えることができる。
具体的には、↓こう。
if (!open (MAIL,"| sendmail -t -f admin@exsample.co.jp")) {print "Error : Mail Send\n";}
これで、エンベロープ From には admin@exsample.co.jp がセットされ、Gmail は example.co.jp の SPF レコードを参照し、万事解決である(笑)