$30 off During Our Annual Pro Sale. View Details »
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
メールアドレスを深堀りする
Search
Hiroto Fukui
June 20, 2019
Programming
2
1.2k
メールアドレスを深堀りする
Diving deep into the world of Email Address format
Hiroto Fukui
June 20, 2019
Tweet
Share
More Decks by Hiroto Fukui
See All by Hiroto Fukui
Deploy from slack
bary822
0
64
kiba ETLで小さく始めるデータ分析基盤構築
bary822
3
270
AR_migrationの例外.pdf
bary822
0
60
GraphQLを_Rubyで気軽に試す.pdf
bary822
0
330
Other Decks in Programming
See All in Programming
クラウドに依存しないS3を使った開発術
simesaba80
0
160
Cell-Based Architecture
larchanjo
0
140
生成AI時代を勝ち抜くエンジニア組織マネジメント
coconala_engineer
0
680
俺流レスポンシブコーディング 2025
tak_dcxi
14
9.5k
AtCoder Conference 2025「LLM時代のAHC」
imjk
2
570
Giselleで作るAI QAアシスタント 〜 Pull Requestレビューに継続的QAを
codenote
0
290
実はマルチモーダルだった。ブラウザの組み込みAI🧠でWebの未来を感じてみよう #jsfes #gemini
n0bisuke2
3
1.3k
AI前提で考えるiOSアプリのモダナイズ設計
yuukiw00w
0
190
tparseでgo testの出力を見やすくする
utgwkk
2
280
メルカリのリーダビリティチームが取り組む、AI時代のスケーラブルな品質文化
cloverrose
2
360
GoLab2025 Recap
kuro_kurorrr
0
780
モデル駆動設計をやってみようワークショップ開催報告(Modeling Forum2025) / model driven design workshop report
haru860
0
280
Featured
See All Featured
Design in an AI World
tapps
0
99
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Ethics towards AI in product and experience design
skipperchong
1
140
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
73
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1k
Product Roadmaps are Hard
iamctodd
PRO
55
12k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
51k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
400
First, design no harm
axbom
PRO
1
1.1k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.2k
Transcript
メールアドレスを 深堀りする Hiroto Fukui @bary822
self self.name => Hiroto Fukui self.sns => @bary822 self.titles =>
[‘app engineer’, ‘data engineer’] self.companies => [‘rakuten’, ‘grooves’] self.likes => [‘dog’, ‘camping’, ‘ruby’]
Osaka Tokyo
None
メールアドレス
[email protected]
[email protected]
ローカル部 (ユーザー名) ドメイン
[email protected]
とは 「example.comという(メール)サーバーに 登録されているhogeというユーザー」
RFC 5322 (Internet Message Format)
ローカル部 - ASCII - アルファベット(A-Z a-z) - 数字(0-9) - 記号(!
# $ % & ' * + - / = ? ^ _ ` { | } ~) - ドット(.) - ただし先頭、末尾以外 - 2個以上連続してはならない - “”で囲まれた特殊な記号 - ( ) < > [ ] : ; @ , - ドット(.) - 制限を受けない - スペース - \を付けた時のみ、\と”が単体で使える - h\\o\”
[email protected]
- いわゆるエスケープ
-
[email protected]
-
[email protected]
- user+mailbox/
[email protected]
- !#$%&'*+-/=?^_`.{|}
[email protected]
- "Abc@def"@example.com
- "Fred\ Bloggs"@example.com - "Joe.\\Blow"@example.com -
[email protected]
-
[email protected]
- hoge”
[email protected]
-
[email protected]
-
[email protected]
- user+mailbox/
[email protected]
- !#$%&'*+-/=?^_`.{|}
[email protected]
- "Abc@def"@example.com
- FredBloggs(a.k.a superman)@example.com - "Joe.\\Blow"@example.com -
[email protected]
-
[email protected]
- hoge”
[email protected]
ドメイン - アルファベット(A-Z a-z)、数字(0-9)またはハイフン(-)をドット(.)で繋いだ文字列 -
[email protected]
- [ ]で囲まれたIPアドレス -
hoge@[192.168.0.12] - 先頭と末尾はアルファベットか数字に限る
-
[email protected]
-
[email protected]
-
[email protected]
-
[email protected]
-
[email protected]
-
[email protected]
-
[email protected]
- hoge@com - hoge@exampl(e).com -
[email protected]
-
[email protected]
-
[email protected]
-
[email protected]
-
[email protected]
-
[email protected]
-
[email protected]
-
[email protected]
-
[email protected]
- hoge@com - hoge@exampl(e).com -
[email protected]
-
[email protected]
本当か?
None
None
None
なぜか
結局のところアプリ側のvalidationが統一されてない - RFCに準拠しているアプリのほうが珍しい - オレオレvalidationの横行 - みんな何となくでやってる
ネットワークレベルの独自仕様 ref: https://www.nttdocomo.co.jp/info/spam_mail/spmode/change_add/index.html
Railsでのプラクティス
自前実装 - Regexpで頑張る - /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i とかする - メンテが大変 - lib/validatorsに追加する
- EmailValidator#validate_each みたいなのを実装する
URI::MailTo::EMAIL_REGEXP を使う URI::MailTo::EMAIL_REGEXP => /\A[a-zA-Z0-9.!\#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61} [a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*\z/ - Rubyのstdlib - なかなか厳しい制約
-
[email protected]
は通ってしまう "
[email protected]
".match? URI::MailTo::EMAIL_REGEXP => true
Devise#email_regexp を使う Devise.email_regexp => /\A[^@\s]+@[^@\s]+\z/ - (デフォルトは)メチャメチャ緩い - 使うならカスタムして、アプリ全体で統一させると良さそう
専用gemを使う balexand/email_validator
gemを使う balexand/email_validator
v2.0.0 の衝撃
v2.0.0 の衝撃 @をスペース以外の文字列で挟めばOK
v2.0.0 の衝撃
v2.0.0 の衝撃
とはいえやっぱり validationしたい
None
real_world_email_validator (ほとんど)全てのメールシステムで動作することを目指す - 基本はRFC 5322に準拠 - プラスでいくつかの制限 - ローカル部 -
スペースは禁止 - バックスラッシュ(/)は禁止 - コメントは禁止 - ho(comment)
[email protected]
- ドメイン - トップレベルドメインのみは禁止 - hoge@com - コメントは禁止 - hoge@exam(comment)ple.com
Pull Request お待ちしています
まとめ - 「正しいメールアドレス」を定義するのは難しい - RFCが正だと思うのは危険 - validationする時は一旦立ち止まって考えよう