スペースモラトリアムノカミサマ

日記+コメント付きブックマーク+他人にも役に立つかもしれない情報など。
(更新情報: RSS(ツッコミ付き) / RSS(ツッコミ抜き) / LIRS)

最近の TrackBack:
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|06|07|08|09|10|
2011|01|02|03|07|10|11|
2012|02|03|04|07|08|09|
2013|01|06|07|
2014|02|08|09|11|
2015|09|
2016|01|05|
2017|07|
2018|05|07|
2019|07|
2020|08|09|10|12|
2021|05|
2022|03|

2016/01/03

_ [システム運用][Mail] Ubuntu で運用中の独自ドメインのメールを d-push で iPhone にプッシュ通知する

自分は iPhone で独自ドメインのメアドを利用すべく、さくらの VPS に Ubuntu Server を立てて IMAP サーバーを稼働させてきていたのだけど、単純に IMAP サーバーを立てるだけだと iPhone にプッシュ通知できず、最短15分毎のフェッチとなってしまう。

調べたところ、iPhone にプッシュ通知できる OSS 実装があることを知ったので、Ubuntu で運用中のサーバーに導入してみた。

なお、導入にあたっては基本的に「自宅サーバのeximから,iPhoneにpush通知はできるのか.できた! exim+dovecot+z-push - なぜか数学者にはワイン好きが多い」を参考とさせていただいた。

今回の前提環境

  • Ubuntu 14.04 LTS で MTA として postfix、MRA として dovecot を構築済み
  • dovecot ではこれまで IMAP を利用してきた
  • apache2 がインストール済みだが、SSL は有効化していない
  • サーバー証明書はオレオレ証明書で良いものとする

必要なパッケージのインストール

まず、iPhone でメールのプッシュ通知を利用するには Microsoft ActiveSync 互換環境が必要で、その OSS 実装が Z-Push であるらしい。

また、Z-Push は Ubuntu では (というか Debian では) d-push というパッケージで提供されていた。

であれば話は簡単なので、

apt-get install d-push

である。

依存関係により libc-client2007e、mlock、php5、php5-imap、php-auth-sasl、php-mail、php-net-smtp、php-net-socket、php-pear もインストールされた。

(簡単なドキュメントが /usr/share/doc/d-push/README.Debian.gz に配置されるので、それも参照)

apache2 での SSL と D-Push 有効化

mod_ssl 有効化

a2enmod ssl

SSL サイト有効化

a2ensite default-ssl

d-push 有効化

cp -a /etc/d-push/apache.conf /etc/apache2/conf-available/d-push.conf
a2enconf d-push

ブラウザで確認

https://www.example.com/Microsoft-Server-ActiveSync にアクセスし、ユーザー名/パスワードを入力すると

GET not supported

This is the d-push location and can only be accessed by Microsoft ActiveSync-capable devices

と表示されることを期待するが、実際には

FatalException

BackendIMAP(): php-imap module is not installed

と表示されてしまう。

php5-imap はインストールしただけでは有効にならないのであった。この問題は

php5enmod imap

することで解決。

iPhone 側での設定

[設定] → [メール/連絡先/カレンダー] → [アカウントを追加] → [Exchange]

メールメールアドレス
パスワードIMAP パスワード
説明適当にわかりやすいものを

で、[次へ]

メール(変更なし)
サーバD-Push をインストールしたサーバー
ドメイン(空)
ユーザ名IMAP ユーザー名
パスワード(変更なし)

で、[次へ]

「メール」にのみチェックを入れ他は外し、[保存]

d-push.conf の修正 (PROVISIONING 無効化)

設定完了後、メールアプリを開くと「メールを取得できません」「サーバへの接続に失敗しました。」との表示。

この時 /var/log/d-push/d-push.log には

ProvisioningRequiredException: Retry after sending a PROVISION command - code: 0

と出力されていた。

この問題については、/etc/d-push/d-push.conf 中の

define('PROVISIONING', true);

define('PROVISIONING', false);

に変更することで解決。

d-push.conf の修正 (タイムゾーン)

デフォルト設定では /var/log/d-push/ 配下の各ログファイルのタイムスタンプが GMT で出力されてしまう。

この問題については、/etc/d-push/d-push.conf 中の

define('TIMEZONE', '');

define('TIMEZONE', 'Asia/Tokyo');

に変更することで解決。

送信済みメールフォルダ名の修正

d-push を導入しただけでは送信したメールが保存されない。(IMAP 利用時に作られていた「Sent Messages」フォルダがあるが、そこには入らない)

この時 /var/log/d-push/d-push.log には

[ERROR] [mobile] BackendIMAP->SendMail(): The email could not be saved to Sent Items folder. Check your configuration.

と出力されている。

デフォルトの送信済みメール保存フォルダは「Sent」のようなので、Maildir 配下の .Sent Messages を .Sent にリネームすることで解決。

未解決の課題

設定完了後の初回同期時等、メールアプリ起動時等に「メールを取得できません」「サーバへの接続に失敗しました。」と表示されてしまう場合があった。

この時 /var/log/d-push/d-push.log には

Mobile loop detected! Messages sent to the mobile will be restricted to 1 items in order to identify the conflict

/usr/share/d-push/backend/imap.php:718 strpos(): Empty needle (2)

といった警告が表示されている。

これらの問題については原因不明のまま事象が起きなくなった。

その他参考

携帯キャリア以外の ISP でも OCN は ActiveSync に対応しているらしく、設定案内ページが掲載されていた。

その他 iPhoneデータ連携(1) ActiveSync互換 OSS z-push を入れてみた - とあるエンジニアの日常も参考になりそうだ。