FileMakerでOMEを使ってメール送信

更新
新居雅行(msyk@msyk.net)


OMEを使う背景

FileMaker 7 Proには、スクリプトの機能としてメールを送信する機能がありますが、Mac OS Xだと、MailないしはEntourageを起動して、自動的に送信させたり、あるいは編集ウインドウを開いた状態にします。そこから、またMailをコントロールするなどしないとメールは送信できません。別途アプリケーションを起動することをできれば避けたいと思うところですし、特に利用者のデスクトップで共通のメールソフトでメール送信するというのも避けたいと思う場合もあるでしょう。また、この機能はWebからの利用では使えないことになっています。

そこで、OMEを使って、FileMaker 7 Proでのメール送信処理を行うという手法を提唱します。OMEのメール送信は、バックグランドで行われ、即座に送られるようになっています。ファイルメーカーからXMLでデータを出力しXSLTでテキストファイルを作ります。そして送信プロセスを起動すれば、それでOKです。

OMEを使えば、メールを送る場合に72バイトごとの改行を禁則処理を行いながら行うとか、HTMLメールの送信、さらにはHTMLをテキストに展開するなどのさまざまな付加機能が利用できます。SMTPサーバを利用しますが、SMTP認証を使う事ができます。OMEはオープンソースでフリーで使えるため、そこから独自に発展させることも可能です。

OMEを使うための手順

利用するまでの手順を簡単にまとめておきましょう。

一口に「メール送信する」ということを言っても、目的に応じていろいろと違いが出てきます。以下の例では、単一の文面を複数の人に送るということを基本としますが、状況に応じて機能の利用方法は変わってきます。

なお、以下のサンプルはFileMaker Pro 7で示しますが、同様なことは、ファイルメーカーPro 6でも可能です。また、ファイルメーカーPro 6あるいはUnlimited版でWebコンパニオンを使っていれば、データベースファイルが開いているマシン上からメール送信ができます。Webページでフォームを入力し、それに応じてメールを送信するという処理も、ここで紹介した方法で可能です。

OMEのダウンロードとインストール

OMEのダウンロードは、パブリックなリリースと、Nightly Buildがあります。こちらから、dmgファイルをダウンロードしてください。OMEはまだ開発途上であり変化しているので、現状でどれがいいのかは、OMEのメーリングリスト等でご相談いただければと思います。

なお、OMEのメール送信機能はJavaに依存していますが、Javaのバグにより、Java VM 1.4.2ではOMEは利用できません。ただ、送信については問題なくできているような気もしますが、ISO-2022-JPのデコード部分にバグがあるため、Java VM 1.4.2 Update 1以降、ないしはJava VM 1.4.1での稼働をお願いします。

ダウンロードしたdmgファイルをダブルクリックしてマウントします。その中にある、OME_Applicationsフォルダを、「アプリケーション」フォルダに入れてください。このOME_Applicationsは任意のフォルダに置く事は可能ですが、/Applications以外の位置だと設定ファイルにパスを記述してもらう必要があります。お手軽なのは、起動ディスクの「アプリケーション」フォルダにそのまま入れておくことです。

OMEの初期設定

OMEの初期設定は、ウィザード形式のアプリケーションで可能です。これを使って基本的な設定を行います。以下の手順は、とにかく送信だけができるようにするというものです。

1. 「アプリケーション」フォルダ内のOME_ApplicationsフォルダにあるOME_Configuratorというアプリケーションをダブルクリックします。

2. 最初は解説だけですので、そのまま「次へ」ボタンをクリックします。

3. 基本設定を行います。「送信メールサーバ」部分だけの設定でかまいません。最低限の設定は、「SMTPサーバ名」でここにリレー可能なSMTPサーバのFQDNやIPアドレスを記載します。もし、そのSMTPサーバで認証が必要なら、その下にある「SMTP AUTH」のチェックを入れ、「アカウント」「パスワード」に適切な名前を入れます。(SMTP認証は、ログイン、プレーン、DIGEST-MD5に対応します。)「送信メールアドレス」「送信者名」は、いずれも送信するメールのFromフィールドに設定するアドレスと名前ですが、これらはメールの文面に直接埋め込む事もできます。もし、埋め込まれていなければ、ここで定義したメールアドレスと名前が使われます。そして、「次へ」ボタンをクリックします。

4. 続いて表示される画面では特に何も設定しないで、「次へ」ボタンをクリックします。FileMakerで送信専用に使う場合には関係のない設定です。

5. ここでも特になにもしないで、「設定する」ボタンをクリックします。メールボックスのフォルダは現在のユーザホームに作られますが、後から自由に場所は移動できます。「設定する」ボタンをクリックします。

OMEのインストール結果の確認

インストールしたOMEに関して、送信のための基本的な動作を知っていただくために、必ず以下の確認をしてください。

ユーザホームにあるOpen_Mail_Environmentフォルダ

