2018/08/27

Mail.app の「セキュリティ保護されていない認証を許可」チェックボックスを有効にするアプリを作りました

macOS High Sierra(少なくとも 10.13.6 まで)は、Mail.app に小さなバグがあります。

そのバグは、

  1. Mail.app 「環境設定」の
  2. 「アカウントタブ」から
  3. 「IMAPの詳細設定」へ入り
  4. 「セキュリティ保護されていない認証を許可」のチェックボックスを有効にした後
  5. 「OK」を押しても
  6. 「セキュリティ保護されていない認証を許可」の設定が反映されない

というものです。

Mail.app はユーザ名やパスワードなどを変更すると、その設定が正しいかどうかをサーバへ問い合わせて検証を行い、正常な接続を確認できた場合にのみ、設定を保存する仕組みになっています。

そのため、「セキュリティ保護されていない認証を許可」の設定が反映されない場合、SSL の有効になっていないメイルサーバへの設定変更は検証が成功しないため、保存ができない、ということになってしまいます。

多くの IMAP サーバは SSL に対応していると思われるので、このバグで悩む人は少ないとは思いますが、私が私的に使っているIMAP サーバは SSL 非対応のため、非常に困ってしまいました。

そこで Mail.app が使っている ~/Library/Accounts/Accounts4.sqlite を直接操作するアプリ「Accounts4Fixer」を作成しました。v1.0.0 の Release バイナリも作成してあります。

内容は単純で、直接データベースの当該要素を変更してるだけです。Mail.app は CoreData を使ってデータベースアクセスをしているようですが、このアプリでは SQLite ライブラリを使って直接データベースを書き換えています。

アカウントに関するデータベースを変更する都合上、変更が  失敗した場合、最悪 macOS へログインすらできなくなってしまうかもしれません。その点をよく理解頂いた上で、自己責任でご利用ください(事前にバックアップを作成することをお薦めします)。

なお、この Mail.app のバグは、macOS Mojave では直っているようです。例年通りであれば、恐らく一ヶ月程度で Mojave がリリースされると思われるので、もしそれまで待てるのであれば、また、Mojave へアップデートする予定であれば、Mojave リリースを待つのも良い案だと思います。

2018/06/25

復活する「SMTP サーバリスト」を消す方法

この記事は macOS 10.13.5 / メール 11.4(3445.8.2)を使っています。

macOS 付属の Mail.app で何度も復活する「SMTP サーバリスト」の要素を消す方法です。

TL;DR

Keychain Access.app を使って com.apple.account.SMTP.accountsync を消します。

macOS に付属のメールアプリで「環境設定」に入り、「アカウント」を開くと、メール用のアカウントが表示されます。



右側のペインにあるセグメントバーで「サーバ設定」を選択すると「送信用メールアカウント」のプルダウンメニューが表示され、「SMTP サーバリストを編集」からサーバの一覧画面へ移動できます。




本来ならば、消したい要素を選択し「-」ボタンを押すことで、不要な要素を消すことができるのですが、設定画面を抜け、再度設定画面へ戻ってくると、なぜか消した要素が復活してしまうことがあります。

この現象は Keychain.app を開いて該当項目を消すことで修正できます。

危険な操作ですので、十分に用心して行ってください。

1. Keychain Access.app を開きます。
2. メニューバーにある「表示」から「不可視項目を表示」を選択します。
3. Keychain Access.app の右上にある検索ボックスへ「com.apple.account.SMTP.asynchost」と入力します。
4. 「アカウント」に表示されている項目が「SMTP サーバリスト」の「ホスト名」と合致する項目を選択し、delete ボタンを押します。



これでメールアプリからも不要な要素が削除できました。念のために不可視項目を非表示にしておきましょう。

5. メニューバーにある「表示」から「不可視項目を非表示」を選択します。


2018/04/21

Xcode で Signing Certificate が Error になる場合の確認方法

(この記事は、Xcode 9.3 を使っています)

TL;DR


Build Settings タブにある Code Signing Identity を確認しましょう。

解説


Xcode 8 から Signing で「Automatically manage signing」が選べるようになり、とても便利になりました。この設定は Project Navigator から Targets を選択し、General タブの中にあるSigning で有効にできます。



ここで Team を選択すると、選択された Team 並びに、現在使用している Scheme の Info タブで設定できる Build Configuration などを踏まえ、適切な組み合わせの Provisioning Profile が選択(場合によっては生成)され、設定される、という仕組みになっています。



「Automatically manage signing」チェックボックスを無効にする(即ち チェックを外す)と、以前同様に、手動で Provisioning Profile を選択することも可能です。この場合は、Provisioning Profile を元に、Team が決定されます。




いずれの場合でも、Signing Certificates は最適なものが自動的に選択されますが、稀にこの選択が失敗してしまい、次のようなエラーになる場合があります。

Provisioning profile "XXX-Provisioning-Profile" doesn't include signing certificate "iPhone Developer: John Appleseed (XXXXXXXXXX)".

この Signing Certificates は同じく Project 設定の中にある「Build Settings」タブの「Signing」セクションにある「Code Signing Identity」の情報を元に決定されます。



例えば、「Release Build では iOS Distribution カテゴリの Certificate を使いたい」という場合には、この値を 「iOS Distribution」へ変更しましょう。



私の環境では、Automatically manage signing を無効に設定(すなわち Manual へ設定)した上で、Release build では、Distribution 用 Provisioning を使う設定にしていました。しかし Code Signing Identity は iOS Developer のままであった為、上記のエラーとなってしまいました。Code Signing Identity を iOS Distribution へ設定したところ、エラーが消えました。

なお、Automatically manage signing を有効に設定した場合、 Code Signing Identity は何れの build でも iOS Developer へ設定しておく必要があります。この値を不適切に設定すると、Generic タブの Signing セクションで、

_APPNAME_ has conflicting provisioning settings._APPNAME_ is automatically signed for development, but a conflicting code signing identity iPhone Distribution has been manually specified. Set the code signing identity value to "iPhone Developer" in the build settings editor, or switch to manual signing in the project editor.
といったエラーが表示されますので、Code Signing Identity の設定値を確認してみましょう。