UVJ Mailer Scripting

Motoyuki Tanaka (mact@antares.ecn.fpu.ac.jp)

Last Modified: March 23, 2002


はじめに

UVJ Mailer 3.0 を AppleScript で活用する方法の説明を行います。

Contents


UVJ Mailer の処理の仕組み

UVJ Mailer の処理の仕組み(流れ)について簡単に説明しておきます。基本的な機能であるメールの送信の処理を取り上げます。

UVJ Mailer は、AppleScript/AppleEvent によってメール送信の依頼を受けとると、以下の手順で処理を行っていきます。

1:受け取ったデータをインターネットのメールにふさわしい形に変換する

漢字コードを JIS に変換し、From や Subject の場合はさらに MIME 形式への変換を行います。また、改行コードは CRLF に変換します。

また、送り先の指定にニックネーム(Address Book に登録する省略名)が使われていた場合には、この時点で、正しいアドレスへの変換が行われます。

さらに、メールのヘッダもこの時点で生成されます。ですから、Date ヘッダは、UVJ Mailer がメールを受け付けた時点の日時で発行されます。

2:変換されたデータを Queue に登録する

Queue というのは送信待ちのメールの控室みたいなものです。ここにデータを登録します。そして、同時にスプールファイルとして、メールのデータのバックアップのファイルを作成します。

UVJ Mailer では、 spool フォルダ内のスプールファイルは、異常終了などの際に未送信のメールのデータが失われるのを防ぐために作られます。送信のデータそのものは UVJ Mailer がメモリー上に確保し管理しています。起動時に spool フォルダ内にスプールファイルが残っていた場合(前回の終了の際に未送信のメールが残ったことを意味する)、そのファイルのデータがメモリー上に読み込まれ、Queue に登録されるようになっています。

3:AppleScript/AppleEvent に対してリプライを返す

ここまでの処理が終わった時点で、AppleScript でメールの送信を依頼してきたクライアント(スクリプト)に対して Reply を返すようになっています。

つまり、メールの送信が完了する前に reply を返すようになっています。この点は注意して下さい。

ここまでの処理でエラーが生じた場合には "Error" という文字列を返しますし、無事に控室(Queue)に登録が行われたときには、スプールファイルのファイル名が返されます。

スプールファイルのファイル名は、spool reference として、メールの状態の確認等の際にメールを識別するための手がかりに使います。

4:送信処理

Queue (控室)にメールが登録されると、そのメールの送信処理が開始されます。

送信中に何らかのエラーが生じた場合には、そのメールのデータにエラーメッセージを追加して、error spool フォルダの中にスプールファイルが作成されます。

何の問題もなくメールが送信できたときには、スプールファイルは、送信完了後に削除されます。

以上が、メール送信の処理の流れです。

スクリプトを書くうえで覚えておいて欲しいことは、送信系のコマンドは、あくまでもメールを Queue に登録するものであること、つまり送信が無事に行われたかどうかは、送信系のコマンドでは直接は確認できないということです。

メールが無事に送信できたかどうかは、送信系のコマンドのリプライとして返されるスプールファイルの名前(spool reference)をもとに、改めて確認する必要があるわけです(確認用のコマンドも作ってあります)。


AppleScript で何ができるのか?

UVJ Mailer を AppleScript で操作する場合、大きく分けて2つの事が可能です。

メール送信

データやファイルをメールとして送信するものです。UVJ Mailer の基本的な機能であり、存在理由でもあります。

受け取ったデータ/ファイルをインターネットのメールにふさわしい形に変換してから送信するものだけでなく、予め指定した日時になると発送を行なう予約送信機能や、インターネットのメールとしてふさわしいフォーマットになっているデータ/ファイルを無変換で送りだすことも可能です。

環境設定・状況確認

初期設定(Preference)で設定する各項目の値の変更や、アドレスブックの操作、あるいはキューに残っているメールやエラーになったメール、timer の確認や削除などが行えます。

Standard suite によるオブジェクトの操作で行うようになっています。

以下、この上記のグループ分けにそって、実装してあるコマンドを順に説明していくことにします。


メール送信

メール送信系のコマンドとして実装してあるのは、以下のコマンドです。

  1. send mail --- データの送信
  2. schedule mail --- データの予約送信
  3. send raw data --- データの無変換送信
  4. send file --- ファイルの送信
  5. schedule file --- ファイルの予約送信
  6. send raw file --- ファイルの無変換送信
  7. send using template --- テンプレートを使った送信
  8. status of mail --- メールの処理状況の確認
  9. compile header --- RFC822 に則したメール用ヘッダの作成

これらのコマンド(status of mail は除く)の共通点として、以下の項目(パラメータ)を指定しなかった場合には、Preferences で設定したデフォルトの設定のものが使われるようになっているということがあります。

また、送り先のアドレスの指定に、Address Book に登録した nickname を使うことができます(ただし、compile header を除く)。

Preference で「すべてのメールをこのサーバで送る」にチェックを入れてあった場合には、コマンドのパラメータの指定に関係なく、すべてのメールがPreference で指定したメールサーバを使って送りだされるようになります。複数のメールをまとめて送る場合には、「すべてのメールをこのサーバで送る」をチェックしておいたほうが送信のための処理時間が短くなります(不要な接続処理を行わなくてもよくなるため)。

なお、複数のメールを連続して送る場合、もし同じサーバを使うようになっていた場合には、接続を切らずに処理するようになっています。ですから、複数のサーバを利用する場合には、同じサーバを利用するメールはなるべくまとめて送信処理を行うようにすれば、処理時間を短くすることができます。

では、順にコマンドの書式などをみていきます。


