「メールの添付ファイルを指定のディレクトリに移動する!」
みかさんの指導の元、DataSpiderの使い方に大分習熟してきた東谷君。今日はあるスクリプトの作成をみかさんに依頼されて、頑張って作ってる様子です。いつも自信無さげな東谷君ですが、どうやら今回はかなり自信があるらしく張り切ってる模様・・・・。
メールの添付ファイルを移動する!
東谷君:
クックック・・・・ドヤッドヤッ・・・・・!
みかさん:
(うっ、何か珍しく東谷君が調子に乗ってる・・・)
東谷君:
みかさん、できましたよ! 見てください!
みかさん:
おお、お願いしていたあのスクリプト、もうできたの?
東谷君:
そうなんですよ。メールを受信して、添付ファイルを指定のフォルダに移動させるスクリプト、できちゃいました!
みかさん:
ちょっと解説してもらえる?
東谷君:
まず[メール受信(POP3)]処理で、メールを受信します。この出力データを[繰り返し(データ件数)]処理に入力すると、受信した件数分ループすることができますよね。
▲スクリプト全体
東谷君:
[メール受信(POP3)]処理は出力データに「添付ファイルパス」という、保存した添付ファイルのファイルパスを持っているので、この[繰り返し(データ件数)]処理の出力から「添付ファイルパス」を[変数代入]処理で変数に入れます。
▲「ファイルパスセット」処理。[繰り返し(データ件数)]処理の出力データを代入することで、メール受信処理の出力データを1件ずつ処理できる
東谷君:
ファイルアダプタの[移動]処理でその変数を使うことで、添付ファイルを移動させることができる、というわけです。
▲ファイルアダプタの[移動]処理プロパティ。[移動元]にスクリプト変数「添付ファイル保存パス」を使用している
みかさん:
おお、変数とか出力データの使い方に慣れてきたね!
東谷君:
まあ、僕もようやくDataSpiderの使い方に馴染んできたというか、手が勝手に動くというか、むしろ僕がDataSpiderに愛されてるというかですねエヘヘ
くも子:
甘いクモ!
東谷君:
ひっ
みかさん:
まだ調子に乗るのは早い、ということみたいよ。確かにこのスクリプトは基本的な動作はするけど、きちんといろいろな条件できちんと動作させるにはまだこれだけだと足りないわね。
東谷君:
いろいろな条件と言いますと・・・。
みかさん:
例えば、メールには必ず添付ファイルがあるわけではないよね? 添付ファイルがないメールを受信すると・・・
東谷君:
あああ。
▲添付ファイルが1つも無い場合、実行に失敗
みかさん:
[移動]処理の[移動元]に空の値が入ることになって、「ファイルパスが指定されていません。」というエラーになっちゃうわね。
東谷君:
うう・・。
みかさん:
また、添付ファイルがあるときは、必ず1つというわけではないよね? 2つ以上の添付ファイルを持つメールを受信したときに、どういう動きになるかは把握してる?
東谷君:
えーと確か、[メール受信(POP3)]処理の出力データの「添付ファイルパス」に、カンマ区切りで受信したファイルパスが複数入るんですよね、あ、そうすると次の[移動]処理でエラーに・・・。
みかさん:
そうね、[移動]処理の[移動元]にカンマ区切りの複数のファイルパスが入ってしまうから、ここでエラーになってしまうのよね。
東谷君:
そうかー。まだまだでした・・・・。
添付ファイルが無い場合どうする?
みかさん:
じゃあまず、添付ファイルが無い場合について考えてみましょうか。いろいろ方法はあると思うけど、東谷君だったらどういうフローを作る?
東谷君:
そうですね・・・シンプルに考えると、「添付ファイルが存在しない場合は、[移動]処理を実行しない」という条件分岐をすればいいのかな、と思います。
みかさん:
そうね! じゃあ添付ファイルが存在しない場合、というのをスクリプトの処理に落とし込むとどうなるかしら。
東谷君:
その場合、[メール受信(POP3)]処理の出力データの「添付ファイルパス」が空文字になるはずですね。なので、以下のような流れで条件分岐かな。
1) [メール受信(POP3)]処理の出力データの「添付ファイルパス」が空文字かどうかをチェック
2) その結果をスクリプト変数に代入
3) [条件分岐]処理でそのスクリプト変数を使用してフローの分岐を行う
みかさん:
お、さすが、この辺りのスクリプト作成は慣れてきたわね!
東谷君:
えへへへ。というわけで[変数代入]処理で空文字チェック&変数代入、その変数を使う条件分岐を作ってみました。
▲変更したスクリプト全体。添付ファイルパスの確認と、条件分岐が追加されている
▲添付ファイルパス確認処理。空文字と「添付ファイルパス」」を比較し、結果をスクリプト変数「添付ファイル存在」に代入する。この変数を条件分岐処理で使用して、分岐を行う
東谷君:
早速動かしてみると・・・・お、できた!
みかさん:
これで添付ファイルが無い場合はOKだね!
添付ファイルが複数ある場合どうする?
みかさん:
じゃあ、次は添付ファイルが複数ある場合を考えてみましょうか。ではあらためて、[メール受信(POP3)]処理で添付ファイルがあるメールを受信した場合の動きについてヘルプから再度確認してみましょう。
東谷君:
はい!
(ヘルプを確認中)
[添付ファイルを受信]にチェックが入る場合、添付ファイルを保存する動きになりますね。
添付ファイルは、以下のフォルダに保存されます。
<格納先>/<メッセージID>/添付ファイル名
例えば[メール受信(POP3)]処理の[添付ファイル格納先]を「/tmp」に設定してtest.txtファイルが添付されている場合、メッセージIDが「12345@example.com」だったとすると以下のようになりますね。
/tmp/12345@example.com/test.txt
そして、その保存した添付ファイルのパスは、出力データの「添付ファイルパス」に出力されます。この添付ファイルが複数ある場合は、以下のようにカンマ(,)区切りで格納されます。
/tmp/12345@example.com/test.txt,/tmp/12345@example.com/test2.txt
みかさん:
そうね。ポイントは添付ファイルはすべて「<格納先>/<メッセージID>/」フォルダに保存されるということ。つまり、このフォルダ以下のものすべてを移動させれば、複数の添付ファイルがあった場合にもすべてのファイルを移動することができる、ということになるわね。
東谷君:
なるほどねー。
そうすると、[移動]処理の[移動元]に指定する値をどうするか、ということがポイントになりそうですね。
みかさん:
そうね、[移動]処理の[移動元]に、「このディレクトリ以下のすべてのファイル」という指定をすればOKになるよね。こういうときどうすればいいか分かる?
東谷君:
うーんと・・・教えてくも子!
くも子:
ワイルドカードを使うクモ!
東谷君:
ワイルドカードか! ワイルドだぜぇってやつですね!
くも子:
・・・・
みかさん:
・・・
東谷君:
すいませんでした・・・。
ワイルドカードを使って複数のファイルを移動する!
みかさん:
(スルーして)ワイルドカードを使うと、変数の「添付ファイル保存パス」に以下のような値が入ることになるわね。
<格納先>/<メッセージID>/*
東谷君:
そ、そうですね。じゃあこの変数の文字列を組み立てて、スクリプト変数「添付ファイル保存パス」に代入すればいいいうことですね。
みかさん:
その通り。ここでは、変数Mapperで出力データの「添付ファイルパス」から以下のようなロジックで作ることにしましょう。
1) [指定文字より後]ロジックを使って「添付ファイルパス」の<格納先>より後の部分を切り出す
例:
[処理前]
/tmp/12345@example.com/test.txt,/tmp/12345@example.com/test2.txt
↓
[処理後]
18926678.1130237227441.12345@example.com/test.txt,/tmp/12345@example.com/test2.txt
2) 切り出した文字列に対して[指定文字より前]ロジックを使って、最初の「/」より前を切り出す
例:
[処理前]
12345@example.com/test.txt,/tmp/12345@example.com/test2.txt
↓
[処理後]
12345@example.com
3) [連結]ロジックを使って結合して、変数に代入する
[処理後]
/tmp/12345@example.com/*
▲変数Mapperでの添付ファイル保存パス作成処理。[移動]処理でワイルドカードを含んだ使うファイルパスを作成している
東谷君:
あれ、[メール受信(POP3)]処理の出力データの中の「メッセージID」から取ってくれば良さそうなんですが。
みかさん:
うん、ほとんどの場合はそれでもうまくいくんだけど、そこはちょっと注意が必要なところなのよね。[メール受信(POP3)]処理のヘルプで、[添付ファイル格納先]の「備考」に次のような仕様が書かれているわ。
添付ファイル名・メッセージIDに「DataSpiderファイルシステムの禁止文字」またはタブが含まれる場合、「_」(半角アンダースコア)に変換して出力します。
ここでは添付ファイル名は「*」(ワイルドカード)で処理するので使用しないから良いんだけど、メッセージIDが上の条件にあてはまる場合、メッセージIDがそのまま保存されたディレクトリ名にはならないのよ。ほとんど場合はそのようなことは起きないんだけど、より安全に処理するには本当に保存されたファイルパスを出力する「添付ファイルパス」を使用した方が良いわね。
東谷君:
なるほど! これであらゆる場合に対応できるスクリプトが作れるわけですねー。
みかさん:
というわけで、できたスクリプトがこちら。
▲完成したスクリプト
東谷君:
おお、添付ファイルが無い場合にも複数のメールの場合にもきちんと処理できる! できたぞ-! いやーまだまだ勉強不足だなぁ。
みかさん:
でもかなり変数とか出力データの基本的な扱いについては分かってきたみたいね! 自信を持って、より良いスクリプトが作れるように努力していきましょう。
くも子:
がんばるクモ!
東谷君:
はい! やるぞー。
というわけで大きな成長を見せながらも、DataSpiderの達人に向けての道はまだまだ遠い東谷君。
次回以降も、さらに新しいことにチャレンジしていきます。
ご期待ください。
なお、今回作成したスクリプトは、以下スキルアップセンターのページよりダウンロードが可能です。
スキルアップセンター > サンプルスクリプトのダウンロード > サンプルスクリプト:メールの添付ファイルを保存