«前の日記(2012年6月2日(土)) 最新 次の日記(2012年6月10日(日))» 編集

徒然日記


2012年6月7日(木) [長年日記]

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なんて使いませんか、そうですか…

emptdiaryとヒアドキュメントと

emptdiaryってなんのことかわかる人も、tdiary界隈でももう少ないんじゃないかと思いますが

プラグインの引数に空行をとれるtdiaryスタイル派生のスタイルですね。

codeを<pre>で貼っつけるときに便利。

で、上の日記を書くときにコメントを赤字にしたいなー。と思ったのですよ。

でも、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"とだけ表示される!

falseだけ!

えー…とおもい、改めてヒアドキュメントのリファレンスマニュアルを参照。

そしたら、複数のヒアドキュメントに関する、記述を発見

一行に複数のヒアドキュメントを書くこともできます。

print <<FIRST, <<SECOND
これは一つめのヒアドキュメントです。
まだ一つめです。
FIRST
この行からは二つめのヒアドキュメントです。
この行で終わります。
SECOND

む、これか!?と思って、開始文字列の直後に第二引数を置いたらうまく行った

<%=pre <<EOS, false
hogehoge
fugafuga
EOS
%>

わかってしまえば、なるほどね。と思えるけど、何も知らないとうーん、なんでだーと悩むことしきりであったとさ

Tags: tdiary



«前の日記(2012年6月2日(土)) 最新 次の日記(2012年6月10日(日))»