ひとこと

― 今日のひとこと ―
気付けば前回更新してから2年以上経ってた
(2023.10.25)

2016年10月28日金曜日

SMTPでレスポンス分割...?

うちの製品に、メールで情報を送信する機能がある。
つまりSMTP通信を行う機能だ。

その機能について、某大企業の担当者から問い合わせがあった。
「メールが送信できません。」

うちのユーザサポート部署のFさんが詳しくヒアリングしてくれて、
開発部にいる僕に相談しにきた。

話を聞くと、どうやらお客さんの環境はかなり特殊なようだ。
それというのも、EHLOのレスポンスをUTMが分割しているというのだ。
送ってもらったパケットキャプチャを確認してみた。

普通ならレスポンスは1度にまとめて送られてくる。
しかしそのUTMは、SMTPサーバから受け取った複数行リプライを数行ずつ
計2つのパケットに分割して送ってきていたのだ。
SMTPのレスポンスを分割するなんて、僕は聞いたことがなかった。

SMTPのレスポンスは分割され得るものなのか?
インターネットで調べてもそんな例は見当たらない。
ネットワーク系にかなり詳しい同僚も、そんなの見たことないよと言う。
(ちなみにこの同僚、某世界的大手企業から『アジアNo.1セールスエンジニア』と認定されており、同業他社からスカウトされまくる凄い人である。)
これはどうしたものだろう。



そのUTM、実は問い合わせてきたお客さんの会社の製品である。
なので訊いてみた。分割の根拠と理由。
するとこんな回答があった。

「RFCに分割手法が書いてある。」
「ウィルスチェックのためにリプライを解析しており、タイムアウトを防ぐべく分割して送っている。」



SMTPについて記述されたRFC5321なら僕は読んだことがある。
しかしレスポンス分割に関係しそうなことなんて書かれてないはずだ。
念のために改めて読んでみたが、やはりそんなことは書かれていない。
お客さんが言っているのは別のRFCなのだろうか。
だとしたらSMTP以外の規約が絡んでくるということであり、すごく面倒だな。

Fさん経由で、根拠としているRFCの番号を訊いてみた。
結果は・・・

Fさん「RFC5321だそうです。4.2章のこの部分。」

5321かよ。
そして示された部分はEHLOの複数行リプライの文法に関する記述。
要約するとこんな内容である。
「最終行以外は2XX-xxxxxxxx、最終行はハイフンをスペースに変えて2XX xxxxxxxxとせよ」
「最終行にスペースが使われてなくても対応できるようにクライアントは準備しておけ」

はい。
これは1度のリプライが複数行に及ぶ場合の文法を定義してるわけで、
どう読んでもパケット分割に対応すべしと受け取ることはできないよね。
そもそもEHLOでパケット分割を許容するならDATAコマンド風な仕様になるはずだよね。
つまり五月雨送信の終了を明示的に表す情報が必ず送られてくるべきっていう仕様。

と思ったままをFさん経由で回答すると、
お客さんは案外あっさりと納得してくれた。
なんだそりゃ。

ちなみに、分割の理由についても思うところはある。
分割されたパケットの送信間隔は1秒にも満たない。
ならば分割などという致命的なRFC違反なんかしなくても、
レスポンスはひとまずそのまま送っておいて、もし問題ありと判定したなら
以降の通信を拒否すればいいのだ。ただそれだけ。

でもこの部分、Fさんはお客さんに伝えてない。
まぁ言えないよな。言う必要ないし。



うちのその製品では、EHLOのレスポンス内容に関わらず
ユーザが指定した設定に従ってSMTPコマンドを実行する。
これもRFCに則った動作とはいえないが、色々と事情があったのだ。
その分、通常はこの動作がネックにならないように作り込んでおり、
このお客さん以外のすべてのユーザ環境で正常稼働している。

今回お客さんはStartTLSとSMTP認証を使っていた。
なので具体的には、
「EHLOの分割レスポンス2つ目をUTMが送信する前にSTARTTLSコマンドが実行されてるぞ!だからメール送信できないぞ!」
という問い合わせだったわけだ。

これについては上述の通り、お客さんは「UTMが悪いんじゃん!」と納得してくれた。
しかし・・・

「EHLOの分割レスポンス2つ目をUTMが送信する前にAUTHコマンドが実行されてるぞ!だからメール送信できないぞ!あとAUTHコマンドってなんだ!」
という問い合わせが翌日あった。もちろん同じお客さんである。

なぜだか知らないがこのお客さん、どうやら「じゃあStartTLS使わなければいいんじゃん!」と思ったらしい。

だからそもそも分割してんのが駄目なんだって!!!

それと少しは自分で調べてみてよ・・・。
「SMTP Auth」で調べたら、AUTHコマンドがSMTP認証のコマンドだってすぐわかるよ。。
コマンドレベルの細かい問い合わせしてくる割に知識がないんだよな。
ひょっとして新人なのかな・・・先輩にいわれて問い合わせてるだけの


そんなお話