ひらおかゆみのなげやりブログ

もう、なげやりです…

自作のJavaMailラッパーでiCloudメールにアクセスする

このエントリはJava Advent Calendar 2016の19日目です。そして今日は私の誕生日でもあります。昨日は川場 (@tkxlab) さんの「暗号処理をやってみよう!」でした。今日はJavaFX Advent Calendar 2016の方でも小惑星JavaFXで描画してみるチャレンジでエントリしていますが、こちらではJavaMailの話題で進めようと思います。

今回は、今年の6月頃にGitHubへ上げたままになっていた自作のJavaMailラッパーを手直しする過程で気づいた、iCloudメールへアクセスできない現象とその対策について取り上げます。こちらが自作のJavaMailラッパー、simplemailです。

github.com

simplemailはJavaMailを使ってメールの送信と受信の両方を行います。送信だけでなく受信もできるのが強みです。対応しているメールサービスは標準でOutlook.com、GmailiCloudメール、ドコモメール(iモードやspモードではない)の4種類、JavaMailのプロパティが書ければ拡張は無制限にできます。設定に関する情報が少ないiCloudメールやドコモメール(Contributed by 某李衣菜P)のJavaMailプロパティをあらかじめ用意してあるのも特長です。というか、そのつもりでした。

ところが、最近メンテナンスしている最中に、iCloudメールがつながらなくなっていることに気づきました。iCloudメールのIMAPサーバーが "A0 NO [AUTHENTICATIONFAILED]" というエラーを返して、認証できなくなってしまったのです。

原因はiOS 10にアップデートした際の2ファクタ認証でした。JavaMailはiOSの2ファクタ認証に対応していないため、2ファクタ認証を設定した状態ではiCloudSMTPサーバーやIMAPサーバーにログインできないのです。解決方法は2つあって、

  1. iOSの2ファクタ認証を無効にする
  2. App用パスワードを生成する

です(ソースが2ちゃんねるというのが何とも…ですが、結果としては合ってました)。私は両方試してみて、最終的にApp用パスワードを使うことにしました。App用パスワードはAppleアカウントの管理のセキュリティから生成することができます。生成されたApp用パスワードをApple IDのパスワードの代わりにJavaMailのSMTPまたはIMAPパスワードとして指定することで、以後App用パスワードを使ってJavaMailからiCloudメールへアクセスできるようになります。

Windows 10に付属しているメールとカレンダーもiCloudの2ファクタ認証には対応しておらず、同様にApp用パスワードを生成して使うことになります。Windows 10側の設定情報を覗いてみた感じでは、iCloudのカレンダーにはHTTPSでアクセスしているようですが、こちらもJavaからアクセスする場合はApp用パスワードが必要になるはずです。

2ファクタ認証はiOS 9からの機能で、iOS 10ではデフォルトになっているようです(少なくとも私はiOS 9時代に2ファクタ認証の設定をした覚えがありません)。iPhoneiOS 9からiOS 10へアップデートすると、2ファクタ認証用のSMSが送信されてもその場でiPhoneがSMSを拾って認証コードを読み取ってしまうため、2ファクタ認証に阻まれて初めて設定していたことに気づくようです。

明日は…やっぱ紹介しなきゃだめ?(よね)ThreeTen Extraの紹介 by @khasunuma です。いつもの「困ったときのDate and Time API」です。