メールアドレスのドメイン誤入力を防ぎたい
誤入力の実例と対策案
イワモトです。最近は、ベルトラのメール送信に関する課題の解決に取り組んでいます。課題のひとつがメールアドレス誤入力による送信エラーです。そのうちドメイン部の誤入力は、入力チェックで減らせそうだと思っています。誤入力の実例を示すとともに、対策を検討してみましょう。
ドメイン誤入力の実例
下記は、誤入力と推測されるドメインの一覧です。送信エラーログに含まれるドメインのうち、DNSレコードが引けず(詳細は後述)、主要なフリーメール・キャリアメールのドメインに類似しているものを機械的に抽出しました。
類似度の計算に使ったのは、PHPの similar_text
関数です。この関数は、2つの文字列の類似度をパーセンテージで計算してくれます。結果が100なら完全一致です。
前掲の一覧は、類似度の計算結果が80以上となったもののみに絞り込んでいます。gmale.com
と me.com
のように微妙なペアも含まれていますが、閾値をあまり高くすると拾うべきものが拾えなくなってしまうため、ほどよい辺りに設定したつもりです。
対策の検討方針
これらの誤入力は、メール送信より前、具体的にはユーザが自身のメールアドレスをフォームに入力した時点でチェックし、フィードバックするのが妥当でしょう。見逃してしまうと、いつまでたってもメールが届かず、ユーザの方に迷惑をかけることになるためです。
そこで検討すべきは、どのようなチェック規則を設け、どのようなフィードバックを送るかということになります。
チェック規則の案
まず、チェック規則については、さきほど少し触れたように、DNSレコードが引けなければ誤入力の可能性が高いとみなすのが適当ではないかと考えます。具体的には、下記すべてが引けない場合です。
- MXレコード
- Aレコード
- AAAAレコード
- CNAMEレコード
ぼくの理解に誤りがなければ、SMTPクライアントは、これらのレコードを検索して配送先ホストを決定しています。検索できなければ送りようがなく、誤入力が疑われます。
ただし、DNS設定ミスやサーバダウンなどが原因で検索できなくなっていることもありえます。「誤入力の可能性が高い」とみなすにとどめておくことが肝心です。
PHPでのチェック例
ちなみに、このチェック規則をPHPで実装するなら、checkdnsrr
関数が利用できます。下記は実装例です。
フィードバックの案
さて、「誤入力の可能性が高い」と疑われるときに、そのことをユーザにどのようにフィードバックすべきでしょうか。ぼくが考えたのは下記の案です。
- 主要なフリーメール・キャリアメールのドメインに類似している場合、正しいと推測されるドメインをサジェストする
- 類似していない場合、誤入力の可能性があることを伝える
類似度の計算方法は前述の通りです。たとえば hoge@i-softbank.ne.jp
が入力されたら、hoge@softbank.ne.jp
や hoge@i.softbank.ne.jp
がサジェスト候補となります。
サジェスト候補が存在しないときは、誤入力の可能性があることだけ伝えれば充分でしょう。正しいドメインはユーザ自身が知っているはずだからです。
繰り返しになりますが、あくまで「誤入力の可能性が高い」だけなので、そのようなメールアドレスの登録自体は許容すべきです。念のため見直してもらうだけにとどめましょう。
まとめ
というわけで、今回の記事では、ドメイン誤入力の実例を示し、対策を検討しました。そのまま実装を進めるかどうかは未定ですが、まずは考えを整理した次第です。何らかの対策ができた暁には、その効果をご紹介できればと思っています。