Z-Push を使って iPhone に独自ドメインメールを push 通知する

Z-Puzh」というオープンソースの ActiveSync 互換ソフトウェアを利用して、iPhone に自分が所有しているドメインのメールサーバについて、push 通知に成功したので、備忘録としておいておきます。

■前提

  • 既に、メールサーバは Dovecot で IMAPS 、Postfix で SMTP (送信認証あり) として、別のサーバで実装されている。
  • 「apache2」と「libapache2-mod-php7.0」パッケージはインストールされ、正規の TLS 証明書が設定され、外部から https 経由での接続が可能な状態。
  • OS は Linux で Debian GNU/Linux Buster (2017/11/18 現在 Testing) を利用。

■インストール

# apt-get install php-mbstring z-push z-push-ipc-memcached memcached

memcached は、デフォルトでは 127.0.0.1 しか Listen しないが、念のため iptables などのフィルタリングを確認しておく。

■設定

それぞれ、下記のファイルを編集する。

  • /etc/z-push/z-push.conf.php (変更した個所のみ)
    define('TIMEZONE', 'Asia/Tokyo');
    define('IPC_PROVIDER', 'IpcMemcachedProvider');
    define('BACKEND_PROVIDER', 'BackendIMAP');
    
  • /etc/z-push/imap.conf.php (変更した個所のみ)
    define('IMAP_SERVER', 'imapサーバの IP アドレス、または FQDN');
    define('IMAP_PORT', 993); // IMAP なら 143 を指定。
    define('IMAP_OPTIONS', '/ssl/novalidate-cert');
    // IMAPS サーバ側が正当な TLS 証明書を持っているのなら、「/ssl/validate-cert」を指定。
    // IMAP なら「/notls/norsh」を指定。
    define('IMAP_FOLDER_CONFIGURED', true);
    define('IMAP_SMTP_METHOD', 'smtp');
    $imap_smtp_params = array('host' => 'SMTP サーバの IP アドレス、または FQDN', 'port' => 587, 'auth' => true, 'username' => 'imap_username', 'password' => 'imap_password', 'verify_peer' => false, 'verify_peer_name' => false);
    // SMTP サーバ側が正当な TLS 証明書を持っているのなら「'verify_peer' => false, 'verify_peer_name' => false」の部分は不要。(SMTP サーバが、STARTLS を返す場合、TLS で接続しようとする模様。)

    ちなみに、IMAP のフォルダの設定は、デフォルトのままで良い。最初「SENT」を「INBOX.SENT」等として、大いにはまった。

    参考までに、該当個所は以下の様に設定している。

    define('IMAP_FOLDER_CONFIGURED', true);
    define('IMAP_FOLDER_PREFIX', '');
    define('IMAP_FOLDER_PREFIX_IN_INBOX', false);
    define('IMAP_FOLDER_INBOX', 'INBOX');
    define('IMAP_FOLDER_SENT', 'SENT');
    define('IMAP_FOLDER_DRAFT', 'DRAFTS');
    define('IMAP_FOLDER_TRASH', 'TRASH');
    define('IMAP_FOLDER_SPAM', 'SPAM');
    define('IMAP_FOLDER_ARCHIVE', 'ARCHIVE');
  • メールサーバ側の /etc/dovecot/conf.d/15-mailboxes.conf
    namespace inbox {
      mailbox Drafts {
        special_use = \Drafts
        auto = subscribe
      }
    
      mailbox Junk {
        special_use = \Junk
        auto = subscribe
      }
    
      mailbox Trash {
        special_use = \Trash
        auto = subscribe
      }
    
      mailbox "Deleted Messages" {
        special_use = \Trash
        auto = subscribe
      }
    
      mailbox Sent {
        special_use = \Sent
        auto = subscribe
      }
    }

あとは、iPhone 側で、設定より、アカウント – アカウントの追加 – Exchange をタップし設定を行い、「メール」のみをオンとしてアカウントを設定する。その後設定したメールアドレスへメールが着信すると、iPhone にプッシュ通知されるはず。

今回の設定について、「Example Configuration · fmbiete/Z-Push-contrib Wiki · GitHub」を参考とさせていただいた。実は、Z-Push のオフィシャルからダウンロードしてきたソースで地道に設定を行っていたのだが、どうも上手くいかず悩んだ。どうやら IMAP のフォルダ設定部分を「INBOX.SENT」の様に設定したのが誤りだった様で、Debian パッケージでやったから成功したというわけでは無いと思う。

ちなみに、Debian の d-push パッケージ (Debian のパッケージでは名前を変えているらしい) で、現行安定版の Debian GNU/Linux 9 stretch にこれがないのは、該当の PHP のバージョンは 7 であるが、z-push が PHP7 に対応したのが、2.3.4 (2016/12/22 リリース ?) かららしく、stretch のフリーズ日に圧倒的に間に合わなかったのだろうなぁと推測している。

そもそも、iOS の標準メーラーが IMAP IDLE に対応したら良いのですが・・・

余談であるけれど、Debian GNU/Linux Buster の Apache 2.4.29 においては mpm_prefork で HTTP/2 が利用できないみたい。mpm_event とかにすれば動くけれど、多分 php-fpm とかにしないといけないのだろう。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です