send mail: データ送信

書式:

    send mail string  -- メール本文
        to string -- 送り先のアドレス
        [from string] -- 差出人のアドレス
        [SMTP gateway string] -- 送信に使用するメールサーバ
        [password  string]  -- SMTP 認証のパスワード
        subject string -- メールの題名
        [CC string] -- Cc のアドレス
        [BCC string] -- Bcc のアドレス
        [custom headers string] -- 追加するヘッダ
        [name string] -- 差出人の名前
        [banner alias] -- バナーファイル(本文の冒頭に追加)
        [signature alias] -- 署名ファイル(本文の末尾に追加)

    Result: string  -- spool reference (スプールファイルの名前)

一番単純なメール送信のスクリプトは、メール本文、送り先、題名を指定した以下のようなスクリプトになります。

-- Script 01 --
tell application "UVJ Mailer"
    send mail "げんきぃ?" to "motoyuki@aaa.bbb.jp" subject "挨拶"
end tell

この場合、先ほども述べたように、メールの差出人のアドレスと名前、および使用するメールサーバは Preference で指定したものが使われることになります。

Preference とは異なるアドレスでメールを出す場合には、

-- Script 02 --
tell application "UVJ Mailer"
    send mail "げんきぃ?" to "motoyuki@aaa.bbb.jp" from "xxx@yyy.zzz.jp"  subject "挨拶" name "別名"
end tell

ということになります。

複数の人に同時にメールを送りたいときには、to に複数のメールアドレスを,(コンマ)で区切って並べて指定して下さい。

-- Script 03 --
tell application "UVJ Mailer"
    activate
    send mail "げんきぃ?" to "motoyuki@aaa.bbb.jp,tanaka@ccc.ddd.jp" subject "挨拶"
end tell

メールの送り先指定には Address Book に登録した nickname を使うことができます。たとえば、「田中」という名前で motoyuki@aaa.bbb.jp を登録してある場合には、

-- Script 04 --
tell application "UVJ Mailer"
    send mail "げんきぃ?" to "田中" subject "挨拶"
end tell

というスクリプトが使えます。

SMTP 認証(CRAM-MD5 による認証)を行なう場合は、password に認証用のパスワードを渡してください(通常は、POP サーバのパスワードが使われます)。ただし、from (差出人アドレス)も同時に指定しないかぎり、password が有効になりません。ですから、デフォルトの設定(Preference で設定したもの)とは異なる認証パスワードを用いるとか、あるいはデフォルトでは認証を行なうようになっていない(認証パスワード欄が空欄)場合に認証を行なわせたい場合には、必ず from と password を対で指定する必要があります。「SMTP 認証を必ず行なわせたいときには、スクリプトの中で、from と password の指定を行なう」と覚えておいてもらえば確実でしょう。

Cc や Bcc で同時発送する場合には、それぞれのパラメータにメールアドレスを書いておきます。コンマで区切ることで複数のアドレスが指定できますが、この2つのパラメータの場合には nickname による指定は行えません

メールに独自のヘッダを追加したい場合には、custom headers パラメータにヘッダを渡してください。たとえば、メールソフトの種類を示すのに使われるX-Mailer ヘッダと、返信先を指定する Reply-To ヘッダを追加したい場合には、

-- Script 05 --
tell application "UVJ Mailer"
    send mail "やっほ〜" to "田中" subject ツ
        "挨拶" custom headers ("Reply-To: motoyuki@aaa.bbb.jp" & return & "X-Mailer: UVJ Mailer")
end tell

というスクリプトになります。このように、複数のヘッダを追加する場合にはreturn で区切った(改行した)形で渡してください。

banner と signature はテキストファイルに記録しておいた定型文をメールに追加するためのものです。テキストファイルに書いておいたメッセージをメールの本文に追加できます。予め作成しておいたテキストファイルをパラメータで渡すようにしてください。banner に指定すると、ファイルの内容がメールの本文の先頭に挿入されます。また signature に指定すると、メールの本文の最後に追加されます。

schedule mail: データを予約送信

書式:

    schedule mail  string  -- メール本文
        to  string  -- 送り先のアドレス
        [from  string]  -- 差出人のアドレス
        [SMTP gateway  string]  -- 送信に使用するメールサーバ
        [password  string]  -- SMTP 認証のパスワード
        subject  string  -- メールの題名
        [CC  string]  -- Cc のアドレス
        [BCC  string]  -- Bcc のアドレス
        [custom headers  string]  -- 追加するヘッダ
        [name  string]  -- 差出人の名前
        [banner  alias]  -- バナーファイル(本文の冒頭に追加)
        [signature  alias]  -- 署名ファイル(本文の末尾に追加)
        sending on  string  -- 送信日時 (YYYYMMDDHHMMSS)

    Result:   string  -- spool reference (スプールファイルの名前)

予め指定した日時になるとメールを送信するものです。イベントの告知や、自分宛にスケジュールのアラーム代わりにメールを送るといった場合に使えます。

sending on パラメーターで送信日時を指定するようになっている以外は、send mail と同じです。

sending on パラメータで送信日時を指定する際には、年(4桁)・月(2桁)・日(2桁)・時(2桁)・分(2桁)・秒(2桁)の半角数字を連結したタイムスタンプ(14文字になります)で日時を指定します。たとえば、2002年4月1日午前0時にメールを送信したい場合には、sending on パラメータに 20020401000000 という文字列を渡すことになります。

AppleScript の date オブジェクトでは指定できませんので気をつけてください(もっとも、date オブジェクトで未来の日付をきちんと作成するのは難しいですから、誰も、あんな面倒なものを扱いたくないでしょうが)。

