Java

Javaでメールアドレスのチェックを実装する方法

はじめに

メールアドレスのチェックをインターネットで検索すると、正規表現を使ったチェック方法が多く紹介されています。

しかし、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

 

正規表現でRFCのメールアドレスの書式を完全にサポートするのは、難易度高そう・・・。

スポンサーリンク

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でメールアドレスのチェックを実装する方法を紹介しました。

【関連記事】

helpful