iPhoneデータ連携(1) ActiveSync互換 OSS z-push を入れてみた

| No Comments | No TrackBacks

ご無沙汰しています。かどです。

 最近とある事情により iPhone のデータ連携について調べまくっています。その中で、ActiveSync互換 OSS である z-push の存在を知ったので試しに入れてみました。
ちなみに、ActiveSyncは、Exchange と Windows Mobile などの携帯端末のデータを同期するために MS が策定した独自プロトコルです。Windows用のものであれば、動くものがMSからダウロードもできたかと。
独自プロトコルとは言え、現在様々な製品で採用されているため、実質的に業界標準になりつつあります。
ご多分に漏れず iPhone でも採用されているため、上手く使えば iPhone と各種システムとのデータ連携なんてこともできちゃいます。(Googleカレンダーとも連携できるのでご存じの方も多いはず)
ちなみに、この z-push 自体は、php で開発されたプロトコル部分の実装になるので、基本的にはバックエンドの処理は php で開発してあげる必要があります。
付属で IMAP のバックエンドプログラムが同梱されているので、今回はそれを試してみました。
あと、OSS ですが、商売で使うには、多分某MSにとっても高いライセンス料を支払う必要があると思うので、ご注意ください。<詳細は調べてません^^

しかし、この年にして&Web開発者なのに初めて php に触りましたwといっても、Perlとほとんど変わんねーってことで全然抵抗はなかったわけですが。

メール関係は仕事上比較的知識がある方なので、題材としてもとっつきやすかったです。
iPhone での、CalDAV、LDAPについても色々調べてはいるのですが、まぁまた今度。<需要があれば、、、

//
// z-push (ActiveSync互換OSS)
//

■概要
---
 ActiveSync互換プロトコルを実現するゲートウェイ(OSS)
 バックエンドプログラムを開発することで多様なシステムと連携させる事が可能。
 ZarafaというSuiteソフトとの連携実績あり。
 非公式ながら、Googleカレンダーとの連携用バックエンドも存在する模様。
 付属のバックエンドモジュールでそのままIMAPにも接続可能であるが、
 日本語対応がされていない、作りこみが甘い部分があるため、改修は必要。

 メリット:ActiveSync互換であるため、双方向通信が可能。プッシュ型。導入が容易。
 デメリット:商用で使うには多分MSとのライセンス契約が必要?

■ライセンス
---
 GPLv2

■必須ソフトウェア
---
 Apache
 php

■言語
---
 php

■インストール(とりあえずメールがIMAPで連携できるように)
---
 (0) 前提
  ・Apache、php インストール済み
  ・IMAPサーバが構築済み
  ・Apache のドキュメントルートが /usr/local/apache2/htdocs
  ・CentOS 5 だけどあんまり関係ないかな

 (1) Mail系のモジュールをインストール
  # pear install -a Mail

  ※RPMならば(ただし、ApacheもOS同梱のものを使用している場合)
   # rpm -ivh libc-client-2004g-2.2.1.i386.rpm libc-client-devel-2004g-2.2.1.i386.rpm
   # rpm -ivh php-imap-5.1.6-5.el5.i386.rpm

 (2) php.iniの確認

〜〜〜サンプル〜〜〜
magic_quotes_gpc = off
magic_quotes_runtime = off
register_globals = off
default_charset = "utf-8"
error_reporting = E_ALL & ~E_NOTICE
display_errors = off
display_startup_errors = off
log_errors = on
open_short_tag = on
〜〜〜サンプル〜〜〜

 (3) 公式サイトからダウンロード
  http://z-push.sourceforge.net/soswp/

 (4) 解凍
  # tar xvfz z-push-1.2.2.tar.gz -C /usr/local/apache2/htdocs
  # cd /usr/local/apache2/htdocs
  # chown -R apache:apache z-push

 (5) config.php
  IMAPのバックエンドに変更。

  ・ /usr/local/apache2/htdocs/z-push/config.php
   << $BACKEND_PROVIDER = "BackendICS";
   ---
   >> $BACKEND_PROVIDER = "BackendIMAP";

   << date_default_timezone_set("Europe/Amsterdam");
   ---
   >> date_default_timezone_set("Asia/Tokyo");

   << define('IMAP_SERVER', 'localhost');
   ---
   >> define('IMAP_SERVER', 'xxx.xxx.xxx.xxx');
    ※適宜変更

 (6) フォルダ名の日本語対応
  IMAP-UTF7で日本語が考慮されていないので、日本語を考慮した形に若干修正。
  phpは始めて触るので、異論反論は受け付けないw
  本文の処理でも怪しいところがあったけど、細かいところまで見ていくときりがないので放置w

  ・backend/imap.php

〜〜〜サンプル〜〜〜
--- imap.php 2009-12-12 09:39:51.000000000 +0900
+++ imap.php.mb 2009-12-12 09:30:55.000000000 +0900
@@ -355,19 +355,24 @@
                 $box = array();
 
                 // cut off serverstring
