読者です 読者をやめる 読者になる 読者になる

大量のメールアドレスを発行可能なウェブサービスを作ってみた

Boids Mail

使ってみてくれるとありがたいけど、明日サービス中止から全メール流出まで何が起こるか分かりません。

f:id:kusano_k:20141230190118p:plain:w480

作ろうと思った経緯とこのサービスの使い道

迷惑メールがうざい。

インターネットができた当初の牧歌的な時代ならともかく、私のアドレスを知っているだけで世界中の誰もが私にメッセージを送れる、電子メールというシステムが時代遅れなのだと思う。TwitterのDMやLINEなどたいていのコミュニケーションツールは受信を許可した相手しかメッセージは送れないし、後から許可を取り消すことができる。とはいえ、これらの新しいコミュニケーションツールは公開されたプロトコルではなく、どこかの会社のサービスなので、限られた人とのやり取りには使えても、ウェブサービスに登録するときなどはあと10年は電子メールを使い続ける必要がありそう。

Gmailでは、(元のアドレス)+(任意の文字列)@gmail.comという形式でメールアドレスを増やせるけれど、元のアドレスがバレバレだし、+が登録できないサイトも多い。元のアドレスと無関係なエイリアスを発行できるサービスは発行できる個数が少なく、登録するサイトごとに別のメールアドレスを使うということはできない。

Gmail のエイリアスは個人情報漏洩対策にならないからやめとけっていう話 | WWW WATCH

Gmailで何とかしようと思うと、登録するサービスごとに元のアドレスに付加する文字列を決めて、それらのアドレス宛の場合は通し、それ以外のアドレスに届いたメールを捨てる必要があって、ちょっと面倒。

ということで、ワンクリックで大量にエイリアスを発行できるサービスがあれば便利なのではと思って、作ってみた。

技術的な詳細

postfixSMTPサーバー)とdovecot(POPサーバー)にデータベースからアカウントを引く機能があったので、それを使っている。あとはPlay Frameworkによるフロントエンドがそのデータベースを弄っているだけ。

postfix

main.cf

queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix

mail_owner = postfix

myhostname = boids.info
mydomain = boids.info

inet_interfaces = all
inet_protocols = all
mydestination =

home_mailbox = Maildir/

debug_peer_level = 2
debugger_command =
         PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
         ddd $daemon_directory/$process_name $process_id & sleep 5

virtual_mailbox_domains = boids.info
virtual_mailbox_base = /var/mail/vhosts
virtual_mailbox_maps = mysql:/etc/postfix/mailbox_map.cf
virtual_minimum_uid = 10000
virtual_uid_maps = static:10000
virtual_gid_maps = static:10000
virtual_mailbox_limit_maps = static:100000000
virtual_mailbox_limit_inbox = no
virtual_mailbox_limit_override = yes
virtual_maildir_extended = yes
virtual_overquota_bounce = yes
virtual_maildir_limit_message = "User over quota, try again"
virtual_trash_count = yes
virtual_trash_name = ".Trash"
message_size_limit = 10000000

mailbox_map.cf

user = postfix
password = xxxxxxxxxxxxxxxx
dbname = boids
query = SELECT concat(mailbox, '/') FROM user INNER JOIN address ON user.id=address.user WHERE concat(address.address, '@boids.info')='%s' and address.active!=0

%sにメールアドレスが入った状態でデータベースを引いて、メールを格納するディレクトリが出てくれば良い。Maildirでメールボックスのサイズを制限するにはパッチを当てる必要があって、ちょっと面倒だった。

[CentOS6] Postfixによるメールサーバ構築 その1 (PostfixをSRPMからリビルド) | CentOSサーバ構築術 文具堂

dovecot

dovecot.conf

protocols = pop3
disable_plaintext_auth = no
ssl = yes
ssl_cert = </etc/ssl/certs/boids.info.pem
ssl_key = </etc/ssl/certs/boids.info.pem
mail_location = maildir:%h
auth_mechanisms = plain apop cram-md5
passdb {
  driver = sql
  args = /etc/dovecot/sql.conf.ext
}
userdb {
  driver = prefetch
}

sql.conf.ext

driver = mysql
connect = host=localhost dbname=boids user=dovecot password=xxxxxxxxxxxxxxxx
password_query = SELECT \
    concat('{PLAIN}', pop_password) as password, \
    concat('/var/spool/mail/vhosts/', mailbox) as userdb_home, \
    'vuser' as userdb_uid, \
    'vuser' as userdb_gid \
    FROM user WHERE pop_id = '%u' and active!=0

%uにユーザー名が入った状態でデータベースを引いて、password, home, uid, gidが出てくれば良い。userdbでdriver = prefetchとするとパスワードとユーザー情報の問い合わせがまとめられて1回になるらしい。その場合、home, uid, gidにuserdb_を付ける必要がある。嵌まった。

サーバーもドメインも他と一緒にしないで、別に買った。金額は全部税込み。

サーバー 11,664円/年

+初期費用が1,620円。さくらのVPS 1G。1年分まとめて払えばちょっと安くなるけど、1年も続けるか分からないので、月払いにしている。

ドメイン 1,080円/年

VALUE DOMAIN、上位レジストラはKeySystems、.info。

証明書 1,300円/年

どうせなので、HTTPSにして、POPもTLSを使えるようにした。SSLストアRapidSSLを買った。

ロゴの後ろの鳥の写真 0円

pixabayというサイトで探した。ありがとうございます。shutterstockの有料の画像が広告として出てくるので注意。

まとめ

Gmailにこの機能が付いてくれ(人∀・)タノム

追記

捨てアドブラックリストに入れられちゃうオチなんだよなあ

http://b.hatena.ne.jp/enkunkun/20141230#bookmark-237680291

なるほど……。

同じサービスがすでにあると教えてもらった(´・ω・`) POPでの受信こそできないけどアプリがあるから困らなそうだし、メールの送信もできる。

https://m.kuku.lu/

追記2

自分ですら使わなかったので閉鎖した。本当はメインのメールアドレスとして使いたかったけど、も数年間維持できるか分からないし、そうなると捨てアドくらいにしか使えない。

ソースコードhttps://github.com/kusano/boids