このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

UVJ Mailer 2.0GM7 (最終ベータ)公開

発言者:田中求之
( Date Friday, August 18, 2000 16:03:51 )


UVJ Mailer 2.0 の最後のベータ版にあたる 2.0GM7 を公開しました。

修正点として

・メニューからの Send File 機能を削除
 (Rb は navigation サービスと相性が悪く、システムエラーが起きやすい
  ため)

・Suspend 時の表示の変更(Suspended Jobs と表示するように変更)

・同一の SMTP サーバを使用するメールを連続して送信する場合には、
 コネクションを切らずに連続処理する

・Pref や Spool が壊れていた場合には、読み込まない(削除する)

・GetURL/OpenURL で呼びだされたとき(mailto:... )に Subject や
 body を指定するパラメータを正しく処理するようにした

などです。

このバージョンに大きな問題が見つからなければ、2.0 正式版をだし
ます。


なお、2.0 で対応しきれなかった問題点として

1:長時間連続運用するとメールを送らなくなる
  → Rb のタイマー機能のバグ(だと確信)のため対処できず

2:8 bit 文字の混入を完全には防ぎきれない
  → 利用者の皆さんの方で気をつけてください (^_^;;

があります。

→  UVJ Mailer

稲村 啓二 さんからのコメント
( Sunday, August 20, 2000 02:05:10 )

 はじめまして田中先生。UVJにはいつもお世話になっております。また、
いつも貴重な情報を下さるWSMの皆様に御礼申し上げます。

 毎晩(夜中)にCronでファイルメーカーのスクリプトを起動して、翌
日の予定などを社内の数名へMailしております。もちろん UVJ Mailerを
使用させていただいているのですが、1週間ほどでメールを送らなくな
ります。

 対策として UVJ Mailerを毎回終了したいのです。毎回起動し直せば、
UVJ Mailerは問題なく毎日働いてくれます(^^)。

 FMproのスクリプト中で、単純にAppleScriptのquitコマンドを使うと
送信が終了する前にquitしてしまいます。送信が終了するのを検知する
にはどのようなAppleScriptにすれば良いのですか?

 「AppleScriptリファレンス」をあちこち眺めたりしたのですが、わか
りませんでした。初歩的な質問かとは思いますが、よろしくお願いいた
します。


田中求之 さんからのコメント
( Thursday, August 24, 2000 11:44:47 )

>送信が終了するのを検知する
>にはどのようなAppleScriptにすれば良いのですか?

1週間ほどで送信しなくなる問題への対処については、今も色々と案をねって
いますが、「キューに溜まっているメールをすべて送信したら終了する」と
いう機能を追加するのも、確かに一つの手ですね。

これを実装するのは無茶苦茶簡単なので、ちょっと考えてみます。


現在の仕様のままの場合、delay を入れながらループで idling を監視して、
キューが 0 で idling の状態になったら終了するというスクリプトをかく
必要があります(これで分るでしょうか?)

田中求之 さんからのコメント
( Thursday, August 24, 2000 23:57:49 )

>これを実装するのは無茶苦茶簡単なので、ちょっと考えてみます。

ということで、新たにアプリケーションのプロパティとして stay open と
いうものを追加しておきました。

このプロパティは、デフォルトでは true なのですが、スクリプトによって
false に変更できます。

stay open が false の時、

1:キューに未送信のメールが残っていない
2:Timer の設定が一切無い

場合には、アプリケーションが終了します。

つまり、メール送信後に UVJ mailer を終了させたいときには、必要な
メールを送信する処理を行っておいてから、

tell application "UVJ Mailer PPC"
  set stay open to false
end tell

とやれば、すべてのメールを送った後に UVJ mailer は終了します。

2.0 の正式版に組み込んでおきます。

田中求之 さんからのコメント
( Saturday, August 26, 2000 00:53:22 )

>なお、2.0 で対応しきれなかった問題点として
>1:長時間連続運用するとメールを送らなくなる

これ、解決できるかもしれません。コードに多少手を入れて、Timer が
乗っている main ウィンドウのインスタンスを一定時間後とに破棄->生成
するようにしてみて、今、様子を見ています。

ようは、長時間 Timer (REAlbasic で定期的に処理を行わせる時に用いる
class です)を動かすことが問題を起こすなら、問題が起きる前に新しいもの
に取り換えるようにすればいいじゃん、っていう発想です。

うまくいくかな??  …しかし、正式版リリース目前と言いながら、相変わらず
けっこう大幅に手を入れてるな… (^_^;;

稲村 啓二啓二 さんからのコメント
( Saturday, August 26, 2000 23:46:00 )

 お世話になります、稲村 啓二です。田中先生、素早い対応ありがとうございました。

>つまり、メール送信後に UVJ mailer を終了させたいときには、必要な
>メールを送信する処理を行っておいてから、
>
>tell application "UVJ Mailer PPC"
>  set stay open to false
>end tell
>
>とやれば、すべてのメールを送った後に UVJ mailer は終了します。
>
>2.0 の正式版に組み込んでおきます。

 ありがたや...m(__)mペコリ。これで「あいつの作ったMail自動送信の仕組み、1週間
ぐらい働くと、勝手にお休みするらしい。あいつらしいなぁ...」などと言われなくて済
みます(^^)。

 2.0正式版、楽しみにしております。重ね重ねありがとうございます。 

田中求之 さんからのコメント
( Sunday, August 27, 2000 01:39:58 )

2.0 正式版は9月15日にリリースしますね。

これは、現在テスト中の Timer バグ対策が本当に効果があるかどうかを
見極めてからということです。

田中求之 さんからのコメント
( Monday, August 28, 2000 13:50:05 )

>現在テスト中の Timer バグ対策が本当に効果があるかどうかを
>見極めてからということです。

もしこのテストに協力しても良いよという方がいらっしゃいましたら、
以下の preview 版で長期運用のテストを行っていただけますか?

以下の点が GM7 から変わっています。

・main ウィンドウが24時間ごとに差し替えられる(表示がちょっとだけ
 おかしくなります→バックグランドにいてもウィンドウがアクティブな
 ように表示されてしまう)

・ stay open プロパティの追加(false で送信後に終了する)

・lifetime プロパティの追加(起動後、指定した時間が経過すると自動終了)

FAT バイナリになってます。

…いよいよ大詰め (^_^;;

→  UVJ Mailer_2.0_preview.sit

稲村 啓二 さんからのコメント
( Wednesday, August 30, 2000 00:30:42 )

 お世話になります。

> もしこのテストに協力しても良いよという方がいらっしゃいましたら、
> 以下の preview 版で長期運用のテストを行っていただけますか?

 早速、使用していたver(2000/04/12版)から入れ替えてみました。今まではおよそ1週間で停止しましたので、しばらく運用してみます。

 使用マシンは WorkGroupServer 7350/180(PPC7300/180と同型機)
 stay open プロパティ、lifetime プロパティはともに利用しておりません

 素人ですので、的はずれの報告しかできないかもしれませんが....

田中求之 さんからのコメント
( Wednesday, August 30, 2000 12:24:50 )

稲村さん、テストをよろしくお願いします。

もし止まるようでしたら、まぁ、その時はその時で、あきらめます。
(そのかわり、自動終了用の機能を組み込みましたし)

Toshi. Suzuki さんからのコメント
( Wednesday, August 30, 2000 21:37:37 )

Toshi. Suzukiと申します。

RbのTimerのバグという話が出ていますが、私が以前 拙作TS-TinyCronに
発生した現象と関連が有りそうなので、その時のことをちょっと書かせて
ください。
(ちょっと長文です)

TS-TinyCronは定期的に起動する処理などを登録してCron処理を行うアプリ
(Rb1.1.1で作成)なのですが、登録したスケジュールが一定期間以上の間隔
が有ると、スケジュールが起動されなくなるというバグの報告が有りました。
調べてみると、その設定では1週間に1回だけスケジュールを登録されていて
スケジュールの間隔が約1週間という物でした。
さらに調べたら、TimerのPeriodの値が一定以上大きくなると(どこまでが
限度かは判りませんでしたが) Timerが動作しなくなる*らしい*事が判った
ので、Periodの値を1日以上の長さに設定しない(1日1回はTimerを再設定する)
という具合にしてバグを回避しました。
その修正以降は、*何週間*も連続可動しても動作するようになりました。

で、UVJ  Mailer のソースを見させていただいたところ、Periodは固定で、
Modeは基本的に 2-Multiple になっているようですね。

私は以前の経験から、TimerはPeriodの値が大きすぎると動作しなくなると
思っていたのですが、UVJ  Mailerのソースから判断すると、Timerの Mode
 の値を「一定期間以上変更しない」と、Timerが動作しなくなるという現象
が有るのではないかと思えてきました。

TS-TinyCronでは Timer内の Sub Action() 〜 End Sub の間は一旦 Timerの
 Mode を 0-Off にして、処理が終わった後に もう一回 Mode を 1-Single に
するという事をしていました。ですからPeriodの値が大きければ当然、Mode
を変更しない時間も長くなるようになっていました。
(Modeを0-Offにするのは、本来は同時に二重起動したくなかったからなの
ですが。)

# 現在のTS-TinyCronではTimerオブジェクトを一度生成したらそのまま
# ずーっと使う仕様になっていて、それが数週間に渡って動作するのが
# 確認されています。

長文かつ乱文になってしまいましたが、ご参考になれば幸いです。m(__)m

では

田中求之 さんからのコメント
( Thursday, August 31, 2000 11:25:31 )

Toshi. Suzuki さん、

>Timerの Modeの値を「一定期間以上変更しない」と、Timerが動作しなく
>なるという現象が有るのではないかと思えてきました。

以前、そうではないかと考えて、メール送信中は Mode=0 でいったん停止し、
メール送信後に mode=2 に戻すという処理を組み入れたのですが、これも
効果ありませんでした(Period の値もいじくればよかったのかな??)。
そこで、この方法はやめて、インスタンス自体を取り換えるという方法に
変更してみたわけです。

Toshi. Suzuki さんからのコメント
( Thursday, August 31, 2000 12:38:17 )

田中求之 さん
>以前、そうではないかと考えて、メール送信中は Mode=0 でいったん停止し、
>メール送信後に mode=2 に戻すという処理を組み入れたのですが、これも
>効果ありませんでした(Period の値もいじくればよかったのかな??)。

そうでしたか。(^^;
となると、やっぱり Period も操作しないといけないのかな?
私のときは、Period の上限を設定したらそのまま現象が出なくなったので
それ以上の調査はしなかったのですが・・・。

あまりお役に立てないで申し訳ない。

でも、たしかにインスタンスを再作成すれば、現象は消えそうな気もしますね。
# 私の場合はCronだったので、最悪の場合はリスタートのAppleScriptを登録
# するという*荒業*も可能でしたけど。
# (その方がシステム全体としての調子は良かったりして。(^^;;)

では

田中求之 さんからのコメント
( Thursday, August 31, 2000 13:49:03 )

>あまりお役に立てないで申し訳ない。

いえいえ、同じような問題で苦労されている方が他にもいるというだけで
励みになります。

># 私の場合はCronだったので、最悪の場合はリスタートのAppleScriptを登録
># するという*荒業*も可能でしたけど。

これに近いことも考えています。preview 版には起動後、一定時間が経過し
たら終了する機能を盛り込んでいるのですが、終了の際に rebound (再起動)
用のアプリケーションを呼びだせるようにしようかとも考えています。
(単に、終了の際に、あらかじめ登録しておいたアプリケーションに
AppleEvent を送るようにするだけですが (^_^;; )

ま、インスタンスの取り換えで解決してくれたらいいんですけどね。

稲村 啓二 さんからのコメント
( Friday, September 08, 2000 13:22:40 )

 お世話になります、稲村です。2.0_preview版の連続運転テストですが、今朝止まってしまいました。

 運転開始:8/29 深夜
 停止  :9/08 深夜送信分は不可だった

 スクリプトで自動送信されるハズのファイルがspoolフォルダーに残っていました。UVJを終了し、再起動するとすぐに送信が開始されました。

 う〜む、残念。そのまま運転を続けてみます。次回停止を確認したら、stay openプロパティーで送信ごとにUVJが終了するようにスクリプトを変更するつもりです。

 今回、あるいは次回停止したら、何か調べるべき事は有りますか?

 取り急ぎご報告まで。

田中求之 さんからのコメント
( Saturday, September 09, 2000 15:33:02 )

どうもありがとうございました。

やはり1週間あたりが限度ってことですかね。

2.0 正式版は今のままの仕様でリリースすることにします。

たまちゃん さんからのコメント
( Wednesday, September 13, 2000 13:00:11 )

今頃になってすみません。フォームを使って mail.acgi でアカウントの
登録(リストサーバへの登録)を行っていますが,UVJ Mailer 起動後の
1回目の登録時に,何故か2度メールが配送されてしまいます。2回目
以降のアカウント登録では問題は起こりません。

IE や NN の両方で確かめましたが,再現性は100%です。

それと mail.acgi 使用時に

An exception of class
OutOfBoundsException was not
handled.
Tha application must shut down.

というエラーが出て UVJMailer を再起動させないといけない事態も頻発
しています。通常の配送では問題はありません。

以上,報告です。

田中求之 さんからのコメント
( Wednesday, September 13, 2000 13:53:13 )

バージョンはどれを使ってますか?>たまちゃんさん

田中求之 さんからのコメント
( Wednesday, September 13, 2000 13:59:13 )

なお、

>OutOfBoundsException was not

というエラーは、私のミスによるバグである可能性が極めて高いエラー
ですので、コードの方をチェックしておきます。

たまちゃん さんからのコメント
( Wednesday, September 13, 2000 13:59:15 )

すみません,言い忘れました。8月28日リリースの preview 版です。

よろしくお願いします。

田中求之 さんからのコメント
( Wednesday, September 13, 2000 16:33:31 )

>私のミスによるバグである可能性が極めて高いエラー

わははははは  笑ってごまかしたくなるような大ボケをかましてました。
確実に修正しておきます。

なお、UVJ Mailer を mail.acgi で使う方法は、非常に手軽なんですが、
一般に公開されているサーバ上で運用した際には、spam の踏み台に
なってしまうしまう恐れがありますので、注意してください。

Referer などのチェックをおこなわず、FORM の形式さえあっていれば、
どこから投稿されたものであっても発送してしまいますので。

Referer のチェックを入れて、発送に限定をかけようかと思っています
(Refere のサイトが自分のサイトでなければ cgi として機能しない)

田中求之 さんからのコメント
( Wednesday, September 13, 2000 16:35:43 )

なお、たまちゃんさんのところで出ているバグは preview 版で紛れ込んだものです
ので、それより前のバージョンに戻せばトラブルはなくなるはずです。

田中求之 さんからのコメント
( Friday, September 15, 2000 00:50:13 )

>Referer のチェックを入れて、発送に限定をかけようかと思っています

最終仕上げの段階でこの機能を組み込みました。フォームメール(メールの
発送)の処理を認める URL を書いたファイルを UVJ Mailer と同じフォルダー
に置いておくと、その URL 以外のページからのメール発送を認めないように
しました。これで、メール発信機能の乗っ取りに対する原始的なセキュリティは
確保できます。ただし、Referer を発行しないブラウザを使っている場合は
メールの書き込みができないのと、Referer を偽られた場合には効果がない
という問題は残るのですが…

URL を書いたファイルが無い場合には、どのページからのメール処理も
(たとえ自分のサイト以外にあるページからのものであっても)、処理
するようにしておきました。

さんからのコメント
( Friday, September 15, 2000 04:55:37 )

Toshi. Suzuki さん

はじめまして。
TS-Tiny Cronは、とっても重宝させていただいております。 m(_ _)m

いまだにフリー版をいまだに使わせていただいておりますが
1週間に1度のスケジュールでも問題は起きておりませんでしたよ。
ただし、連続運用で問題が起こりやすいのは、MacOS8.5以降で、それ以前は
同条件での1ヶ月連続運用も問題無しでした。
お役に立つかわかりませんが、参考まで

 - - - - - - -

田中先生、ご無沙汰しております

>> Referer のチェックを入れて、発送に限定をかけようかと思っています
>  最終仕上げの段階でこの機能を組み込みました。

この機能、是非欲しいですが、正式版で・・ということになるのでしょうか?
またRefererに利用するファイルというのは単なるtext fileで、URLを
http://...から書けば動くのですか?

> Referer を発行しないブラウザを使っている場合はメールの書き込みが
> できないのと、Referer を偽られた場合には効果がない

偽られた場合はおいておいて、「Refererを発行しないブラウザからの受付は
拒否する」は可能でしょうか?

ちなみに「乗っ取られる」というのは、単にFORMが利用されると言うことですか?
それともToを書き換えての外部利用も可能なのですか?
(そんなはずは・・・??)
初歩的なことで申し訳ありません。

それと、ちょっと脱線ですが、別スレッドで一度話のあったmboxerの変更
も今後行われてゆくのですか?
LANでUVJMailerとmboxerを併用しているのでちょっと気になりました

さんからのコメント
( Friday, September 15, 2000 04:58:38 )

あ、ちょっと間違いです・・ (^^;

> 「Refererを発行しないブラウザからの受付は拒否する」

じゃなくて拒否か、そうでないかをpreferenceで選択可能でしょうか?
中規模のLANなので場合によっては、融通が利くようにできるとよいかと
思ったもので・・・・

さんからのコメント
( Friday, September 15, 2000 05:19:51 )

> 単にFORMが利用されると言うこと?
> Toを書き換えての外部利用も可能?

Flex(WS-plugin) は可能ですね
localにおいて書き換えて送信。
(こんな事、書いちゃって大丈夫かな?)

UVJMailerもTo:は最低限必要だし、fromは書き加えて送信するとUVJMailer
のprefを無視して送信してしまう??
きっと、外向けのフォームに利用している方もきっといるだろうし、やっぱり
実装してないと怖いですね・・・

田中求之 さんからのコメント
( Friday, September 15, 2000 11:31:25 )

今日が休日だということをすっかり忘れていたので、一日遅らせて、明日、正
式版を出すことにしますが、GM からの変更点を整理しておくと以下のように
なります。

1: Application オブジェクトに stay open プロパティの追加

→ 起動時には false にセットされます。これを true にすると、未送信のメー
ルが無く、Timer もセットされていない状態になったとき、UVJ Mailer は自
動的に終了します。メール送信機能だけを使用しているとき、送信後に自動終
了させたいときに使います。


2: Application オブジェクトに lifetime プロパティの追加

→ 起動してから何時間後に終了するのかを設定するプロパティです。0 にし
ておくと自動終了しません。長時間運用すると Mail を送らなくなるという問
題を持っていますので、それに対処するために、自動終了させる機能を持たせ
ました。Preference で手動で設定することも可能になっています。


3: Application オブジェクトに seconds old プロパティの追加

→ 起動してから何秒が経過したかを示すプロパティです。読み出し専用。


4: UVJ Mailer Suite に compile header イベント(コマンド)を実装

→ パラメーターで指定した条件のメール用のヘッダ(RFC822 に則した形式の
ヘッダ)を生成して返すコマンドです。メールの送信は行いません。このコマ
ンドを使ってヘッダを作成し、本文(ボディ)部分を自分で作成することで、
UVJ mailer がサポートしていない形式のメール、たとえば複数の添付ファイ
ルを持ったメールなど、を送信することが可能になります。
(送信には sendraw data か send raw file を使う)


5: Timer の処理時間(毎時何分に処理を行うか)に 60 をセットすると、
その Timer の実行をパスするようにしました。

→ Timer の処理を止めたいときには、これまでは Suspend Job ですべての処
理を中断するしかなかったのですが、これによって、個々の Timer のオン/オ
フをコントロールできるようにしました。


6: CGI 利用時の簡易セキュリティ機能の実装

→ UVJ Mailer を直接 CGI として利用しているとき(エイリアスを Web のフォ
ルダーに入れて用いているとき)、メール送信の行えるページに制限を加える
ようにしました。UVJ Mailer と同じフォルダーの中に mail_CGI_URL という
名前のファイルを作り、この中に、メール送信処理を認めるページの URL を
1行に1つずつ書いておきます。すると、このファイルに書かれていない URL
からのメールの送信を拒否します。また、もし mail_CGI_URL ファイルを作
成していなかった場合には、どのページからのメールの送信の処理も受け付け
ますが、メールの宛先のアドレスが、強制的に、UVJ Mailer のデフォルトの
メールアドレスに設定されるようにしました。これによって、UVJ mailer の
CGI 機能を乗っ取って、第3者に spam を送り付ける行為を防ぐようにしまし
た。


>ちょっと脱線ですが、別スレッドで一度話のあったmboxerの変更
>も今後行われてゆくのですか?

気分次第、というか、どれだけ時間がとれるか、ですね。とりあえず、UVJ
mailer 2.0 を出した後は、Tanaka's osax 2.0 の仕上げにかかります。