徒然日記
2012年6月7日(木) [長年日記]
■ [linux][mail][お仕事][tech] Google AppsのMTAが同一セッションだと複数ドメインのメールを受け取らなくなった件
たまには技術的な事も書いてみる。
こんなメールがあったとする。example-a.jpとexample-b.jpはともにGoogle Appsを使ってるとする。
From: postmaster@example.org To: user1@example-a.jp, user2@example-a.jp, user3@example-b.jp, user4@example-b.jp Subject: test mail multi domain test mail
これをThunderbirdとかのMUAでISPとかのsubmission用のメールサーバーに送ると、最終的にISPのMTAからGoogle AppsのMTAにメール配送をしようとする。その時、どう配送されるか。
postfixはドメインごとにまとめて1通のメール(同一SMTP transaction)として送る。つまり、上の例だとexample-a.jp宛のメールとexample-b.jp宛のメール、2通に分かれる。中身は同じだけどね。
一方、sendmailだと送信先MTAごとにメールがまとめられる。つまり、上の例では1通のメールとして送られる。
どっちも、普通は問題にならない送り方なんだけど、5月の頭くらいにGoogle Appsの挙動が変わったらしくて、後者のsendmailの送り方だと問題が出るようになったらしい。
それが、表題にも書いたとおり「同一SMTPトランザクションで別のドメインを一緒に送ろうとすると蹴られる(tempfailする)」
telnetで叩くとこんな感じ。
$ telnet alt1.aspmx.l.google.com 25 Trying 209.85.225.27... Connected to alt1.aspmx.l.google.com. Escape character is '^]'. 220 mx.google.com ESMTP v9si2111642icw.36 helo smbd.jp 250 mx.google.com at your service mail from:<postmaster@example.org> 250 2.1.0 OK v9si2111642icw.36 rcpt to:<user1@example-a.jp> 250 2.1.5 OK v9si2111642icw.36 <= エラーなし rcpt to:<user3@example-b.jp> 451-4.3.0 Multiple destination domains per transaction is unsupported. Please 451 4.3.0 try again. v9si2111642icw.36 <= エラーで蹴られてる(tempfail) data 354 Go ahead v9si2111642icw.36 test mail . 250 2.0.0 OK 1339082446 v9si2111642icw.36 <= エラーを無視してそのまま送ろうとすると、送れる quit 221 2.0.0 closing connection v9si2111642icw.36 Connection closed by foreign host.
これ、マズイと思うんだけどなー(RFC違反かはまだ調べてないんだが)。なんでこんなことしたんだろう。Google Appsの一番Internet側の受信MTAでドメイン単位で制御したいとかあったのかなー?
フォーラムもたってるんだが、どうなんすか。Googleの人は"We resolved the issue ..."とか言ってるけど、なおってねーじゃん
- http://productforums.google.com/forum/#!topic/gmail/CM4b5tTnegY
- https://productforums.google.com/forum/?fromgroups#!topic/gmail/qQ3vDWouukk
ちなみにこの件、メールが届かないとか激しく遅延するとかいう、目立った実害は無さそうな感じ。
rcptコマンドでのtempfailなので、sendmailはとりあえず、メールを送ってみて、ダメなrcptだけ次を試そうとする。
で、Google AppsのサポートページにはMXレコードには5つ受信サーバー書いてねと書いてあるので、ダメなrcpt(ドメイン)は1個ずつ滑っていく
apsmx.l.google.com => example-1.jpのメールを受け取る。他ドメイン宛はtempfail alt1.aspmx.l.google.com => example-2.jpのメールを受け取る。他ドメイン宛はtempfail alt2.aspmx.l.google.com => example-3.jpのメールを受け取る。他ドメイン宛はtempfail aspmx2.googlemail.com => example-4.jpのメールを受け取る。他ドメイン宛はtempfail apsmx3.googlemail.com => example-5.jpのメールを受け取る。他ドメイン宛はtempfail
こんなかんじで、この滑っていくのは、間を置かずに行われる。小さいメールならはじめから最後まで5秒とか10秒くらい。
なので、1通のメールに宛先が5ドメインまでなら問題には気が付きにくい。maillogを日頃からよく見てる人じゃないと気が付かないんじゃなかろうか
一方、1通のメールに宛先が6ドメイン以上含まれる場合は、一回の送信試行で送りきれずに、再送queueに落ちてしまうので次の再送が試行されるまでメールは送られない。
これは、すぐに再送されるMTAがもあるし、およそ30分間隔だったり1時間間隔だったりするMTAもあるだろうと思われるので、ケースバイケース
実害はあんまりなさそうなんだけど、激しく良くないんだけどなー。なんとかしないのかなー > Googleの人
(Googleに知り合いおらんしなー。(日本の)メール業界にも出てこないしなー)
■ ところで
smbd.jpでGoogle Apps使ってるんだけど、受信側しか使ってなくて、送信側がどうなのか全くわからんのだけど(調べてもいない)
企業とかでGoogle Apps使っているところって、送信側ってどうしてるんすかね?
Google AppsにSMART_HOSTを向けてる?送信側も同じ問題あるとしたら、結構困ったことになると思うんだけどなー
下のURLの方のフォーラムには「appmx.l.google.comからsmtp.gmail.comに変えるかだよ。最終的には別のrelayサーバーに変えたけどね」的なことが書いてあるのだけど、それってつまり、そういうことなんですかね?送信側使ってる人、困ってないのかなー。
あー。今日日sendmailなんて使いませんか、そうですか…
■ [tdiary] emptdiaryとヒアドキュメントと
emptdiaryってなんのことかわかる人も、tdiary界隈でももう少ないんじゃないかと思いますが
プラグインの引数に空行をとれるtdiaryスタイル派生のスタイルですね。
codeをで貼っつけるときに便利。
で、上の日記を書くときにコメントを赤字にしたいなー。と思ったのですよ。
でも、preプラグインだとがHTMLの実態参照に置換されてしまうー。置換されないようにしないとーと思って、pluginを見て
みたら、なんと第二引数にfalseを与えれば置換されないということを発見。初めて知った…(もしくは忘却の彼方)
よし、これはいいぞ、とおもって第二引数にfalseを指定しようとしたんだけど、はて…どう指定すればいいんだ?と結構悩んだ
ヒアドキュメントの終わりは「開始文字列と同じ文字列だけの行」なので終了文字列の後ろには書けない。↓こういうのはダメ
<%=pre <<EOS hogehoge fugafuga EOS, false %>
can't find string "EOD" anywhere before EOF
になってしまう
じゃあ、終了文字の後ろで、'%>'の前??↓こういう
<%=pre <<EOS hogehoge fugafuga EOS , false %>
これだと
syntax error, unexpected ',', expecting ')'
うーん、カンマが余計か…?
<%=pre <<EOS hogehoge fugafuga EOS false %>
とすると、なんとpreの中身が消えて"false"とだけ表示される!
えー…とおもい、改めてヒアドキュメントのリファレンスマニュアルを参照。
そしたら、複数のヒアドキュメントに関する、記述を発見
一行に複数のヒアドキュメントを書くこともできます。print <<FIRST, <<SECOND
これは一つめのヒアドキュメントです。
まだ一つめです。
FIRST
この行からは二つめのヒアドキュメントです。
この行で終わります。
SECOND
む、これか!?と思って、開始文字列の直後に第二引数を置いたらうまく行った
<%=pre <<EOS, false hogehoge fugafuga EOS %>
わかってしまえば、なるほどね。と思えるけど、何も知らないとうーん、なんでだーと悩むことしきりであったとさ