-                $box["id"] = imap_utf7_decode(substr($val->name, strlen($this->_server)));
+                // $box["id"] = imap_utf7_decode(substr($val->name, strlen($this->_server)));
+                $box["id"] = mb_convert_encoding(substr($val->name, strlen($this->_server)), "UTF-8", "UTF7-IMAP");
 
                 // always use "." as folder delimiter
-                $box["id"] = imap_utf7_encode(str_replace($val->delimiter, ".", $box["id"]));
+                // $box["id"] = imap_utf7_encode(str_replace($val->delimiter, ".", $box["id"]));
+                $box["id"] = mb_convert_encoding(str_replace($val->delimiter, ".", $box["id"]), "UTF7-IMAP", "UTF-8");
 
                 // explode hierarchies
                 $fhir = explode(".", $box["id"]);
                 if (count($fhir) > 1) {
-                    $box["mod"] = imap_utf7_encode(array_pop($fhir)); // mod is last part of path
-                    $box["parent"] = imap_utf7_encode(implode(".", $fhir)); // parent is all previous parts of path
+                    // $box["mod"] = imap_utf7_encode(array_pop($fhir)); // mod is last part of path
+                    $box["mod"] = mb_convert_encoding(array_pop($fhir), "UTF7-IMAP", "UTF-8");
+                    // $box["parent"] = imap_utf7_encode(implode(".", $fhir)); // parent is all previous parts of path
+                    $box["mod"] = mb_convert_encoding(implode(".", $fhir), "UTF7-IMAP", "UTF-8");
                 }
                 else {
-                    $box["mod"] = imap_utf7_encode($box["id"]);
+                    // $box["mod"] = imap_utf7_encode($box["id"]);
+                    $box["mod"] = mb_convert_encoding($box["id"], "UTF7-IMAP", "UTF-8");
                     $box["parent"] = "0";
                 }
 
@@ -440,11 +445,13 @@
         // define the rest as other-folders
         else {
                if (count($fhir) > 1) {
-                   $folder->displayname = windows1252_to_utf8(imap_utf7_decode(array_pop($fhir)));
+                   // $folder->displayname = windows1252_to_utf8(imap_utf7_decode(array_pop($fhir)));
+                   $folder->displayname = mb_convert_encoding(array_pop($fhir), "UTF-8", "UTF7-IMAP");
                    $folder->parentid = implode(".", $fhir);
                }
                else {
-                $folder->displayname = windows1252_to_utf8(imap_utf7_decode($id));
+                // $folder->displayname = windows1252_to_utf8(imap_utf7_decode($id));
+                $folder->displayname = mb_convert_encoding($id, "UTF-8", "UTF7-IMAP");
                 $folder->parentid = "0";
                }
             $folder->type = SYNC_FOLDER_TYPE_OTHER;
〜〜〜サンプル〜〜〜

 (7) ディレクトリ
  # chmod 777 /usr/local/apache2/z-push/state

 (8) Apache
  ・/usr/local/apache2/conf/httpd.conf
   Include conf/extra/httpd-php.conf
   Include conf/extra/httpd-z-push.conf

  ・/usr/local/apache2/conf/extra/httpd-php.conf

〜〜〜サンプル〜〜〜
LoadModule php5_module modules/libphp5.so

AddHandler php5-script .php
AddType text/html .php

DirectoryIndex index.php
〜〜〜サンプル〜〜〜

  ・/usr/local/apache2/conf/extra/httpd-z-push.conf

〜〜〜サンプル〜〜〜
Alias /Microsoft-Server-ActiveSync /usr/local/apache2/htdocs/z-push/index.php
〜〜〜サンプル〜〜〜

 (9) 動作確認
  http://[z-pushサーバ]/Microsoft-Server-ActiveSync
  以下の画面が表示されればOK

〜〜〜サンプル〜〜〜
GET not supported
This is the z-push location and can only be accessed by Microsoft ActiveSync-capable devices.
〜〜〜サンプル〜〜〜

 (10) iPhone
  1. 設定>>メール/連絡先/カレンダー>>アカウントを追加>>Microsoft Exchange
  2. 以下の設定を変更
   ・メール
    メールアドレス
   ・サーバ
    z-pushサーバ
    ※後で表示される
   ・ドメイン
    なし
   ・ユーザ名
    IMAPユーザID
   ・パスワード
    IMAPパスワード
   ※アクセス先は https://[z-pushサーバ]/Microsoft-Server-ActiveSync
   ※「証明書を検証できません」というメッセージが表示された場合は了解を選択

広島ブログ

No TrackBacks

TrackBack URL: http://mt.himawari-dream.com/mt-tb.cgi/515

Leave a comment

About this Entry

This page contains a single entry by kado published on 2009年12月19日 15:21.

漢方薬がなくなる!? was the previous entry in this blog.

iPhoneデータ連携(2) CalDAV bedework を入れてみた is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.