Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
メールアドレスを深堀りする
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Hiroto Fukui
June 20, 2019
Programming
1.2k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
メールアドレスを深堀りする
Diving deep into the world of Email Address format
Hiroto Fukui
June 20, 2019
More Decks by Hiroto Fukui
See All by Hiroto Fukui
Deploy from slack
bary822
0
91
kiba ETLで小さく始めるデータ分析基盤構築
bary822
3
300
AR_migrationの例外.pdf
bary822
0
88
GraphQLを_Rubyで気軽に試す.pdf
bary822
0
370
Other Decks in Programming
See All in Programming
そのデザイントークン、Flutterでも同じ見た目になりますか?
nakamizu
0
140
3回つくってわかった、 定期実行ジョブ基盤の本質情報
takai
4
3.5k
Optunaを作ったときにやりたかったこと、その後 (2026/10/16, Optuna Meetup #3)
iwiwi
4
1.4k
[2026-10-09]一枚の布で作らなくてもいい。 信頼性は「パッチワーク」で紡がれる~既存の運用と新しい可能性をつなぎ合わせてきたCREの話~
tosite
0
120
AI時代のFlutter品質設計 — アプリ品質を守るQuality Layers
omatty198
0
320
TS 7.0 で baseUrl が使えなくなった今、パスエイリアスをどうするか
bicstone
1
280
TanStack Vue Query と Pinia Colada から学ぶ非同期状態の型設計
aoshi
0
480
作って学ぶSpring BootのAuto Configuration / JJUG Night Seminar 2026-10-19
rshindo
0
210
月間100万人のサービス刷新で、 技術選定をHonoに振り切った話
yutobara
8
7.1k
Lambda durable functionsでHuman in the Loopを楽に…楽に……
har1101
2
230
AI-Powered Domain-Driven Design
ziobrando
0
360
Coding with AI: How to trust the storyteller (AWS Community Day Adria, Ljubljana 2026)
slobodan
0
130
Featured
See All Featured
Building an army of robots
kneath
307
47k
Balancing Empowerment & Direction
lara
6
1.3k
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
3.6k
Statistics for Hackers
jakevdp
799
230k
Six Lessons from altMBA
skipperchong
29
4.5k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
610
Done Done
chrislema
187
17k
Marketing to machines
jonoalderson
1
5.9k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
120
120k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.4k
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する時は一旦立ち止まって考えよう