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

ファイルの自動送信について教えて下さい。

発言者:狩野敦
( Date Saturday, November 08, 1997 10:52:02 )


 いつも,勉強させていただいています。CGIとは,関係がないので恐縮ですが,
質問させて下さい。

 あるプログラムでデータを取っており,それをファイルとしてフォルダ内に
保存します。ファイルが作成されたら,自動的にEudora Proで指定のアドレスに
添付書類として転送するようなスクリプトを
http://mtlab.ecn.fpu.ac.jp/Webcon_archive/960131155420.html
を参考にさせていただき作ろうとしているのですが,うまく行きません。
on run
  set myF to choose file
  open ({myF})
end run
は,
property FolderToWatch
on run
  set FolderToWatch to (choose folder with prompt "Select a folder to watch.")
end run
とし,
on open (myFlist)--end openは,on idle--end idleに変え,その中で,
tell application "Finder"
    set filenum to count folder FolderToWatch
    if filenum > 0 then
      set myFF to (list folder FolderToWatch)
      set myFlist to {myFF}
     (以下は,元プログラムと同じ)
    end if
    delete contents of FolderToWatch <---入れる予定
end tell
return 60
というようにしてみましたが,"Can't make file *-/*+*=(文字化け) into a item"
というエラーが出ます。たぶん,フォルダ内容を読み込む方法に間違いが
あるのではないかと思っています。初歩的なミスだと思いますが,
どなたか,ご指摘いただければ,大変助かります。

 元投稿を検索で見つけましたが,表示されたページでコメントを付けることが
できませんでしたので,ここに投稿させていただきました。よろしくお願いします。

木下雄一朗 さんからのコメント
( Saturday, November 08, 1997 13:56:47 )

>"Can't make file *-/*+*=(文字化け) into a item">

Eudora Proは、添付書類をSpool Folderという場所につくる仕様になって
いるので、同じディレクトリに同名の書類をつくれないのだと思います。
(Spool Folderを空にして一回目の処理だけエラーが出なければ間違いなく、
 この問題です。...私も同じような状況にはまったことがあります)

添付書類を毎回違う名前にするか、処理後に名前を変更するステップを
スクリプトに追加すると上手くいくと思います。

田中求之 さんからのコメント
( Saturday, November 08, 1997 14:39:42 )

>Eudora Proは、添付書類をSpool Folderという場所につくる仕様になって
>いるので、同じディレクトリに同名の書類をつくれないのだと思います。

確かにこの問題はありますが、その場合は、スクリプトではなく、Eudora
がエラーを表示するはずです。

狩野さんのスクリプトの場合、おそらくフォルダー内のファイルをエイリアスの
リストとしてまとめる部分でエラーを起こしているのではないかと考えられます。


パーツごとに分割してデバッグするのがよいと思いますので、まず Eudora を
使ってメールを添付する部分のハンドラーから確認しますと、以下のようになり
ます。

on sendFile(ToAddress, FilesList)
  
  --- ToAddress 宛に FilesList (エイリアス型のファイルのリスト)のファイルを添付して送る
  
  set myBody to "こんにちわ" & return & return ツ
    & "以下のファイルをこのメールに添付してお送りします" & return & return
  
  tell application "Finder"
    repeat with thisF in FilesList
      set xName to name of (contents of thisF)
      set myBody to myBody & "  ・" & xName & return
    end repeat
  end tell
  
  
  tell application "Eudora Pro 3.1.1-J"
    activate
    set xMsg to make new message at end of mailbox "送信"
    set field "To:" of xMsg to ToAddress
    set field "subject:" of xMsg to "ファイル送信"
    set body of xMsg to myBody
    attach to xMsg documents FilesList
    
    queue xMsg --- メッセージをキューに入れる
    
    --- 即座に送信する場合は、ここで connect を実行
    
  end tell
  
end sendFile

田中求之 さんからのコメント
( Saturday, November 08, 1997 14:57:19 )

次に、指定したフォルダーにファイルがあったら送信する、という部分は

property watchedFldr : "" --- ここに見張るフォルダーを設定

on run
  set watchedFldr to (choose folder) as string
end run

on idle

  tell application "Finder"
    try
      set myFlist to files of folder watchedFldr
    on error
      set myFlist to {}
    end try
  end tell
  
  if myFlist is not {} then
    
    set myAttached to {}
    tell application "Finder"
      repeat with thisF in myFlist
        set end of myAttached to (contents of thisF) as alias
      end repeat
    end tell
    
    sendFile("aaa@bbb.ccc.xx.jp", myAttached) --- メール作成

  end if
  
  return 30  --- 30秒ごとにチェック
  
