OMEで受信メールをFileMakerに取り込み

更新
新居雅行/msyk@msyk.net

このページでは、OME、FileMaker 7、Webアプリケーションといったテーマでのある実験を紹介します。ポイントとなることはいくつもありますが、それらを箇条書きでまとめると、次のようなものになります。

使用したソフトウエアなどは以下の通りです。以下で紹介するファイルは、ここをクリックしてダウンロードできます。このファイルに含まれているものについては、このページではこのようなスタイルで記述します。ただし、ダウンロードして適切な位置の配置しないと機能しません。ダウンロードするだけでは何も機能しないと思われるので、そのつもりでご覧ください。

システムの概要

Webアプリケーションではデータベースの利用は不可欠であるとも言えます。たとえば、通販サイトでは、注文内容を記録しておくのにデータベースを使いたくなります。そのWebとデータベースを連動させるための手法はさまざまなものが利用されていますが、Webサーバ、そしてサーバー上でデータベースを稼働させるとういことが基本となっているでしょう。

ここでの試みは、WebインタフェースはグローバルIPアドレスにあるサーバに持つとしても、実際のデータの保持を、クライアントコンピュータのFileMaker Pro 7で行おうというものです。クライアントコンピュータは、プライベートIPアドレスにあってもかまいません。言い換えれば、データベースそのものは、インターネットに晒さないといった状態にすることができます。サーバにデータベースが存在していれば、どんなに管理していても、アタックの対象になりますが、クライアントにあるデータベースそのものはアタックの対象にはなりません。どっちがセキュリティが高いかというのは議論の余地はあり、安全を確保するやり方が違い、危険と安全の場面が違うということになるのですが、それでも、「サーバにデータを残さない」という手法も、個人情報の保護という点からも利点はあると思われます。

WebサーバとFileMakerが稼働しているクライアントの通信は、メールを使うことにします。メールはリアルタイムなプロトコルではないものの、現状のブロードバンド通信環境や、あるいはサーバ環境を考えれば、かなりの短時間での伝達も不可能ではありません。また、メールを使うことで、独自にプロトコルを繰ることに比べてはるかに簡単にかつ安定して通信処理ができると言えるでしょう。


商品申し込みのページ


実際に稼働させるシステムは、簡単な通販サイトです。商品一覧と申し込みフォームがいっしょになったような簡単なシステムにします。テーブルで取扱商品がリストアップされていて、それぞれの商品の個数がテキストフィールドとなっており、注文数を入力します。加えて商品の送付先住所を入力するといったフォームになっています。このページは、事実上、スタティックなページであり、データベースアクセスはしていません。

このページの最初にある構成図で言えば、赤色の矢印線で示された流れが、商品の申し込みになります。それに従って動作を説明しましょう。まず、「商品申し込みページ」は右のようなものとなっています。このページを表示するPHPのソースが添付したファイルのindex.phpです。また、フォームに入力してサブミットした後も同様にindex.phpが呼び出されます。住所や名前がないかどうかなどのチェックを行う機能に加えて、正しい場合の処理もまとめてindex.phpに記載しています。

index.phpは、もちろん、PHPが稼働するWebサーバの公開ディレクトリに配置します。このファイルでは、少なくとも、発注メールを受け取るアドレスを自分で受信可能なメールアドレスにしてください。$shopEmail変数にそのアドレスを設定します。メール送信を行うために、同じフォルダにOME.phpを配置してください。OME.phpについては配布ファイルに含めていますが、バグ修正などがあった場合には、SourceForge.jpのOMEのCVSレポジトリでアップデートされています。

index.phpにある商品一覧の部分は、ItemsMaster.phpというPHPのソースを読み込んで構成しています。このソースが、商品一覧の配列を代入するプログラムになっています。これについては自分で作成するのではなく、FileMakerのデータベースから自動的に生成を行います。後の『商品マスターを注文ページに反映』で説明します。

ページを表示し、商品の個数や送り先などを正しく入力すると、ページには「注文を送信しました。」と表示されます。このとき、PHPのプログラムでは、メール送信のライブラリOME.phpの機能を利用して、あるメールアドレスにメールを送信します。メールの形式は、人間が読むものではなく後でコンピュータで解析させるものなので、見栄えよりも処理のしやすさを考慮して、以下のような形式のものにしました。つまり、ITEM:で始まる行が、注文書品の情報で、///で区切って注文個数と商品番号が記載されています。NAME:などの以下の部分は、送り先としてテキストフィールドに入力したものです。

-----------受注通知

ITEM:1///1003
ITEM:1///1005


