フリーメールで登録できないようにしたい、という要望に答えるためにfreemailというgemを使いました。

smudge/freemail
A ruby implementation of the npm 'freemail' database of free and disposable email domains. - smudge/freemail

このgemはフリーメールのリストを管理していて、該当するかメールアドレスかどうかを判定してくれます。ある程度のリストが最初からあって自分で用意する必要がないというのが良いところです。

使い方は簡単で、

require 'freemail'

Freemail.free?('hogehogehoge@gmail.com')
# => true

みたいな使い方をします。free?のほかにdisposable?という使い捨てアドレスの判定もできます。が、用途としてはちゃんとしたアドレスであるかどうかを知りたいことが多いはずなので、free_or_disposable?を使うのが良いかと思われます。

require 'freemail'

Freemail.free_or_disposable?('hogehogehoge@gmail.com')
# => true

さて、このgemのリストには日本国内のフリーメールなんかは入っていません。とはいえいちいち除外したいドメインをメインのリストに追加してもらうようにプルリクしたりフォークしたりするのはイマイチだなと思い、対象のフリーメールを追加できるようなAPIを用意してプルリクを出し、取り込んでもらいました。

(ちゃんとテスト書いてて去年の俺えらい)

これによって、free_or_disposable?の判定の前に

Freemail.add_free_domains %w(
yahoo.co.jp
outlook.jp
hotmail.co.jp
live.jp
excite.co.jp
)

みたいなことをしておけば、国内のフリーメールも除外対象にできるというわけです。これを使っているRailsアプリケーションでは、initializerでこの追加処理を書いています。