end idle

という処理を行います。 sendFile を呼ぶ前に、myAttached というリストを
新たに作って、ファイルがエイリアス型のアイテムで収められるように処理して
います。Eudora は、添付するファイルのリストの各アイテムはエイリアス型で
あることを要求しますので、このような処理を行っています。狩野さんの場合、
この処理がないのがエラーの原因ではないかと思います。


田中求之 さんからのコメント
( Saturday, November 08, 1997 15:04:00 )

送信後はファイルを削除するという場合には、

 sendFile("aaa@bbb.ccc.xx.jp", myAttached)

のあとに、

tell application "finder" to delete myAttached

を入れてください(これを忘れると、同じ添付メールをいくつも作ろうと
しちゃいますね (^_^;; )

狩野敦 さんからのコメント
( Sunday, November 09, 1997 13:47:20 )

 大変参考になるコメントをありがとうございました。

 おかげさまで,ほとんど完成したのですが,一点のみまだ問題が
残ってしまっています。

 手で,ファイルをフォルダの中に動かしてやると期待通りの動作(Eudora
Proを起動,添付書類として送信,その後そのファイルを削除。)をします。

 しかし,別プログラムにファイルを作成させると,ファイルを作成中
(作成終了前。ファイル作成には数十秒〜数分かかります。)でも,スクリプトは,
ファイルの存在を関知して,作成中のファイルをメールの添付書類
として送ってしまいます。おまけに,その不完全なファイルを
削除してしまい,ファイルが壊れてしまって(「そのファイルは,存在しません」
というメッセージが出てしまう。)ディスクも認識されなくなり,
DiskFirstAidのお世話になる羽目になってしまいました(幸い,それで直りました。)。

 これは,送られようとするファイルが作成中であるかどうかを調べてから
送るようにすれば,解決する問題だと思いますが,その具体的方法について
ご存じでしたらご教授下さい。

田中求之 さんからのコメント
( Sunday, November 09, 1997 14:29:26 )

>しかし,別プログラムにファイルを作成させると,ファイルを作成中
>(作成終了前。ファイル作成には数十秒〜数分かかります。)でも,スクリプトは,
>ファイルの存在を関知して,作成中のファイルをメールの添付書類
>として送ってしまいます。

「別プログラム」がファイルに関してどのような動作を行うプログラムになっているか
によって対策はことなります。

たいていのソフトは、処理中のファイルを開いた状態でキープしますので、他の
ソフトから「書き込み可能」の権限でアクセスはできないようになっています。
ですから、「書き込み可能」でアクセスできるかどうかによって、メールに含めて
よいかどうかを判定することができます。先のサンプルの idle ハンドラーを
以下のように書き換えることになります。

on idle
  
  tell application "Finder"
    try
      set myFlist to files of folder watchedFldr
    on error
      set myFlist to {}
    end try
  end tell
  
  if myFlist is not {} then
    
    set myAttached to {}
    tell application "Finder"
      
      repeat with thisF in myFlist
        set thisF to contents of thisF
        
        try
          
          --- 「書き込み許可」でファイルが開ける場合には、作業終了の
          --- ファイルと見做して、添付用リストに追加
          set df to open for access thisF with write permission
          close access df
          
          set end of myAttached to thisF as alias
        on error
        end try
        
      end repeat
    end tell
    
    sendFile("aaa@bbb.ccc.xx.jp", myAttached) --- メール作成
    
  end if
  
  return 60 --- 30秒ごとにチェック
  
end idle

ただし、ソフトによっては、作業中のファイルであっても、「書き込み可能」のアクセスが
できるようになっているものもありますので、その点は注意が必要でしょう。

田中求之 さんからのコメント
( Sunday, November 09, 1997 14:31:35 )

あ、sendFile の部分を以下のように書き換える必要もあります。

    if myAttached is not {} then
      sendFile("aaa@bbb.ccc.xx.jp", myAttached) --- メール作成
      tell application "Finder" to delete myAttached
    end if

狩野敦 さんからのコメント
( Monday, November 10, 1997 19:17:26 )

 本当に色々ありがとうございました。

 やはり,私の使っているプログラムは,作業中でも書き込みや消去を
許してしまうので,だめでした。そこで,フォルダのサイズを毎回チェックして
続けてサイズが変化しなければ,作業完了と判断して添付書類として
送信,消去することにして成功しました。どうもありがとうございました。