sai’s diary

プログラミング関連の備忘録とつぶやきを書いています。

Ruby on Rails - メールアドレスの取り扱いについての疑問。

Ruby on Railsチュートリアル6.2.5一意性を検証するで紹介されていたテクニックで、メールアドレスをDBに登録する際にDB登録前のコールバック処理でメールアドレスをすべて小文字にする処理が紹介されていましたが、ローカルパート(@より前の部分)まで小文字にしても大丈夫だろうかと気になり、調べてみました。

RFC5321の2.4章を見るとメールボックス(=メールアドレスと解釈しています)のローカルパートに関しては大文字小文字を区別する記載(The local-part of a mailbox MUST BE treated as case sensitive.)がありましたが、直後に大文字・小文字を区別するのは推奨しない(However, exploiting the case sensitivity of mailbox local-parts impedes interoperability and is discouraged. Mailbox domains follow normal DNS rules and are hence not case sensitive.)という記載も見受けられました。

尚、ドメイン(@より後の部分)に関しては大文字、小文字を区別しない旨が書かれていました。 (Mailbox domains follow normal DNS rules and are hence not case sensitive.)

RFC5321
RFC5321(日本語訳)((株)HDE様に感謝)

RFC5322 の3.4.1章にも書式(mailbox,addr-spec)の規格がありましたが、最終的にはRFC5321を参照する形に読めました。

上記から厳密にはローカルパートの小文字化は問題があると考えましたが、Ruby on Rails チュートリアルに書かれている問題を試せていないので宿題にします。

仮にDBのアダプタがメールアドレスの大文字・小文字を区別することを問題としているなら、ドメイン部だけ小文字化すれば良いですが、そうでないならせめてユーザ登録した際の確認メールを送付する際に小文字化したメールアドレスで送付すれば意図しないメールアドレスでユーザ登録が完了してしまったなんていう事態は回避出来るのではと思います。

Ruby on Rails チュートリアルの一部抜粋:

残念なことに、メールアドレスの一意性を保証するためには、もう1つやらなければならないことがあります。それは、メールアドレスをデータベースに保存する前にすべての文字を小文字に変換することです。その理由は、データベースのアダプタが常に大文字小文字を区別するインデックスを使っているとは限らないからです16。

16.
著者のシステム上のSQLiteとHeroku上のPostgreSQLで直接実験してみたところ、この手順は実際に必要であることがわかりました。

補足: ドメイン名に関する規定はRFC1035の2.3.1章にあります。

RFC1035
RFC1035(日本語訳)(Ishida So様に感謝)