ユーザーホームに、Open_Mail_Environmentフォルダが作成されました。このフォルダを「OMEのルート」や「OMEのメールボックス」と呼びます。通常は、ここのInBoxフォルダに受信したメールがファイルとして残ります。このフォルダ内のOutBoxフォルダ、tempフォルダはそのままにしておいてください。他のフォルダも特に意図がない場合にはそのままにしてください。なお、名前を変更したり、違う場所に移動する事はFinder上での作業だけ可能ですが、異なるボリュームに移動する場合は別途設定(*1)が必要です。

(*1)この作業は、OME_ApplicationsフォルダのUtilitiesフォルダにある「メールボックスのルートを指定」というアプリケーションで行ってください。起動して、ファイル選択のダイアログボックスでOMEのルートフォルダを指定します。

設定ファイルのあるOME_Preferencesフォルダ

ライブラリフォルダのPreferencesフォルダに、OME_Preferencesフォルダがあります。その中にテキストファイルやエイリアスがいくつか作られています。これらが諸設定と考えてください。

送信テスト

OMEルートにあるOutBoxフォルダ内に、「test.wmail」という名前でテキストファイルを作ります。改行についてはなんでもかまいません。文字コードはShift-JISで保存します。たとえば、以下のようなテキストを作って試しに送信をしてください。左側の列の内容だけのテキストファイルを作ります。

From: あなたのアドレス [改行] ←もちろん、自分のアドレスを正しく記入します
To: あなたのアドレス [改行] ←もちろん、自分のアドレスを正しく記入します
Subject: テストメールです [改行] ←ここまでの3行とも、コロンの後には半角スペースが必要です
[改行] ←ヘッダと本文を区切るのは改行だけの行
これはテストメールです。テストでメールを出すので、内容はどうでもかまいませんね。… [改行] ←適当に長いメッセージを書いてみてください。

ファイルを作ったら、OME_ApplicationsにあるOME_SendMailというアプリケーションをダブルクリックして起動します。そうすると、メールが送信されているはずです。

サイレントに動作が終わりますが、メールを受信してみて到着していればOKです。本文は自動的に一定のバイト数で改行が入れられます。

なお、ログについては、OMEのルートフォルダにあるtempフォルダ内のlogsフォルダに作られます。システムログと合わせて、Consoleアプリケーションで参照するようにしておくといいでしょう。

トラブルシューティング

送信できない場合、次の処置を試みてください。

データベースにメール送信機能を組み込む

サンプルのデータベース

データベースのスキーマは以下の通りです。ここでは「アドレス」「文面」のテーブルしか使いません。「アドレス」テーブルは1レコードに1つのメールアドレスを記録し、メールの文面は「文面」テーブルで記録します。なお、「文面」テーブルでは、「件名」と「本文」のフィールドしかありません。いずれのテーブルもidフィールドがありますが、連番を自動的に入力することで、このidフィールドをキーフィールドとして使います。

想定するのは、「アドレス」テーブルにある全メールアドレスに、「文面」フィールドの特定のレコードの件名と文面をメールするということです。そこで、「アドレス」テーブルに「文面id」フィールドを設けましたが、これはグローバルフィールドとしました。そして、そのフィールドには「文面」テーブルのidフィールドの値を手で入れるということにします。

簡単なユーザインタフェースですが、以下のように、「アドレス」テーブルのフィールドが複数あります。「文面」テーブルのどの文面を使うかを「文面id」フィールドの番号で指定しますが、そのリレーション結果はヘッダ領域に配置しています。

XML出力の方針

ここからは実際にどんなふうにメールを出すのかということに依存しますが、大きく分けて、1人ずつ文面を作って出す方法と、たくさんの人に対してまとめてメールを出す方法があるでしょう。ある意味では後者のやり方は前者の方法を含むので、ここでは、たくさんの人に同一のメールを出す方法を説明します。前記のデータベースで、「アドレス」テーブルを基準にして、XMLに出力します。このとき、各レコードには異なるメールアドレスがあるのに対し、別のフィールドではメールの件名と本文がフィールドを確保して付随するはずです。ここでのメールの件名と本文はすべてのレコードで同一ですが、最初の1レコード分だけを使うものとして、同じデータが各レコードにあるという事情は無視する事にします。もちろん、あまりに大量のメールの場合には問題が出るかもしれませんが、数百アドレスくらいならさほどでもないでしょう。数千くらいのオーダーは大丈夫だと思います。XMLとして書き出すデータを模式的にテーブルにすると、次のようになります。

msyk@msyk.netメールの件名メール本文
msyk1@msyk.netメールの件名メール本文
msyk2@msyk.netメールの件名メール本文
msyk3@msyk.netメールの件名メール本文
メールの件名メール本文

XSLTファイルの用意

XML形式で出力されるデータから、OMEの送信ファイルを作成するためのXSLTファイルを作っておきます。注意点はUTF-8を文字セットとして指定し、改行コードはLFにしてください。

以下、XSLTのソースです。ポイントは、まず、出力をShift-JISにすることです。そして、改行コードを変数に保持する方法も確認してください。そして、テンプレートはシンプルで、ルートにマッチしたとき、そこからOMEの送信メールファイルを構成します。件名、本文は単に1レコード目から取り出しますが、メールの宛先はBcc:のヘッダーに並べます。Fromについては適当なアドレスや名前をソースに直接記述しました。

