iOS の Mail.app でメールをプッシュ通知する方法としては、主に 2つあります。

  1. Apple Push Notification Service に対応しているメールサーバを使う
  2. Microsoft Exchange Server を使う

前者は、Apple のプッシュ通知インフラを使う方法で、まあ、色々と利点はあるのでしょう。しかし、Apple から証明書を取得/更新する必要があります。Apple Developer Membership は一部の例外を除いて有料(年間 $99〜)のため、メールのプッシュ通知のためだけに支払うのはさすがにキツイです。後者は Microsoft Exchange Server クローンの z-push をインストールすることで利用できるので、前者に比べると設定がはるかに楽です。

レポジトリの追加とインストール

z-push の公式ドキュメント(英語)でレポジトリを使え、とあるので、それに従います。

/etc/yum.repos.d/z-push.repo を作成し、以下の内容を書き込みます。

[z-push]
 name=Z-Push noarch Enterprise Linux 7 - $basearch
 baseurl=https://download.kopano.io/zhub/z-push:/final/RHEL_7
 failovermethod=priority
 enabled=1
 gpgcheck=0 

インストールします。

$ sudo yum install z-push-common z-push-config-nginx z-push-backend-imap z-push-ipc-sharedmemory
$

各 RPM パッケージの中身は以下のとおりです。基本は上記でよいと思いますが、各自、適切なものを選択してください。

  • z-push-common は z-push 本体です。
  • z-push-config-nginx は nginx で z-push を使う場合の設定ファイル一式です。Apache を使いたい場合は、代わりに z-push-config-apache を使用してください。
  • z-push-backend-imap は IMAP サーバと通信するためのプラグインです。他にも、z-push-backend-caldav など、色々と用意されているようです。各自調べてください。
  • z-push-ipc-sharedmemory は z-push でプロセス間通信(IPC)をする際に必要になるもので、これを入れないと、大量のエラーログが出ます。負荷分散で複数サーバにまたがる場合は、z-push-ipc-memcached も用意されていますので、適切な方をインストールしてください。

z-push の設定

/etc/z-push/z-push.conf.php の以下の箇所を編集します。

// Defines the default time zone, change e.g. to "Europe/London" if necessary
define('TIMEZONE', 'Asia/Tokyo');

設定箇所はタイムゾーンのみで、他は設定不要です。ネットでは、BACKEND_PROVIDER を設定する例をよく見かけますが、空文字列のままにしておくと、自動認識※となります。IPC_PROVIDER も空文字列のままにしておくと、使える方を自動認識して使ってくれます。特別な事情な無い限り、明示的に設定する必要はありません。

Leave this value empty and Z-Push will autoload a backend.

/etc/z-push/imap.conf.php の以下の箇所を各自の環境に合わせて編集します。

// Defines the server to which we want to connect
define('IMAP_SERVER', 'localhost');

// connecting to default port (143)
define('IMAP_PORT', 143);
define('IMAP_PORT', 993);

// best cross-platform compatibility (see http://php.net/imap_open for options)
define('IMAP_OPTIONS', '/notls/norsh');
define('IMAP_OPTIONS', '/ssl/validate-cert');

// Since I know you won't configure this, I will raise an error unless you do.
// When configured set this to true to remove the error
define('IMAP_FOLDER_CONFIGURED', false);
define('IMAP_FOLDER_CONFIGURED', true);

//        '@mydomain.com' - the username is used and the given string will be appended
define('IMAP_DEFAULTFROM', '@example.com');

// smtp => direct connection against SMTP
define('IMAP_SMTP_METHOD', 'mail');
define('IMAP_SMTP_METHOD', 'smtp');

ここはお好みで、としか言いようがないです。

nginx の設定

nginx の設定例です。

...
server {
    listen       443 ssl http2;
    listen       [::]:443 ssl http2;
    server_name  mail.example.com;
    root         /path/to/htdocs;

    # If you're using PHP-FPM uncomment the following lines.
    include         fastcgi_params;
    fastcgi_index   index.php;
    fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param   REQUEST_URI $1;
    fastcgi_param   PHP_FLAG "magic_quotes_gpc=off \n register_globals=off \n magic_quotes_runtime=off \n short_open_tag=on";
    fastcgi_param   HTTP_PROXY ""; # Mitigate https://httpoxy.org/ vulnerabilities
    fastcgi_read_timeout 3660; # Z-Push Ping might run 3600s, but to be safe

    location /Microsoft-Server-ActiveSync {
        alias       /usr/share/z-push/index.php;

        access_log  /var/log/nginx/z-push-access.log;
        error_log   /var/log/nginx/z-push-error.log;

        # Attachments ca 15MB max (since binary data needs to be base64 encoded in mine, which results in in about 33% overhead)
        client_max_body_size 20m;
        client_body_buffer_size 128k;

        # Select one of the fastcgi_pass values or adapt to your configuration
        include snippets/z-push-php.conf;

        fastcgi_pass    unix:/var/run/php-fpm/php-fpm.sock;
    }

    location / {
...

テスト

https://mail.example.com/Microsoft-Server-ActiveSync にアクセスします。認証を求められますので、IMAP のアカウントとパスワードでログインします。無事、ログインできればインストール成功です。

iPhone の設定

iPhone の OS は iOS 14.6 です。

  1. 設定 → メール → アカウント → アカウントを追加 → Microsoft Exchange
  2. メール: (メールアドレス), 説明: (お好みで) を入力
  3. 次へを押して、手動構成を選択
  4. パスワード: (パスワード)を入力
  5. サーバ: mail.example.com, ドメイン: example.com, ユーザ名: (ユーザ名) を入力
  6. コンテンツを選択。メモとかカレンダーとかも出ますが、メール以外が使えるかどうかは試していません。

これだけだと、メールはプッシュ通知されていますが、ユーザへの通知はありません。別途、通知の設定を行います。

  1. 設定 → メール → 通知 → (上で作ったやつ)
  2. 通知のところに、ロック画面、通知センター、バナーなど選択肢があるので、各自お好みで。
  3. サウンドやバッチもお好みで。

おわりに

まだ書きかけです。

ネットでは、z-push の設定に関する情報はたくさん見つかるのですが、レポジトリからインストールする方法については見かけなかったので、この記事を作成しました。レポジトリからインストールして、常に最新のものを使いましょう。

紹介しておいてアレですが、今後も z-push を使い続けることは、やや不安が残ります。z-push が依存している php-imap、 php-awl、そして libc-client は今後も使い続けられるのでしょうか? php-imap が使用している libc-client(University of Washington c-client library)は 2007年を最後に更新が途絶えています。php-awl(Andrew's Web Libraries)はかなりマイナーなソフトで、z-push の RHEL7 用のレポジトリでは配布しているものの、RHEL8 用のレポジトリでは配布なしというチグハグさです。そろそろ PHP は止めて、Python あたりで書き直してもらえるといいですが…。