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

Mondo Mail によるメール送信

発言者:田中求之
( Date Saturday, January 18, 1997 19:58:06 )


TCP/IP osax が OpenTransport 上で非常に不安定な動きを見せますので、
CGI の中からメールを送るようにしている場合は、その CGI がサーバーを
クラッシュさせる原因になりかねません。

対応策として、Mondo Mail というフリーウェアのメール送信用ツールを使う
という方法がありますので、簡単に紹介しておきます。

以下のホームページから Mondo Mail をダウンロードしてください。

Mondo Mail は、メール送信だけに特化したアプリケーションです。
Fat バイナリですし、OT にも対応、さらには Multi-thread で
動くようです。

で、スクリプトとしては非常に簡単なものを書くだけですみます。たとえば
SJIS で書かれたメールを送信するのであれば、基本的には JIS への
変換を行って Mondo Mail を呼び出すだけでOKです。

--- Sample Script 1 ----
property myAddress : "" ---  あなたの E-mail アドレス
property mySMTP : "" --- SMTP サーバーのアドレス


on send_email(toAddress, mysubject, myBody)
  
  set myBody to SjisToJis myBody
  
  tell application "Mondo Mail.fat"
    send mail myBody ツ
      to toAddress ツ
      from myAddress ツ
      subject mysubject ツ
      SMTP gateway mySMTP
  end tell
  
end send_email

----

この send_email ハンドラーを呼べば、日本語のメールを送れます

ToAddress に相手のアドレス
mySubject にメールのサブジェクト(日本語不可)
myBody にメールの本文のデータ

を渡します。また、property として、あなたの E-mail アドレスと SMTP
サーバーのアドレスを設定するのを忘れないでください。

→  Mondo Mail (ACME Download page)

田中求之 さんからのコメント
( Saturday, January 18, 1997 20:09:33 )

CGI Kit の guestMail を Mondo Mail を使うように書き換えると
以下のようになります。

----

property YourEMail : "" ---  あなたの E-Mail アドレスを設定してください
property MailHost : "" --- あなたのメールサーバー( SMTP サーバー)を設定してください

property crlf : (ASCII character 13) & (ASCII character 10)
property LF : (ASCII character 10)

property http_10_header : "HTTP/1.0 200 OK" & crlf & "Server: WebSTAR/1.0 ID/ACGI" & crlf & ツ
  "MIME-Version: 1.0" & crlf & "Content-type: text/html" & crlf & crlf

property redirect_header : "HTTP/1.0 302 Found" & crlf & "Server: WebSTAR/1.0 ID/ACGI" & crlf & ツ
  "MIME-Version: 1.0" & crlf & "Location: "

on idle
  return (60 * 60 * 24)
end idle

on run
  if YourEMail = "" or MailHost = "" then
    beep
    display dialog "メールの設定を行わなければ使えません"
    quit
  end if
end run

---- ここからが CGI 処理の本番

on ヌevent WWWスsdocネ path_args ツ
  given ヌclass kforネ:http_search_args, ヌclass postネ:post_args
  try
    --- post_args のデコード
    set myList to DecodeJArgs post_args
    
    set guestName to item 1 of myList
    set guestMail to item 2 of myList
    set guestHome to item 3 of myList
    set myBody to item 4 of myList
    
    if guestName = "" or myBody = "" then
      --- 記入ミス
      return & redirect_header & "guestmsg.html" & crlf & crlf
    end if
    
    if guestMail = "" then
      set guestMail to "(記入なし)"
    end if
    
    if guestHome = "" then
      set guestHome to "(記入なし)"
    end if
    
    --- メッセージの改行コードの統一
    set myBody to xReturner myBody
    
    --- 受け取ったメッセージを整理する
    set myData to "アクセスした人からメッセージが届きました" & return & return ツ
      & "日時: " & ((current date) as string) & return & return ツ
      & "名前: " & guestName & return ツ
      & "メールアドレス: " & guestMail & return ツ
      & "ホームページ: " & guestHome & return & return ツ
      & "メッセージ:" & return & myBody
    
    --- メール送信
    
    send_email(YourEMail, "Message from Guest", myData)
    
    --- リプライ
    return http_10_header & "<TITLE>Thank You</TITLE>" & crlf ツ
      & "<h2>メッセージをありがとうございます</h2>" & crlf ツ
      & "今後ともよろしくお願いします"
    
  on error errMsg number errNb
    
    return http_10_header & crlf ツ
      & "<TITLE>Error</TITLE>" & crlf ツ
      & "<h1>Error</h1>" & crlf ツ
      & "<h3>処理中にエラーが生じました</h3><HR><P>" & errMsg
  end try
  
end ヌevent WWWスsdocネ