なお、当然のことながら、過去を指定することはできません。

send raw data: データを無変換で送信

書式:
    send raw data string  -- データ
        to string -- 送り先アドレス
        [from string] -- 差出人アドレス
        [SMTP gateway string] -- メールサーバ
        [password  string]  -- SMTP 認証のパスワード

    Result: string  -- spool reference

ダイレクトパラメータで渡されたデータを、一切手を加えずにサーバに送り出すコマンドです。メールの転送などの処理を想定したものです。

データはインターネットのメールに適したフォーマット(最低でも RFC821 に準ずるもの)になっている必要があります。また、適切なヘッダも付けておく必要があります。

ノーチェックで、データをそのまま送信しますので、普通のテキストデータの送信には使わないでください。

send file: ファイル送信

書式:

    send file alias  -- 送信するファイル
        to string -- 送り先アドレス
        [from string] -- 差出人アドレス
        [SMTP gateway string] -- メールサーバ
        [password  string]  -- SMTP 認証のパスワード
        subject string -- 題名
        [CC string] -- Cc:
        [BCC string] -- Bcc:
        [custom headers string] -- カスタムヘッダ
        [name string] -- 差出人の名前
        [banner alias] -- バナーファイル
        [signature alias] -- 署名ファイル
        [binhex attachment boolean] -- Binhex ファイルを添付ファイル形式で送るか?
        [message string] -- Binhex ファイル添付の際に添えるメッセージ
        [deleting boolean] -- 送信後にファイルを削除するか

    Result: string  -- spool reference

テキストファイルの内容をメールとして送信します。

-- Script 06 --
tell application "UVJ Mailer"
    send file alias "Macintosh HD:Development:myProject" to "tanaka@aaa.bbbb.jp" subject "計画書"
end tell

基本的には、送信する対象が異なるだけで、パラメータなどは send mail の場合と同じなのですが、ファイルが Binhex4 のファイルの場合に有効になるオプションが含まれている点が異なります。

ダイレクトパラメータに渡すファイルが Binhex のファイルだった場合には、そのファイルをファイル添付の形式で送ることが出来ます(multi-part MIME 形式のメールになります)。その場合、メールの本文にあたる文章を message パラメータで指定できます。

-- Script 07 --
tell application "UVJ Mailer"
    send file myBinhexFile to "tanaka@aaa.bbbb.jp" subject ツ
        "UVJ mailer" message "ようやく fc2 をリリースしました。" with binhex attachment
end tell

上記のスクリプトによって myBinhexFile で指定したファイルを MIME 形式で添付した形のメールとして送ることになります。受信する相手のメールソフトがMIME と Binhex に対応している必要がありますので、この点は注意してください。なお、UVJ Mailer は、指定されたファイルが Binhex かどうかを、ファイルの1行目に

(This file must be converted with BinHex 4.0)

と書かれているかどうかでチェックを行うようになっています。

なお、Binhex ファイルの送信の場合には、banner と signature の指定は無効になります(無視されます)。

送信後にファイルを削除したい場合には deleting パラメータを true にしてください(with deleting)

-- Script 08 --
tell application "UVJ Mailer"
    send file myFile to "tanaka@aaa.bbbb.jp" subject "計画書" with deleting
end tell

schedule file: ファイルを予約送信

書式:

    schedule file  file specification  -- 送信するファイル
        to  string  -- 送り先アドレス
        [from  string]  -- 差出人アドレス
        [SMTP gateway  string]  -- メールサーバ
        [password  string]  -- SMTP 認証のパスワード
        subject  string  -- 題名
        [CC  string]  -- Cc:
        [BCC  string]  -- Bcc:
        [custom headers  string]  -- カスタムヘッダ
        [name  string]  -- 差出人の名前
        [banner  alias]  -- バナーファイル
        [signature  alias]  -- 署名ファイル
        sending on  string  -- 送信日時 (YYYYMMDDHHMMSS)
        [deleting  boolean]  -- 送信後にファイルを削除するか

    Result:   string  -- spool reference

テキストファイルを、予め指定しておいた日時になったら送信するものです。

sending on パラメータで送信日時を指定します。指定の仕方は schedule mail の場合と同じです。

なお、Binhex ファイルを送信することはできません。

send raw file: ファイルを無変換で送信

書式:

    send raw file list of alias  -- 送信するファイル
        to string -- 送り先アドレス
        [from string] -- 差出人アドレス
        [SMTP gateway string] -- メールサーバドレス
        [password  string]  -- SMTP 認証のパスワード
        [deleting boolean] -- 送信後に削除するか?

    Result: string  -- spool reference

ダイレクトパラメータで指定されたファイルを、何の変換も行わずに、そのまま送りだします。ファイルはインターネットのメールの形式に添った内容になっている必要があります(たとえば mboxer の convert to Files が吐き出すファイル)。

