はじめに
メールアドレスのチェックをインターネットで検索すると、正規表現を使ったチェック方法が多く紹介されています。
しかし、RFCで定義されているメールアドレスの書式を満たしている正規表現は、ほとんど見たことがありません。
スポンサーリンク
たとえば、以下はRFCの規定において有効なメールアドレスです。
Abc@example.com (dot-atom)
Abc.123@example.com (dot-atom)
user+mailbox/department=shipping@example.com (dot-atom)
!#$%&'*+-/=?^_`.{|}~@example.com (dot-atom)
"Abc@def"@example.com (quoted-string)
"Fred\ Bloggs"@example.com(quoted-pairを含んだquoted-string)
"Joe.\\Blow"@example.com(quoted-pairを含んだquoted-string)出典:wikipedia
そして、以下は無効なメールアドレスです。
Abc.@example.com(“.”をローカル部の末尾に使用している)
Abc..123@example.com(“.”が連続している)出典:wikipedia
また、Gmailのようにメールアドレスに日本語を使うことができるサービスも増えてきています。
よくある正規表現によるメールアドレスチェック
以下はよくある正規表現によるメールアドレスチェックです。
[入力チェック 例]
/** * メールアドレスチェック * @param value 検証対象の値 * @return 結果(true:メールアドレス、false:メールアドレスではない) */ public static boolean isMailAddress(String value) { boolean result = false; if (value != null) { Pattern pattern = Pattern.compile("^[\w!#%&'/=~`\*\+\?\{\}\^\$\-\|]+(\.[\w!#%&'/=~`\*\+\?\{\}\^\$\-\|]+)*@[\w!#%&'/=~`\*\+\?\{\}\^\$\-\|]+(\.[\w!#%&'/=~`\*\+\?\{\}\^\$\-\|]+)*$"); result = pattern.matcher(value).matches(); } return result; }
それでは、上記の正規表現がRFCの規定通りにチェックできているかを確認してみます。
[動作確認]
System.out.println("Abc@example.com:" + isMailAddress("Abc@example.com")); System.out.println("Abc.123@example.com:" + isMailAddress("Abc.123@example.com")); System.out.println("user+mailbox/department=shipping@example.com:" + isMailAddress("user+mailbox/department=shipping@example.com")); System.out.println("!#$%&'*+-/=?^_`.{|}~@example.com:" + isMailAddress("!#$%&'*+-/=?^_`.{|}~@example.com")); System.out.println("\"Abc@def\"@example.com:" + isMailAddress("\"Abc@def\"@example.com")); System.out.println("\"Fred\\ Bloggs\"@example.com:" + isMailAddress("\"Fred\\ Bloggs\"@example.com")); System.out.println("\"Joe.\\\\Blow\"@example.com:" + isMailAddress("\"Joe.\\\\Blow\"@example.com")); System.out.println("Abc.@example.com:" + isMailAddress("Abc.@example.com")); System.out.println("Abc..123@example.com:" + isMailAddress("Abc..123@example.com")); System.out.println("あいうえお@日本.com:" + isMailAddress("あいうえお@example.com"));
【実行結果】
- Abc@example.com:true ← RFCの規定通り
- Abc.123@example.com:true ← RFCの規定通り
- user+mailbox/department=shipping@example.com:true ← RFCの規定通り
- !#$%&'*+-/=?^_`.{|}~@example.com:true ← RFCの規定通り
- "Abc@def"@example.com:false ← RFCの規定通りではない
- "Fred\ Bloggs"@example.com:false ← RFCの規定通りではない
- "Joe.\\Blow"@example.com:false ← RFCの規定通りではない
- Abc.@example.com:false ← RFCの規定通り
- Abc..123@example.com:false ← RFCの規定通り
- あいうえお@日本.com:false ← 日本語が使えない
実行結果から、有効なメールアドレスである以下がチェックNGという結果になりました。
"Abc@def"@example.com
"Fred\ Bloggs"@example.com
"Joe.\\Blow"@example.com
日本語のメールアドレスもチェックNG
スポンサーリンク
Apache CommonsのEmailValidatorによるメールアドレスチェック
Apache Commonsが提供しているEmailValidatorを使った場合のメールアドレスチェックは以下です。EmailValidatorを使うにはcommons-validatorのjarファイルが必要です。pom.xmlの場合は、次の通りです。
[pom.xml]
<dependency> <groupId>commons-validator</groupId> <artifactId>commons-validator</artifactId> <version>1.7</version> </dependency>
[入力チェック 例]
/** * メールアドレスチェック * @param value 検証対象の値 * @return 結果(true:メールアドレス、false:メールアドレスではない) */ public static boolean isValidMailAddress(String value) { boolean result = false; if (value != null) { if(EmailValidator.getInstance().isValid(value)) { result = true; } } return result; }
それでは、Apache CommonsのEmailValidatorがRFCの規定通りにチェックできているかを確認してみます。
[動作確認]
System.out.println("Abc@example.com:" + isValidMailAddress("Abc@example.com")); System.out.println("Abc.123@example.com:" + isValidMailAddress("Abc.123@example.com")); System.out.println("user+mailbox/department=shipping@example.com:" + isValidMailAddress("user+mailbox/department=shipping@example.com")); System.out.println("!#$%&'*+-/=?^_`.{|}~@example.com:" + isValidMailAddress("!#$%&'*+-/=?^_`.{|}~@example.com")); System.out.println("\"Abc@def\"@example.com:" + isValidMailAddress("\"Abc@def\"@example.com")); System.out.println("\"Fred\\ Bloggs\"@example.com:" + isValidMailAddress("\"Fred\\ Bloggs\"@example.com")); System.out.println("\"Joe.\\\\Blow\"@example.com:" + isValidMailAddress("\"Joe.\\\\Blow\"@example.com")); System.out.println("Abc.@example.com:" + isValidMailAddress("Abc.@example.com")); System.out.println("Abc..123@example.com:" + isValidMailAddress("Abc..123@example.com")); System.out.println("あいうえお@日本.com:" + isValidMailAddress("あいうえお@example.com"));
【実行結果】
- Abc@example.com:true ← RFCの規定通り
- Abc.123@example.com:true ← RFCの規定通り
- user+mailbox/department=shipping@example.com:true ← RFCの規定通り
- !#$%&'*+-/=?^_`.{|}~@example.com:true ← RFCの規定通り
- "Abc@def"@example.com:true ← RFCの規定通り
- "Fred\ Bloggs"@example.com:true ← RFCの規定通り
- "Joe.\\Blow"@example.com:true ← RFCの規定通り
- Abc.@example.com:false ← RFCの規定通り
- Abc..123@example.com:false ← RFCの規定通り
- あいうえお@日本.com:true ← 日本語が使える
実行結果からRFCの規定通りにチェックできているのが分かります。
最後に
本記事ではJavaでメールアドレスのチェックを実装する方法を紹介しました。
【関連記事】
- Javaで数値チェックを実装する方法
- Javaで日付チェックを実装する方法
- Javaで時刻チェックを実装する方法
- Javaでメールアドレスのチェックを実装する方法
- Javaで郵便番号のチェックを実装する方法
- Javaで全角カナのチェックを実行する方法
- Javaで半角カナのチェックを実装する方法
- Javaでひらがなのチェックを実装する方法
- Javaで英字のチェックを実装する方法