<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0"
		xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
		xmlns:fmp="http://www.filemaker.com/fmpxmlresult" >
<xsl:output method="text" encoding="Shift_JIS" indent="yes" />

<xsl:variable name="nextLine">
<xsl:text>
</xsl:text>
</xsl:variable>

<xsl:template match="fmp:FMPXMLRESULT">
	<xsl:text>From: メルマガ編集部 &lt;msyk1@msyk.net&gt;</xsl:text>
	<xsl:value-of select="$nextLine" />
	<xsl:text>Subject: </xsl:text>
	<xsl:value-of select="fmp:RESULTSET/fmp:ROW[1]/fmp:COL[2]/fmp:DATA" />
	<xsl:value-of select="$nextLine" />
	<xsl:text>To: </xsl:text>
	<xsl:for-each select="fmp:RESULTSET/fmp:ROW">
		<xsl:if test="position() &gt; 1"><xsl:text> ,</xsl:text></xsl:if>
		<xsl:value-of select="fmp:COL[1]/fmp:DATA" />
	</xsl:for-each >
	<xsl:value-of select="$nextLine" />
	<xsl:value-of select="$nextLine" />
	<xsl:value-of select="fmp:RESULTSET/fmp:ROW[1]/fmp:COL[3]/fmp:DATA" />
	<xsl:value-of select="$nextLine" />
</xsl:template>

</xsl:stylesheet>

メール送信ファイルを書き出すスクリプトステップ

それでは、実際にメール送信を行うスクリプトの作成方法を順を追って説明しましょう。ただ、実際には、上記のようにいきなりXSLTが完成しているということはないと思います。XSLTファイルを適当に作って以下の手順を行ってスクリプトを作成し、そこからXSLTをデバッグするということになると思われます。

なお、手順としては長々と書いていますが、ポイントとしては、まずはレコードのエクスポートを使ってレコードをXMLに出力しますが、前記のXSLTファイルを適用し、かつ適用結果をOMEのOutBoxフォルダに拡張子が.wmailのファイルとして保存するわけです。そして、AppleScriptの実行ステップで、バックグランドでOMEのメール送信プログラムを実行させています。OMEの送信プログラムは、前記のようにアプリケーションフォルダにインストールしている場合は、どのMacでも同様ですが、そうではない場合はjavaコマンドの実行パラメータを適時修正してください。

1. スクリプトの編集状態になっているとします。まず、「レコードのエクスポート」のステップを1つ追加します。

2. 「出力ファイルの指定」チェックボックスをクリックすると、次のように、変換したXMLファイルの保存場所を指定するダイアログボックスが表示されます。まず、ファイルタイプにはXMLを選択します。(この画面は以下のステップ3を実行した後の状態です。)

3. 「ファイルの追加」ボタンをクリックすると、XMLを変換した結果を保存するファイルを指定するダイアログボックスが表示されます。ここで、Open_Mail_Environmentフォルダ(OMEのメールボックスのルート)の中にあるOutBoxフォルダを選択します。このOutBoxフォルダに変換結果が保存されるようにします。また、ファイル名は、upload.wmailなど、拡張子を必ず.wmailにしておきます。

4. 「出力ファイルの指定」ダイアログボックスでOKボタンをクリックすると、次にXSLTファイルを指定するダイアログボックスが表示されます。文法は、FMPXMLRESULTを選択します。そして、「XSLスタイルシート」のチェックボックスをオンにします。

5. 「ファイル」のラジオボタンを選択します。

6. すると、XSLTファイルを指定するダイアログボックスが表示されます。このダイアログボックスは、以下の手順7を実行した後の状態です。

7. 「ファイルを追加」ボタンをクリックすると、XSLTファイルを選択するダイアログボックスが表示されます。あらかじめ作っておいたXSLTファイルを指定して、OKボタンをクリックします。

8. 「ファイル指定」のダイアログボックスにXSLTファイルのパスが追加されたことを確認して、OKボタンをクリックします。すると、「レコードのエクスポート」のスクリプトステップのパラメータ編集画面になります。

9. 続いて「エクスポート順」のチェックボックスをオンにします。

10. エクスポートするフィールドと順序を指定するダイアログボックスが表示されます。左側でまず、「メールアドレス」を選択して「移動」ボタンをクリックします。そして、左側のリストの上部のポップアップメニューから「文面」を選択して、件名、本文をそれぞれ「移動」させて右側のリストに追加します。この順序と、前に紹介したXSLTファイルの記述内容は正しく対応がとれている必要があります。

11. OKボタンをクリックします。これで、「レコードのエクスポート」スクリプトステップはできあがりました。

12. 「AppleScriptを実行」スクリプトステップを追加します。

13. 「指定」ボタンをクリックし、以下のAppleScriptのプログラムをダイアログボックスで入力します。

do shell script "java -cp /Applications/OME_Applications/tools/OME_lib.jar OME.sendmail.OME_SendMail"