UVJ Mailer をメール転送に使うために実装したコマンドです。私は UVJ Mailerと mboxer と連携させて、出張中のメールの転送処理(MLのメールのように急を要しないメールは別アカウントに転送してしまうことで、出張先で読むメールの数を少なくするようにしています)を動かしているのですが、はっきり言って、そのために追加しました (^_^;;

send using template: テンプレートファイルを使ったメール送信

書式:

    send using template file specification  -- テンプレートファイル
        to string -- 送り先アドレス
        [from string] -- 差出人アドレス
        [SMTP gateway  string]  -- 送信に使用するメールサーバ
        [password  string]  -- SMTP 認証のパスワード
        subject string -- 題名
        [name string] -- 差出人の名前
        data list -- テンプレート中に挿入するデータのリスト
        [CC string] -- CC
        [BCC string] -- BCC
        [custom headers string] -- カスタムヘッダ

    Result: string  -- spool reference

ダイレクトパラメータで指定されたファイル(テンプレートファイル)を読み込み、そのファイル中にdata パラメータで渡されたデータを挿入したうえでメールとして送信するというものです。定型文を送信する場合などに使用します。

テンプレートファイルは、普通のテキストファイルとして作成してください。そして、データを後から挿入したい箇所に <@UVJ> というタグを書いておいてください。

そして、 <@UVJ> を置き換えていくデータを data パラメータで渡します。

たとえば myTemplate で指定したファイルに次のように書かれていたとします。

    <@UVJ>さん、こんにちわ

    私の新しいソフト、<@UVJ>がリリースされたので
    お知らせします。

    ダウンロードは以下のページから可能です
    <@UVJ>

このとき、次のようなスクリプトを実行すると、

-- script 09 --
tell application "UVJ Mailer"
    send using template myTemplate to ツ
        "tanaka@aaa.bbb.jp" subject "UVJ mailer 2.0 リリース" data ツ
        {"中田", "UVJ Mailer 2.0", "http://mtlab.ecn.fpu.ac.jp/uvjmailer/"}
end tell

結果として、次のような文面のメールを送ったことになります。

    中田さん、こんにちわ

    私の新しいソフト、UVJ Mailer 2.0がリリースされたので
    お知らせします。

    ダウンロードは以下のページから可能です
    http://mtlab.ecn.fpu.ac.jp/uvjmailer/

このように、テンプレート中の <@UVJ> が、順に、data パラメータの内容に置き換えられたものが送りだされるわけです。

status of mail: メールの処理状況を確認する

書式:

    status of mail string  -- spool reference (スプールファイルの名前)

    Result: small integer  -- -1=queue,0=done,1=error

send ... コマンドで送信を行ったメールの送信処理状況を確認するコマンドです。

ダイレクトパラメータに渡す spool reference は、send ... コマンドがリプライする spool reference (先に説明したように作成されたスプールファイルのファイル名です)を使います。

たとえば、Script 09 を実行した結果 20000222224000-0001 という文字列がUVJ mailer からリプライされたとします。このとき、以下のようなスクリプトによって、このメールがどのように処理されたかを後から調べることが出来るわけです。

-- Script 10 --
tell application "UVJ Mailer"
    status of mail "20000222224000-0001"
end tell

このコマンドは、以下の3つの値のどれかを返します(整数です)。

send mail: RFC822 に則したメール用ヘッダの作成

書式:

    compile header
        to string -- 送り先のアドレス
        [from string] -- 差出人のアドレス
        [SMTP gateway string] -- 送信に使用するメールサーバ
        subject string -- メールの題名
        [CC string] -- Cc のアドレス
        [custom headers string] -- 追加するヘッダ
        [name string] -- 差出人の名前
        [multipart boolean] -- multipart/mixed 用ヘッダにするか?

    Result: string  -- RFC822 Headers (RFC822 に則したヘッダ)

メールの送信ではなく、メールのヘッダ部分を生成するだけのコマンドです。このコマンドでヘッダ部分を作成し、本文の部分を自分で作成したメールを send raw または send raw file で送ることができます。複数の添付ファイルを持ったメール等、UVJ Mailer がサポートしていない形式のメールをご自分で作成する際にご利用ください。ただし、RFC822 などのメールに関する知識をお持ちでない場合には手を出さないほうが良いでしょう。

reload CGI URL: mail_CGI_URL ファイルの再読込み

書式:

    reload CGI URL

UVJ Mailer を CGI として利用する際に、送り先指定のメール送信を受け付けるページの URL を書いておく mail_CGI_URL ファイルを再読み込みするコマンドです。リプライはありません。


環境設定・状況確認

少数の例外を除いて、UVJ Mailer のオブジェクトの操作(プロパティの変更)を行うことになります。

まず UVJ Mailer のオブジェクトモデルについて説明しておきます。

UVJ Mailer のアプリケーションは、以下のような Class (オブジェクト)の構成になっています。

[ application ] --------+--------- [ mail ]
                        |
                        +--------- [ error mail ]
                        |
                        +--------- [ scheduled mail ]
                        |
                        +--------- [ timer ]
                        |
                        +--------- [ nickname ]

そして、それぞれの class (オブジェクト)は以下のようなプロパティを持ちます。[r/o]がついているものは、読み出しだけが可能で変更できないものであることを示しています。

application = アプリケーション

    default server string  -- デフォルトのメールサーバ
    default sender string  -- デフォルトの差出人アドレス
    default name string  -- デフォルトの差出人の名前
    default password string  -- デフォルトの SMTP 認証用パスワード
    route all boolean  -- すべてのメールをデフォルトサーバを使って送るか?
    time_out small integer  -- 接続時のタイムアウト打ち切りまでの時間(秒)
    suspended boolean  -- 処理中断の状態かどうか
    logging boolean  -- 処理のログを記録するようになっているかどうか
    idling boolean  [r/o]  -- メール送信処理中かどうか
    stay open boolean  -- 送信処理完了後に終了するか?
    lifetime small integer  -- 起動してから何時間後に終了するか
    seconds old integer  [r/o]  -- UVJ Mailer を起動してから何秒経ったか

mail = Queue に溜まっているメール(未送信メール)

    name string  [r/o]  -- スプールファイルの名前(spool reference)
    recipient string  [r/o]  -- 受取人のアドレス
    subject string  [r/o] -- 題名
    body type string  [r/o] -- メールの中身の種類

error mail = 送信処理中にエラーが起きたメール

    name string  [r/o]  -- スプールファイルの名前(spool reference)
    recipient string  [r/o]  -- 受取人のアドレス
    subject string  [r/o] -- 題名
    body type string  [r/o] -- メールの中身の種類
    error message string  [r/o] -- エラーメッセージ

scheduled mail = 送信が予約されているメール

    name string  [r/o]  -- スプールファイルの名前(spool reference)
    body type string  [r/o] -- メールの中身の種類
    recipient string  [r/o]  -- 受取人のアドレス
    subject string  [r/o] -- 題名
    sending on  string  [r/o] -- 送信日時

timer = Timer

    scheduled time small integer  [r/o] -- 毎時何分に処理を行うか
    start hour small integer  [r/o] -- 何時から処理を行うか
    end hour small integer  [r/o] -- 何時まで処理を行うか
    target alias  [r/o]  -- 処理対象のファイル/フォルダー
    action string  [r/o] -- 処理内容

nickname = Address Book の登録内容

    name string -- 登録名
    addresses string -- メールアドレス

では、それぞれの class (オブジェクト)の操作方法を、順に説明していきます。


Application class

この class のプロパティは、Preference および Admin メニューで設定を行う項目に相当します。

default server, default sender, default name, default password

デフォルトのメールサーバ、差出人アドレス、差出人名、SMTP 認証用パスワードに相当します。この4つの扱い方は同じですので、default server を例にして説明します。

設定内容が文字列でそのまま入っていますので、たとえば、myServer にメールサーバのアドレスを収めるときには、

-- Script 11 --
tell application "UVJ Mailer"
    set myServer to default server
end tell

また、逆に、myServer の値をデフォルトのメールサーバに設定する場合には

-- Script 12 --
tell application "UVJ Mailer"
    set default server to myServer
end tell

というスクリプトを使います。

route all

Preference のチェックボックス「すべてのメールをこのサーバで送る」の状態を表します。

「すべてのメールをこのサーバで送る」にチェックがついていると、このプロパティが true になります。この場合、すべてのメールが default serverを使って送信され、スクリプト中の SMTP gateway の指定が無視されます。また、送信時に複数のメールが Queue に溜まっていた場合、サーバとの接続を保ったまま連続して送信処理を行いますので、処理終了までの時間が短くなります。

以下のスクリプトで現在の設定を確認・変更できます。

-- Script 13 --
tell application "UVJ Mailer"
    set myFlg to route all
end tell

set BtnsList to {"設定変更", "OK"}
if myFlg then
    set myMsg to "すべてのメールでデフォルトサーバが使われます"
else
    set myMsg to "スクリプトの指定したメールサーバが使われます"
end if

if "OK" is not (button returned of (display dialog myMsg buttons BtnsList default button "OK")) then
    tell application "UVJ Mailer"
        set route all to not route all
    end tell
end if

time_out

Preference のタイムアウトの設定を表します。

UVJ Mailer は、メール送信の際に、ここで指定された秒数を越えてもサーバと接続が出来なかった場合は、接続を打ち切って、タイムアウトのエラーとしてメールを処理するようになっています。

以下のスクリプトで、設定の確認・変更が行えます。

-- Script 14 --
tell application "UVJ Mailer"
    set myTout to time_out
end tell

set myResult to display dialog "現在のタイムアウトの設定" default answer ツ
    (myTout as string) buttons {"設定変更", "OK"} default button "OK"

if "OK" is not (button returned of myResult) then
    tell application "UVJ Mailer"
        set time_out to (text returned of myResult) as integer
    end tell
end if

なお、不正な数字(たとえば0や負の数)を設定することも出来ますが、その場合は、UVJ mailer の動作がおかしくなります。上記のスクリプトは値にチェックを行っていませんが、実際にスクリプトを組まれる場合には、値が適切なものかどうかのチェックを行うようにしてください。

suspended

Admin メニューの「Suspended Jobs」の状態を表します。

Suspended Jobs にチェックマークがついた状態のとき、このプロパティは trueになります。このとき、メールの送信処理は行われませんし、timer の処理も行われません。ただし、send ... コマンドによるメールの送信(メールの Queueへの登録)やオブジェクトの操作は可能です。

以下のスクリプトで、設定状況の確認・変更が行えます。

-- Script 15 --
tell application "UVJ Mailer"
    set myFlg to suspended
end tell

set BtnsList to {"設定変更", "OK"}
if myFlg then
    set myMsg to "現在、送信処理を中断しています"
else
    set myMsg to "送信処理を行える状態です"
end if

if "OK" is not (button returned of (display dialog myMsg buttons BtnsList default button "OK")) then
    tell application "UVJ Mailer"
        set suspended to not suspended
    end tell
end if

logging

Admin メニューの「Transaction log」の状態を表します。

Transaction log にチェックマークがついた状態の時、このプロパティが trueになります。このとき、メールの送信処理が UVJ Mailer と同じフォルダー内のuvjMailer.log というファイルに記録されるようになります。

以下のスクリプトで、設定状況の確認・変更が行えます。

-- Script 16 --
tell application "UVJ Mailer"
    set myFlg to logging
end tell

set BtnsList to {"設定変更", "OK"}
if myFlg then
    set myMsg to "送信処理が記録されます"
else
    set myMsg to "送信処理は記録されません"
end if

if "OK" is not (button returned of (display dialog myMsg buttons BtnsList default button "OK")) then
    tell application "UVJ Mailer"
        set logging to not logging
    end tell
end if

idling

メールの送信処理を行っているかどうかを表します。このプロパティが true の時には、UVJ Mailer はメールの送信処理を行っていません。

UVJ Mailer は、メールの送信を非同期で行うようになっていますので、AppleScript の処理中であっても、同時に、メールの送信処理を行っています。後で説明する mail オブジェクトのように、メールの送信を行っている状態で操作を行うと、場合によっては問題を引き起こす場合があります(たとえば、送信中のメールを削除しようとした場合など)。このようなことを防ぐために、UVJ Mailer の状態を監視できるように設けたプロパティです。

send ... コマンドで送ったメールの処理が終了したかどうかの確認にも使えます。

なお、メールの送信処理中に AppleEvent の処理が入ると、送信処理の速度は低下します。ですから、送信が完了したかどうかを、このプロパティで確認する場合、以下のようなループを使うと、実質的に処理が止まってしまいます。

tell application "UVJ Mailer"
    repeat until idling
    end repeat
end tell

ですから、もしこのプロパティで送信処理の終了を確認したい場合には、

tell application "UVJ Mailer"
    repeat until idling
        delay 30
    end repeat
end tell

のように、delay を入れて、ループをゆっくりと回すようにしてください(MacOS 8.5 以前の場合はサードパーティの osax を使えば pause が可能です)。

stay open

スクリプトでしか設定ができないプロパティです。起動時にはかならず true にセットされます。

これが false にセットされると、(1)未送信のメールが Queue に残っていない(=送信するように指示されたメールはすべて送り終えた)、(2)Timer による処理が登録されていない、という2つの条件が満たされた時点で UVJ Mailer が終了します。つまり、UVJ Mailer をメール送信のみに用いており、メール送信後は UVJ Mailer を終了させたいという場合には、以下のようにメール送信のメッセージを送った後に、この stay open プロパティを false にセットすればよいわけです。

tell application "UVJ Mailer"
    send mail myBody to myFriend subject mySubject
    set stay open to false
end tell

lifetime

アプリケーションを起動してから何時間後に自動終了させるのかを指定します。Preference の寿命で設定する数値です。0を指定すると終了しません。

seconds old

スクリプトで読み出すことしかできないプロパティです。アプリケーションが起動してから何秒が経過したかを示します。秒単位で UVJ Mailer の挙動をコントロールしたい場合に利用してください。読み出し専用のプロパティです。


mail

Queue に登録されているメール(つまり未送信のメール)です。Queue に残っているメールを扱うために設定したオブジェクトですので、すでに送信が終了したメールは含まれません。この点は注意してください。

なお、UVJ Mailer は、メールの送信を非同期で行うようになっていますので、AppleScript の処理中であっても、同時に、メールの送信処理を行っています。ですから、この class を操作する場合、とくに delete で削除を行う場合には、必ず suspended を true にしてメールの送信処理を中断し、idling がtrue になってから処理を行うようにしてください。

プロパティ

mail は4つのプロパティを持ちます。いずれも読み出し専用で、スクリプトによる変更は出来ません。

  • name string [r/o] -- スプールファイルの名前(spool reference)
  • recipient string [r/o] -- 受取人のアドレス
  • subject string [r/o] -- 題名
  • body type string [r/o] -- メールの中身の種類

オブジェクトの指定は通し番号(最後から数えた通し番号を負の数で指定することも可能)か、スプールの名前によって行います。該当する mail オブジェクトが存在しない場合にはエラーになります。

たとえば、現在、Queue の先頭にあるメールの情報を得たいときには

-- Script 17 --
tell application "UVJ Mailer"
    set q1 to mail 1
end tell

というスクリプトを実行すると、q1 には mail 1 のすべてのプロパティの情報が収められた、以下のようなレコードが入ります。

{name:"20000223211123-0001", recipient:"mact@antares.ecn.fpu.ac.jp", subject:"秘密事項", body type:"text data"}

*このレコードから項目のデータを抜きだすような場合、tell application "UVJ Mailer" 〜 end tell のブロック内で処理を行わないとエラーになりますので、この点はご注意ください。

もちろん、プロパティを指定してデータを得ることも可能です。たとえば、上記のメールの宛先アドレスだけを得たい場合には、

-- Script 18 --
tell application "UVJ Mailer"
    set tgAddress to recipient of mail "20000223211123-0001"
end tell

というスクリプトによって、mail 1 (名前が "20000223211123-0001" ) のメールの宛先アドレスを知ることが出来ます。

なお、メールの中身を表す body type は、以下の5つの値のいずれかになります。

  1. "text data" --- send mail コマンドなどで受け付けたテキストデータ
  2. "text file" --- send file コマンドや timer によって指定されたテキストファイル
  3. "binhexed file" --- binhex ファイル
  4. "raw data" --- send raw data コマンドで受け付けたデータ
  5. "raw file" --- send raw file コマンドで受け付けたファイル

オブジェクトの一覧

list コマンドによって、すべての mail オブジェクト(インスタンス)のレコードのリストを得ることができます。

REALbasic の機能的な制約によって evey mails に対応する動作を実装することができませんので、その代わりに list コマンドでオブジェクトの情報一覧が得られるようにしてあります。

-- Script 19 --
tell application "UVJ Mailer"
    set myTgList to {}
    set mylist to list mails
    repeat with thisMail in mylist
        set end of myTgList to recipient of thisMail
    end repeat
end tell

というスクリプトによって、myTgList に、未送信のメールの宛先のリストが収まります。

数を数える

mail オブジェクトの数(=未送信のメールの数)は count コマンドで数えることができます。

先ほどの未送信のメールの宛先のリストを得るスクリプトは、以下のようにも書ける分けです。

-- Script 20 --
tell application "UVJ Mailer"
    set myTgList to {}
    set x to count mails
    repeat with i from 1 to x
        set end of myTgList to recipient of mail i
    end repeat
end tell

削除する

delete コマンドで mail オブジェクトを削除する、つまり未送信のメールを削除することが可能です。

-- Script 21 --
tell application "UVJ Mailer"
    delete mail -1
end tell

というスクリプトで、Queue の一番最後にあるメールを削除することになります。

なお、このコマンドは、suspended = trueの状態でしか実行できません。suspended が false の時にはエラーになります。

いったん削除したメールを復活させることはできませんので、その点は注意して操作してください。


error mail

送信処理中にエラーが生じたメールです(error spool フォルダに収められたメール)。

UVJ Mailer は、送信処理の際にエラーが生じたメールは、error spool フォルダにスプールを移して、そのメールの送信処理を打ち切るようになっています。スプールファイルの名前は変更されません。

プロパティ

error mail は以下のプロパティを持ちます。いずれも読み出し専用で、変更はできません。

  1. name string [r/o] -- スプールファイルの名前(spool reference)
  2. recipient string [r/o] -- 受取人のアドレス
  3. subject string [r/o] -- 題名
  4. body type string [r/o] -- メールの中身の種類
  5. error message string [r/o] -- エラーメッセージ

mail オブジェクトに error message プロパティが追加されたものになっています。

以下のスクリプトで、最後にエラーが起きたメールに対応する error mail オブジェクトのプロパティが収まったレコードを得ることができます。

-- Script 22 --
tell application "UVJ Mailer"
    set er1 to error mail -1
end tell

このとき、er1 には、以下のようなレコードが収まります。

{name:"20000223215731-0001", recipient:"tanaka@aaa.bbb.jp", subject:"エラーのテスト", body type:"text data", error message:"SMTP Error: 550 5.1.1 user tanaka@aaa.bbb.jp not known"}

body type の値などは mail オブジェクトと同じです。

オブジェクトの操作

mail オブジェクト同様に、以下の操作が行えます。

  • list コマンドで一覧を得る(list error mails
  • count コマンドで数を数える(count error mails
  • delete コマンドで削除する(delete error mail 1

scheduled mail

送信が予約されているメールです。

プロパティ

scheduled mail は以下のプロパティを持ちます。いずれも読み出し専用で、変更はできません。

  1. name string [r/o] -- スプールファイルの名前(spool reference)
  2. recipient string [r/o] -- 受取人のアドレス
  3. subject string [r/o] -- 題名
  4. sending on string [r/o] -- 送信日時
  5. body type string [r/o] -- メールの中身の種類

mail オブジェクトに sending on プロパティが追加されたものになっています。

以下のスクリプトで、一番早く送信予定の scheduled mail オブジェクトのプロパティが収まったレコードを得ることができます。

-- Script 23 --
tell application "UVJ Mailer"
    set sc1 to scheduled mail 1
end tell

このとき、sc1 には、以下のようなレコードが収まります。

{name:"20020324020000-0324011722516", body type:"text data", recipient:"tanaka@aaa.bbb.jp", subject:"予約メールのテスト", sending on:"03/24/2002 02:00:00"}

body type の値は、"text data" か "text file" のどちらかになります。

オブジェクトの操作

以下の操作が行えます。

  • list コマンドで一覧を得る(list scheduled mails
  • count コマンドで数を数える(count scheduled mails
  • delete コマンドで削除する(delete scheduled mail 1

timer

決められた時間になると処理を行う timer を表すオブジェクトです。

プロパティ

以下の5つのプロパティを持っています。いずれも読み出しだけで、変更はできません。

  1. scheduled time small integer [r/o] -- 毎時何分に処理を行うか
  2. start hour small integer [r/o] -- 何時から処理を行うか
  3. end hour small integer [r/o] -- 何時まで処理を行うか
  4. target alias [r/o] -- 処理対象のファイル/フォルダー
  5. action string [r/o] -- 処理内容

オブジェクトは通し番号でしか指定できません。

次のスクリプトを実行すると、t1 には Admin メニューで呼び出せる Timer リストの一番上にある Timer の情報が収まります。

-- Script 24 --
tell application "UVJ Mailer"
    set t1 to timer 1
end tell

次のようなレコードになります。

{scheduled time:50, start hour:0, end hour:23, target:file "Macintosh HD:UVJ_Mailer_2.0:activater", action:"Launch"}

処理内容を示す action プロパティは、以下の値のうちのどれかになります。

  • "Launch" --- ファイルの起動
  • "Run" --- スクリプト/アプリケーションの実行
  • "<<xxxxYYYY>>" --- AppleEvent (class = xxxx, ID = YYYY) の送付
  • "Mail to: aaa@bbb" --- aaa@bbb 宛にメールする

オブジェクトの操作

以下の操作が行えます。

  • list コマンドで一覧を得る(list timers
  • count コマンドで数を数える(count timers
  • delete コマンドで削除する(delete timer 1

nickname

Address Book に登録されている nickname です。このオブジェクトは、プロパティの値の変更が可能ですし、make コマンドでスクリプトによって新たなオブジェクトを作成することも可能になっています。

プロパティ

以下の2つのプロパティを持っています。

  • name string -- 登録名
  • addresses string -- メールアドレス

オブジェクトは、名前(登録名)と通し番号のどちらかで指定します。以下のスクリプトを使うと、登録名が「田中」の Nickname の登録内容を得ることができます。

-- Script 25 --
tell application "UVJ Mailer"
    nickname "田中"
end tell

次のようなレコードが返ります。

{name:"田中", addresses:"mact@antares.ecn.fpu.ac.jp"}

登録名「田中」のアドレス部分が知りたいときには、

-- Script 26 --
tell application "UVJ Mailer"
    set tAddr to addresses of nickname "田中"
end tell

を実行すると、"mact@antares.ecn.fpu.ac.jp" が tAddr に収まります。

登録名「田中」のアドレス部分を motoyuki@fpu.ac.jp に変更したいときには、

-- Script 27 --
tell application "UVJ Mailer"
    set addresses of nickname "田中" to "motoyuki@fpu.ac.jp"
end tell

というスクリプトで可能です。アドレス部分に複数のアドレスを設定したいときには、コンマ","で区切ってアドレスを並べた文字列を渡してください。

-- Script 28 --
tell application "UVJ Mailer"
    set addresses of nickname "田中" to "motoyuki@fpu.ac.jp,mact@antares.ecn.fpu.ac.jp"
end tell

オブジェクトの作成

make コマンドで新たな nickname を作成することが可能です。

次のスクリプトによって、登録名「プロジェクト」、アドレスがaaa@bbb.ccc.jp と ddd@eee.fff.jp からなる nickname が作成・登録されます。

-- Script 29 --
tell application "UVJ Mailer"
    make new nickname with data {name:"プロジェクト", addresses:"aaa@bbb.ccc.jp,ddd@eee.fff.jp"}
end tell

無事に作成されると nickname 3 of application "UVJ Mailer" のように、新たに作成されたオブジェクトのリファレンスが返されます。

オブジェクトの操作

他のオブジェクト同様に以下の操作も行えます。

  • list コマンドで一覧を得る(list nicknames
  • count コマンドで数を数える(count nicknames
  • delete コマンドで削除する(delete nickname 1

最後に

UVJ mailer は、AppleScript でメールを簡単に送るようにしたいということで作り始めたものではありますが、オブジェクトモデルを実装することは全然考えていなかったため、いざ実装しようとすると不自然な部分が残るものになってしまいました(たとえば、make コマンドで nickname しか作成できない等)。

また REALbasic の持っている制約(というか、不十分な AppleEvent の実装)のため、whose による絞り込みや every による一括処理などが行えないといった、多くの制約を持ったものになってしまっています。

このソフトによって、皆さんの AppleScripter Life が少しでも豊かなものになれば嬉しいです。


付録:イベントリスト

UVJ Mailer を REALbasic 等から呼びだす場合に、AppleEvent での情報が必要になることがあります。そこで、メールの送信を行なう主なイベントの AppleEvent の生の形での情報を掲載しておきます。

send mail

ClassID
'XUVJ''SnMl'

Parameters

NameIDType
(direct)'----'TEXTRequired
to'to 'TEXTRequired
from'from'TEXT
SMTP gateway'gtwy'TEXT
password'pass'TEXT
subject'Sbjc'TEXTRequired
CC'cc 'TEXT
BCC'bcc 'TEXT
custom headers'XHdr'TEXT
name'name'TEXT
banner'bdHD'alis
signature'bdFT'alis

schedule mail

ClassID
'XUVJ''scdu'

Parameters

NameIDType
(direct)'----'TEXTRequired
to'to 'TEXTRequired
from'from'TEXT
SMTP gateway'gtwy'TEXT
password'pass'TEXT
subject'Sbjc'TEXTRequired
CC'cc 'TEXT
BCC'bcc 'TEXT
custom headers'XHdr'TEXT
name'name'TEXT
banner'bdHD'alis
signature'bdFT'alis
sending on'予定'TEXTRequired

send raw data

ClassID
'XUVJ''rawM'

Parameters

NameIDType
(direct)'----'TEXTRequired
to'to 'TEXTRequired
from'from'TEXT
SMTP gateway'gtwy'TEXT
password'pass'TEXT

send file

ClassID
'XUVJ''SnFl'

Parameters

NameIDType
(direct)'----'alisRequired
to'to 'TEXTRequired
from'from'TEXT
SMTP gateway'gtwy'TEXT
password'pass'TEXT
subject'Sbjc'TEXTRequired
CC'cc 'TEXT
BCC'bcc 'TEXT
custom headers'XHdr'TEXT
name'name'TEXT
banner'bdHD'alis
signature'bdFT'alis
binhex attachment'bhqx'bool
message'msg 'TEXT
deleting'DELE'bool

schedule file

ClassID
'XUVJ''scFl'

Parameters

NameIDType
(direct)'----'fss Required
to'to 'TEXTRequired
from'from'TEXT
SMTP gateway'gtwy'TEXT
password'pass'TEXT
subject'Sbjc'TEXTRequired
CC'cc 'TEXT
BCC'bcc 'TEXT
custom headers'XHdr'TEXT
name'name'TEXT
banner'bdHD'alis
signature'bdFT'alis
sending on'予定'TEXTRequired
deleting'DELE'bool

send raw file

ClassID
'XUVJ''rawF'

Parameters

NameIDType
(direct)'----'alisRequired
to'to 'TEXTRequired
from'from'TEXT
SMTP gateway'gtwy'TEXT
password'pass'TEXT
deleting'DELE'bool

send using template

ClassID
'XUVJ''SnTp'

Parameters

NameIDType
(direct)'----'fss Required
to'to 'TEXTRequired
from'from'TEXT
SMTP gateway'gtwy'TEXT
password'pass'TEXT
subject'Sbjc'TEXTRequired
name'name'TEXT
data'data'listRequired
CC'cc 'TEXT
BCC'bcc 'TEXT
custom headers'XHdr'TEXT

UVJ Mailer のホームページ