NAME:新居雅行
EMAIL:msyk@mac.com
PCODE:999-9999
ADDRESS:埼玉県暮具市九分3-9-12
COMPANY:立方体通信社
TEL:048-199-1919

このメールの生成は、index.phpで行われています。メールの形式を変更したい場合は、そのファイルのプログラムを変更します。

申し込みメールをFileMaker Pro 7に取り込む

Webページで申し込みがあると、PHPからはindex.phpのソースの中で指定したメールアドレス(ここの例では、$shopEmail変数変数に指定したmsyk3@msyk.net)にメールを送ります。ここで、PHPで使っているOME.phpでは、Webサーバに組み込まれているsendmailコマンドを起動してメールを送るので、つまりは、msyk.netに対してDNS問い合わせをして得られるMXがポイントするSMTPホストにメールが送られ、そこにあるmsyk3のメールボックスにメールが届くということになります。そして、クライアントコンピュータからは、OMEを使ってmsyk3のメールボックスからメールをPOPでダウンロードすることになります。OMEでのメール受信が可能になるまでの設定についてはここでは省略します。メールが受信できるものとします。

メールの件名は「[ショップOME] 受注通知」としています。このシステムが発するメールの件名の最初は、常に [ショップOME] といった文字列になっているようにして、メールソフトの振り分けの設定で、Webサーバから送られてきたメールだけに対する処理を確実に行えるようにしておきます。振り分けの設定(Moving_Info.txt)では、たとえば、以下のようにしておきます。これによって、送られてきたメールはShoppingSiteフォルダに保存されると同時に、msykユーザの書類フォルダにあるOME2FMP7.appというアプリケーションを起動し、このアプリケーションがメールをFileMaker Pro 7の開いているデータベースにレコードを挿入します。OME2FMP7.appのソースはOME2FMP7.applescriptですが、こちらをコンパイルして、「アプリケーション」として保存するのがいいと思われます(コンパイルのためのスクリプトがCompile.commandで、これをダブルクリックするとコンパイルして、OME2FMP7.appを生成するはずです)。このスクリプトでは、データベース側に仕込んだスクリプトを呼び出しているので処理が複雑ですが、基本的にはメールの内容を解析してデータを取り出し、注文と明細の2つのテーブルに適切にレコードを作り、さらに注文内容をメールで返信するといったものです。このとき、データベースオンラインショップ.fp7がFileMaker Pro 7で開かれていることを仮定しています。

	:
[Subject:]
[ショップOME],ShoppingSite,MessageMakerClasses={"StandardSave","
SucceedProcess"},/Users/msyk/Documents/OME2FMP7.app
	:

OME2FMP7.appファイルへのパスを、実際にインストールした結果に合わせて記述します。パスは、ディレクトリ名を記載するのが無難です。

開いているオンラインショップ.fp7というデータベースにメールが取り込まれた結果は以下のように、データベース上で参照できます。

レコードを追加すると同時に、確認メールの送信まで行っています。動作のコントロール自体は、AppleScriptのプログラムOME2FMP7.applescriptに記載されていますが、ここで、データベースにある「受注確認メール送信」というスクリプトを稼働しています。ここでは、レコードの内容をXSLTを使ってOMEの送信メールを生成し、OMEのメール送信プログラムをバックグランドで稼働させてメールを送信します。ここで使用しているスタイルシートはOrderConfirmMail.xslです。以下のようなメールが送信されます。

From: OMEオンラインショップ <msyk@msyk.net>
To: msyk@mac.com
Subject: ご注文内容の確認
Bcc: msyk@msyk.net

新居雅行様

オンラインショップをご利用いただきありがとうございます。ご注文内容を確認させていただきます。

●ご注文内容
商品名:USBコントロール電気スタンド
 単価:7800円/個数:1/金額:7800円

合計金額:20600円
消費税額:1030円
請求金額:21630円

●アクセスコード
1051917939610

●お届け先
お名前:新居雅行
会社名(ご所属):立方体通信社
郵便番号:999-9999
住所:埼玉県暮具市九分3-9-12
電話番号:048-199-1919
メールアドレス:msyk@mac.com

このメールの文面を変更したい場合は、スタイルシートOrderConfirmMail.xslを変更します。データベースオンラインショップ.fp7にある「受注確認メール送信」というスクリプトは、OMEの送信メールボックス(OutBoxフォルダ)にファイルを書き込むように設定されています。実際のOMEの送信メールボックスファイルをポイントするようにレコード書き出しのステップのパラメータを変更します。

商品マスターを注文ページに反映

FileMakerのデータベースには商品マスターをテーブルとして作ってあります。こちらに実際に販売可能な商品をリストアップしておきます。

そして、スクリプトの「商品マスター書き出し」を実行します。このスクリプトは、商品マスターの一覧に対してMakeItemsMaster.xslというXSLTを適用し、ItemsMaster.phpというファイルを生成します。このItemsMaster.phpが、注文ページであるindex.phpで読み込める場所に何らかの方法でコピーしておくことで、データベースの商品マスターをWebサイトに反映させることができます。以下は、ItemsMaster.phpの例です(実際には改行は入りません)。つまり、PHPのプログラムの断片となっていて、このファイルをインクルードすると、配列$itemMasterを、プログラム中で商品マスターとして利用できるようになるというわけです。

<?php $itemMaster = array(
	array( itemID=>'1001', itemName=>'スペシャル16進電卓', itemPrice=>2430 ),
	array( itemID=>'1002', itemName=>'マウスカバー', itemPrice=>560 ),
	array( itemID=>'1003', itemName=>'USBコントロール電気スタンド', itemPrice=>7800 ),
	array( itemID=>'1004', itemName=>'ワイアレス電源', itemPrice=>65300 ),
	array( itemID=>'1005', itemName=>'重量可変ペーパーウエイト', itemPrice=>12800 ),
	array( itemID=>'1006', itemName=>'OME商品版豪華DVD付き', itemPrice=>9800 )
); ?>

実際には、「商品マスター書き出し」スクリプトはさらに調整が必要です。ファイルサーバ等でWebサーバへの接続ができる場合には、レコード書き出しのスクリプトステップで、書き出すファイルをサーバ側に指定します。そうでない場合は、どこか適当な場所にItemMaster.phpファイルを書き出し、Webサーバにrsyncやcurlのコマンドでアップロードするのがいいかと思われます。

受注内容の確認

このページの最初の構成図にある緑色の矢印の流れを説明しましょう。想定するのは、オンラインで注文した人が、自分の注文のステータス、つまり発送済みかどうかといったことを確認できるようにするというものです。発注した人へは、原則として確認メールが送られていますが、そこにアクセスコードという数字だけの情報が含まれています。このコードはFileMakerのデータベース上で発注ごとにランダムに生成されています。オンラインショップ.fp7データベースにある「オンライン発注」テーブルの「アクセスコード」フィールドの定義を参照してください。このアクセスコードを用いて、他人の発注内容を参照される確率が極めて低くなるようになっています。


出荷確認のフォームも、index.phpで表示されるようになっています。ここで、アクセスコードを入力し、結果をメールで受け取るのか、あるいはWebで参照するかといった選択肢があります。サブミットすることで、やはりindex.phpを呼び出しますが、ここでも発注のときと同様に、index.phpからメールを指定したアドレスに送ります。そして、クライアントコンピュータでそのアドレスのメールボックスをPOPで取得し、OME2FMP7.appというアプリケーションを使ってメールを解析し、データベースにメールの内容を挿入して、以後の処理を行います。発注のときとまったく同じプログラムやスクリプトを使っていますが、それらのプログラム中で、発注か確認かを条件分岐させて処理を1つのプログラムにまとめています。

Webで出荷確認を参照する場合

確認をWebで受け付けるように指定した場合は、Webサーバ側のindex.phpは、サーバに確認結果が記載されたファイルが登場するまで待ちに入ります。従って、リクエストを出したクライアント側は、応答を待つような感じになります。しばらく待つと、発注結果とステータスとがWebページに表示されます。

index.phpで確認のフォームでサブミットしたとき、Webサーバからクライアントへは、アクセスコードとともに、自動的に生成したセッションコードが送られます。リクエストのメールを取り込んだクライアント側では、アクセスコードをもとに発注レコードを検索して、該当する発注を検索し、「セッションコード.html」というファイルを生成します(たとえばサンプルファイルにある168674.html)。ファイルの生成には、ShipingConfirmWeb.xslというXSLTを使います。実際には、このファイルを、Webサーバのindex.phpと同じディレクトリなどに転送する必要があります。

スクリプトの「確認依頼へのWeb応答」ではファイルに保存するまでしか行っていませんが、現実にはrsyncやftp、curl等を用いてサーバに転送するプログラムを組み込む必要があるでしょう。さらに、サーバ側では、クライアントに情報を転送した後、「セッションコード.html」というファイルを削除するようにしています。そのため、Apacheのアカウントがファイル削除の権限があるように、OS側のアクセス権を調整する必要があるでしょう。

Webからの確認の問題点と高速化

なお、確認をしている側から見ればWebでフォーム入力し、その結果をWebで参照していますが、実際にはリクエストをクライアントに送るためにメールを使っています。ここで、POPの受信をたとえば3分ごとなどとしていると、下手をすると3分強の待ち時間が必要になり、いくらなんでも処理の上では問題になります。そこで、一つの簡便な方法は、POPの受信タイミングを10秒ごとなどと極めて短くしておくことです。そうすれば、いろいろな処理を合わせても、30秒〜60秒くらいでの応答は可能です。もちろん、これでも遅いと言えば遅いのですが、あらかじめフォームのあるページでお断りなどすれば、実用上はかまわない場合も決して少なくはないと思われます。状況によっては、メールサーバからクライアントに通信をしてメール受信を知らせるような仕組みと併用すると、よりスピードアップすると思われますが、この方法は使える場面が限られるでしょう。たとえば、NotifyMailのようなものがあります。なお、一般的なメール通知ソフトは一定時間ごとにPOPサーバをチェックするタイプなので、それだとPOP受信間隔を非常に短くして対応するのと同じことです。NotifyMailはサーバでメールを受けるとクライアントにfingerで通知するといった仕組みのものです。このあたり、ネットワークに詳しい人なら、特にソフトを買わなくても仕組みを聞けばピンと来ると思います。aliases等でメールを受けたときにメールボックスに入れるとともに、指定したクライアントにfingerを投げます。クライアントではfingerを受け取るとメールのダウンロードに行くようにすればいいわけです。ただし、そうなると、クライアントをグローバルにさらさないで運用するとなれば、たとえばメールサーバがDMZにあるとか、2ポート備えていて、クライアントとサーバはローカルIPで通信できるといった状況でなくてはなりません。

メールで出荷確認を参照する場合

もし、メールで確認結果を受け取る場合は、FileMakerのスクリプト「確認依頼への応答メール送信」を実行して、結果をメールします。ここまでの動作は、発注と同様です。OMEの送信メールを生成するためのスタイルシートはShipingConfirmMail.xslです。(あ…注文日に名前が出ている。バグですね、すみません…)

From: OMEオンラインショップ 
To: msyk@mac.com
Subject: ご注文内容の確認
Bcc: msyk@msyk.net

新居雅行様

ご注文内容の確認を依頼されました。ご指定されたご注文は以下の通りとなっています。

●ご注文日新居雅行

●発送状況発送済

●ご注文内容
商品名:USBコントロール電気スタンド
 単価:7800円/個数:1/金額:7800円

合計金額:20600円
消費税額:1030円
請求金額:21630円

●アクセスコード
1051917939610

●お届け先
お名前:新居雅行
会社名(ご所属):立方体通信社
郵便番号:999-9999
住所:埼玉県暮具市九分3-9-12
電話番号:048-199-1919
メールアドレス:msyk@mac.com

このメールの文面を変更したい場合は、スタイルシートShipingConfirmMail.xslを変更します。データベースオンラインショップ.fp7にある「確認依頼への応答メール送信」というスクリプトは、OMEの送信メールボックス(OutBoxフォルダ)にファイルを書き込むように設定されています。実際のOMEの送信メールボックスファイルをポイントするようにレコード書き出しのステップのパラメータを変更します。

その他

結果的に、クライアントは常時電源を入れたままにして、FileMaker Pro 7を起動したままにする必要があります。ただし、Webでの出荷確認を省略すれば、その限りではありません。スクリプトを調整することで、たとえば確認メールはすぐに出さないで、メッセージを追加してから出すようなことも不可能ではありません。

本システムのような稼働方法は、FileMaker Pro 7のライセンス的には微妙かと思われます。ライセンスの第2条(c)の一部は以下のようになっています。ここで、メールを通じてデータのやりとりをする仕組みが「アクセス」かどうかは微妙で、通常のCGI等のアクセスとは明らかに違ったものかと思われます。つまり、クライアントからのリクエストを得るために、FileMaker Proへ至るまでのOMEの動作が、FileMaker Proが稼働しているコンピュータ(ページ最初の構成図での「クライアントコンピュータ」)にとっては「やってくる」のではなく「取ってくる」という動作であるので以下の条項の「アクセス」にはあたらないと考えます。しかしながら、この解釈が正しくないというのであればご連絡をください。必要ならば、ページの掲載も取りやめます。

データベースに2クライアント以上がアクセスすることを可能にするミドルウェア、アプリケーション・サーバー、CGIまたはその他のソフトウェアもしくは技術とともに、本ソフトウェアを使用してはなりません。