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

guestMailのメール送信時のエラー

発言者:岡崎
( Date Thursday, December 05, 1996 18:11:04 )


構文チェックのエラーはなぜか一旦アップルスクリプト関係を外して、翌日いれなおしたら構文チェックできました。
というわけで原因は不明でした。ところがまた次のエラーが出ました。
ACGIにアクセスした後お礼のページにアクセスするはずが「Error receiving results from ACGI execution. (-1700) 」と表示されたページになってしまうのです。
すいません以下にスクリプトを書かせていただきますので間違っていたらお教えください。
---- このスクリプトを実行するためには TCP/IP Scripting Addition OSAX がインストールされて
---- いなければなりません。

---- TCP/IP Scripting Addition osax は Mango Tree Software のシェアウェアです
----  <http://www.mangotree.com/tcpscripadd.html>


property YourEMail : "xing@jap.co.jp" ---  あなたの E-Mail アドレスを設定してください
property MailHost : "202.229.79.16" --- あなたのメールサーバー( 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://www.jap.co.jp/xing/thanks.html" & 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 guestCompany to item 3 of myList
    set guestIndustrial to item 4 of myList
    set guestPosition to item 5 of myList
    set guestPost to item 6 of myList
    set guestZipcode to item 7 of myList
    set guestAddress to item 8 of myList
    set guestTel to item 9 of myList
    set guestFax to item 10 of myList
    set guestPurpose to item 11 of myList
    set myBody to item 12 of myList
    
    
    
    --- メッセージの改行コードの統一
    set myBody to xReturner myBody
    
    --- 受け取ったメッセージを整理する
    set myData to "アクセスした人からメッセージが届きました" & return & return ツ
      & "日時: " & ((current date) as string) & return & return ツ
      & "名前: " & guestName & return ツ
      & "メールアドレス: " & guestMail & return ツ
      & "勤務先: " & guestCompany & return ツ
      & "業種: " & guestIndustrial & return ツ
      & "所属部課: " & guestPosition & return ツ
      & "職種: " & guestPost & return ツ
      & "郵便番号: " & guestZipcode & return ツ
      & "住所: " & guestAddress & return ツ
      & "電話番号: " & guestTel & return & return ツ
      & "FAX番号: " & guestFax & return & return ツ
      & "目的: " & guestPurpose & return & return ツ
      & "質問:" & return & myBody
    
    --- メール送信
    
    set theResult to send_message(YourEMail, "Message from Guest", myData)
    
    if "ERROR" is in theResult then
      error theResult
    end if
    
    
    
  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_message(email_address, email_subject, email_data)
  
  --- 日本語の Subject は使えません!!
  
  
  if email_address = "" or email_data = "" then
    return "ERROR"
  end if
  
  if "@" is not in email_address then
    return "ERROR Invalid Mail Address"
  end if
  
  set email_data to SjisToJis email_data
  set email_data to xReplace email_data search return replace crlf
  
  
  try
    
    set sss to (tcp connect to host MailHost maximum seconds 40 port 25)
    
    try
      
      readresponse(sss)
      tcp write data "mail from: <" & YourEMail & ">" & crlf stream sss
      readresponse(sss)
      tcp write data "rcpt to: <" & email_address & ">" & crlf stream sss
      readresponse(sss)
      tcp write data "data" & crlf stream sss
      readresponse(sss)
      
      tcp write data "From: " & "xingMail ACGI <" & YourEMail & ">" & crlf stream sss
      tcp write data "To: " & email_address & crlf stream sss
      tcp write data "Subject: " & email_subject & crlf stream sss
      tcp write data crlf & email_data & crlf stream sss
      tcp write data "." & crlf stream sss
      readresponse(sss)
      
      tcp write data "QUIT" & crlf stream sss
      
      tcp close stream sss
      return "OK"
      
    on error msg number num
      tcp close stream sss
      return "ERORR Unable to send mail"
    end try
    
  on error msg number num
    return "ERORR Unable to connect Mail Server"
  end try
  
end send_message


on readresponse(sstream)
  set AppleScript's text item delimiters to {""}
  
  repeat until (tcp ahead characters LF stream sstream)
  end repeat
  
  set myLine to (tcp read until characters LF stream sstream)
  set errorStr to characters 1 through 3 of myLine as string
  
  set errorCode to errorStr as integer
  if (errorCode ウ 400) then
    error "sendMailError" number errorCode
  end if
end readresponse

田中求之 さんからのコメント
( Thursday, December 05, 1996 18:32:26 )

メールサーバーは何ですか? AIMS ですか? それとも UNIX のメールサーバー
ですか?


田中求之 さんからのコメント
( Thursday, December 05, 1996 18:50:02 )

もう一点、CGI を動かしているサーバーは OpenTransport を使っていますか? それとも
MacTCP でしょうか?

OpenTransport の場合は、メール送信用のハンドラーに OT用のコマンドを追加する
必要があるのですが。


スクリプトそのものには間違いがないように思われますので、問題が起きるとしたら、
FORMからのメッセージが正しくないか、メール送信時のエラーだと思われます。

まずは、メール送信用のハンドラーのテストと、受け取ったメッセージの整理の
部分を分けてデバッグを行い、どちらでエラーがでているのかを突き止めてください。

岡崎 さんからのコメント
( Thursday, December 05, 1996 19:41:36 )

「tcp write data "HELO" & crlf stream sss ---- この2行を
      readresponse(sss) ---- 追加する」というのを追加したところメールは送られました。
しかしページのリプライはできず同じメッセージ「Error receiving results from ACGI execution. (-1700) 」がでます。
メールサーバーはAIMS1.1で漢字トーク7.5.5のパフォーマ588でMacTCP2.06です。
(これは6100/66が電源ファン故障の為代理で立ち上げているものです。)
CGIサーバーはMacHTTPで漢字トーク7.5.5のLC630でMacTCP2.06でTCP/IP Scripting Add 68K 2.07をインストールしてあります。
それから現在このセットで他のフォームCGIは動いています。

田中求之 さんからのコメント
( Thursday, December 05, 1996 22:20:43 )

スクリプトをもう一度拝見したら、エラーの原因が分かりました。

メールを送ったあとに、ページのデータなり、リダイレクトの指示を返さなければ
ならないのですが、この部分が欠けています。これではエラーが出て当然です。

    if "ERROR" is in theResult then
      error theResult
    end if

のあとに

  return http_10_header & "<TITLE>Thank you</TITLE>" & crlf .... (以下省略)

というような、メッセージ表示用のページのデータを追加してください。これで
エラーがなくなると思います。

岡崎 さんからのコメント
( Thursday, December 05, 1996 23:12:49 )

お世話になりました。出来ました!
すいませんトンチンカンな所にリダイレクトの指示をいれてました。でもどこかでプロパティの所にかくようにかいてあったような気がしたのですが?
「property redirect_header : "http://www.jap.co.jp/xing/thanks.html" & crlf & "Server: WebSTAR/1.0 ID/ACGI" & crlf & ツ
  "MIME-Version: 1.0" & crlf & "Location: "」
それから「ScriptingWithMacHTTP(2nd)」のリダイレクトの所で「return redirect_head & "http://mtlab.ecn.fpu.ac.jp/secretRoom.html"」
headerがheadになっています。私のような素人はまちがえるとおもいますので報告しておきます。
今度はちゃんとスクリプトをテキストでバックアップして置いたので同じ間違いはしないと思います。
ありがとうございました。

田中求之 さんからのコメント
( Friday, December 06, 1996 00:26:00 )

property として設定しておくのは、処理によって内容の変わらない部分です。
で、property に設定しただけではだめで、ちゃんと return の中で property
を使用する必要があります。

HTTP ヘッダーの URL 以外の部分を property として設定したうえで、

 return redirect_header & "http://your.host/" & crlf & crlf

というような使い方をします。

property について混乱があるようなので、もう一度確認しておいてください。


なにはともあれ、動いてよかったですね。

なお、明日のうちには、「 CGI とは何か」という、入門のページを登録しますので
そちらも参考にしてください。 ScriptingWithMacHTTP はさすがに内容が古すぎ
ますので。