on send_email(toAddress, mysubject, myBody)
  
  set myBody to SjisToJis myBody
  
  tell application "Mondo Mail.fat"
    send mail myBody ツ
      to toAddress ツ
      from YourEMail ツ
      subject mysubject ツ
      SMTP gateway MailHost
  end tell
  
end send_email

石津@RJC さんからのコメント
( Saturday, January 18, 1997 22:58:38 )

なるほど。これは簡単でいいですね。
TCP/IP Scripting Addだとヘッダの加工ができて、それはそれなりに便利ですが
簡単にメールを送ろうと思ったら、こちらの方が面倒がないですね。

田中求之 さんからのコメント
( Sunday, January 19, 1997 15:38:59 )

>なるほど。これは簡単でいいですね。

ヘッダーや差出人の表記にこだわる必要がないのなら、これ、なかなか良いツールです。
AppleScript でメール送信するよりも、圧倒的に処理が速いですし(当たり前ですが)。

ただ、10分間(だったと思います)処理がないと自動的に Quit するという仕様に
なってますので、その点は注意が必要です。


loony さんからのコメント
( Tuesday, January 21, 1997 21:32:58 )

>ただ、10分間(だったと思います)処理がないと自動的に Quit するという仕様に
>なってますので、その点は注意が必要です。

これはどういうことなのでしょうか?
guestmailがcgiで呼び出される度にMondMailが立ち上がってしまうということですか?

田中求之 さんからのコメント
( Tuesday, January 21, 1997 22:16:35 )

大雑把に言うとそういうことです。

つまり、Mondo Mail を予め立ち上げておいても、処理がなければ終了してしまいます。
ですから、メール処理が多くない場合は、処理の度に Mondo Mail が立ち上がることに
なります。

ただ、起動の時間は非常に短いです。

稲垣@信州 さんからのコメント
( Thursday, January 23, 1997 14:33:40 )

 ところで、話は変わるのですが、メイルを送ることはこれで出来るのですが、
メイルを受信するようなソフトはありませんか?

 AIMSのsave as file以外の方法で、スクリプトでメイルの受信が出来ると、
面白いことが出来ると思うのですが、


 ついでに、TCP/IPの通信の詳しい本でお勧めがあれば教えてもらいたいので
すが、某出版社の祝入門を読んだのですが、実際にスクリプトを書きたいと思っ
ても、書けないような本当に入門編だったので・・。基礎の勉強には役に立った
のですが。

奥脇 さんからのコメント
( Thursday, January 23, 1997 16:08:52 )

自分で試した事はないのですが、
MacPerl 5.0 用の、libnet というライブラリを使うと、
MacPerl から、POP3 server へと接続し、
メールの受信などが出来るようです。
同じライブラリを使用すれば、メールの受信も出来ます。

Mac で、TCP/IP 関係のスクリプトを書くなら、
MacPerl が、割と楽な気がします。

田中求之 さんからのコメント
( Thursday, January 23, 1997 17:36:38 )

TCP/IP osax が安定して動かせるなら、これを使ってスクリプトを書くのも、
それほど難しいことではありません(面倒ではありますが)。実際、かつては
定期的にメールをダウンロードしてページに変換する CGI を動かしてました。
(今でも、ナマのメールをスプールから取り出すためにスクリプトを使う
ことはあります)

基本的には TCP のストリームを、相手のホストとポートを指定して開いて、
あとは RFC などに記述されている手順でホストとの交信を行い、用が
すんだ時点でストリームを閉じる、ということになります。

どのレベルでプログラムを書くのかによって必要な知識も変わってくる
のですが、どのあたりのことを考えているのでしょうか?

なるべく簡単にネットワークのプログラミングを行いたいのなら Perl
を使って Socket でスクリプトを書いてしまうのが簡単でしょう。

逆に、OpenTransport にバリバリに対応したクライアントソフトを
作りたいとなると、OT の使い方になりますので、なかなか道は険しい
ですよ。

TCP/IP osax を使った場合ですと、基本的には RFC を調べて
利用したいプロトコルの通信手順を調べればなんとかなります。


あと、日本語関連の処理を全部自分でやることになりますが、Marionet
というアプリケーション(製品)を利用することもできますね。

稲垣@信州 さんからのコメント
( Thursday, January 23, 1997 18:33:30 )

 どうもコメントありがとうございます。

 実際にやってみたいのは、Subject Share for Macjordomoを、AIMSと
共存させずに出来ないかと考えています。

 POPでメイルを受信し、Subjectを処理した後、SMTPでメイルを送信する。
事を考えています。そして、Subjectを処理したメイルをPOPでMacjorodmo
が受信し、配送する。
 ここまで考えると、実際にリスト用のソフトが出来てしまうのですが・・。


 やっぱり、RFCを調べるのが一番ですか。解説書があれば、参考にしたかっ
たのですが、がんばって調べてみます。