フローで、メールサーバーで受信したメールを取得し、メールの添付ファイルを処理するには次の2つの方法があります。
(1)フローのトリガーでメールを取得する
メール実行設定で定期的にPOP3サーバーを監視し、メールが取得できればフローを起動します。起動するフローをテンプレートフローの「添付ファイル処理フロー」を使って作成すると、メール情報が自動的にフロー変数に設定され、StartコンポーネントからBinaryストリームで添付ファイルが出力されます。
(1)について詳しくはフローサービスマニュアル「はじめに」-「トリガーごとのフローの作成」-「メール監視起動のフロー」を参照してください。
(2)フローの処理中にメールを取得する
フローの起動方法を問わず、フローの処理中にPOP3コンポーネントまたはIMAPコンポーネントを使って、メールサーバーで受信したメールを取得します。ASTERIA Warp 2012以降ではPOP3、IMAPコンポーネントで添付ファイルを取得できるようになりました。ASTERIA Warp 2012より前のバージョンではPOP3、IMAPコンポーネントで出力されるメールメッセージ全体のMIMEストリームから、MIMEDecodeコンポーネントを使って添付ファイルを取り出します。
ここでは(2)のMIMEDecodeコンポーネントを使って添付ファイルを取得し、さらにファイルに保存する方法を説明します。
※本書では、フロー作成手順の知識があることを前提としています。
フローの詳しい作成手順は解説していませんのでご了承ください。
フローでの処理概要は次のとおりです。
1) POP3コンポーネントまたはIMAPコンポーネントで取得したメールメッセージを、添付ファイルを含むMIMEデータで出力するために出力ストリームを「MIME」にします。
2) MIMEDecodeコンポーネントで、次のように指定します
- 出力ストリームをBinaryにする
- 「取得対象とする条件式」プロパティに添付ファイルを取得するMQLを記述する
→記述するMQLの例については後述します。
MQLについて詳しくはBranchStartコンポーネントヘルプの「MQL」やドキュメント「MQL (MIME Query Language for FlowService)」を参照してください。添付ファイルの取得例は「MQLの使用例」にあります。
3) Mapperコンポーネントで、次のFilePutコンポーネントの入力に次の情報をマッピングします。
- MIMEDecodeの出力ストリーム(添付ファイルデータ)を入力ストリームにマッピング
- MIMEDecodeコンポーネントの出力ストリーム変数FilePath(添付ファイル名)を「ファイルパス」にマッピング
4) (前のMapperでマッピングしているのでFilePutコンポーネントでは設定なし)
フロー図は次のようになります。(処理部分のみ)
※このフローではPOP3コンポーネントを使っていますがIMAPコンポーネントでも処理は同じです。
ループ処理
ここでフローのループ処理について説明します。
POP3コンポーネントとMIMEDecodeコンポーネントでは初期設定で「ループを開始」プロパティが「はい」になります。これはそれぞれ次の処理になることを意味しています。
- POP3コンポーネントでは、取得した複数のメールをループで処理する
- MIMEDecodeコンポーネントでは、1つのメールに添付された複数のファイルをループで処理する
例として、3つの添付ファイルがあるメールを2通受け取った場合、フローは次のようにコンポーネントが実行されます。
Start
POP3(メールをすべて入力、1つ目のメールを出力)
MIMEDecode(1つ目のメールデータを入力、1つ目の添付ファイルを出力)
Mapper
FilePut(1つ目の添付ファイルをファイル名を付けて出力保存)
End(1つ目の添付ファイル処理のMIMEDecodeからの処理が終了、MIMEDecodeに開始処理が移る)
MIMEDecode(2つ目の添付ファイルを出力)
(中略)
End(2つ目の添付ファイル処理のMIMEDecodeからの処理が終了、MIMEDecodeに開始処理が移る)
MIMEDecode(3つ目の添付ファイルを出力)
(中略)
End(3つ目の添付ファイル処理のMIMEDecodeからの処理終了でループが終了、POP3に開始処理が移る)
POP3(2つ目のメールを出力)
MIMEDecode(1つ目のメールデータを入力、1つ目の添付ファイルを出力)
(中略)
End(1つ目の添付ファイル処理のMIMEDecodeからの処理が終了、MIMEDecodeに開始処理が移る)
MIMEDecode(2つ目の添付ファイルを出力)
(以下、省略)
すべての処理が終了するとEndコンポーネントでフローが終了します。
特定の添付ファイルだけを取得したい場合はMIMEDecodeコンポーネントのMQLでpart[3]のように対象のパートを指定します。
また、特定のメールだけを処理したい場合はPOP3コンポーネントの次にBranchStartコンポーネントなどの分岐処理のコンポーネントで条件分岐することができます。
MIMEDecodeコンポーネントでの取得方法
添付ファイル
メールに添付されたファイル部分のパートのヘッダは、メールを送信するメールクライアントによって異なりますが、例を挙げると次のようなヘッダが付けられています。
<ケース1>
--------------
Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;
name="Book1.xlsx"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="Book1.xlsx"
このようなヘッダが付いたメールのすべてのファイルを取得するには次のMQLで取り出すことができます。
1)part[*].header[Content-Disposition].attribute[filename] = *
または
2)part[*].header[Content-Type].attribute[name] = *
Content-Dispositionヘッダが存在しない次のようなメールでは
2)part[*].header[Content-Type].attribute[name] = *
でのみ取得することが可能です。
<ケース2>
--------------
Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;
name="Book1.xlsx"
Content-Transfer-Encoding: base64
添付ファイル名
MIMEDecodeコンポーネントの機能により、Content-Dispositionヘッダのfilename属性にファイル名が付いたヘッダの場合のみ、FilePathストリーム変数に自動的に取得したファイル名が設定され、フローの中で参照することができます。つまり、次のようなヘッダが付いている場合のみ、FilePathストリーム変数が有効です。
Content-Disposition: attachment;
filename="Book1.xlsx"
下図のようにMapperでFilePathストリーム変数をFilePutコンポーネントの「ファイルパス」プロパティにマッピングしています。
Content-Dispositionヘッダが存在しないまたはfilename属性が存在しない次のような2つのケースではFilePathストリーム変数が無効で、自動的にファイル名が取得できないため、ファイル名を取得する処理が別に必要になります。
<ケース2>Content-Dispositionヘッダが存在しない
--------------
Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;
name="Book1.xlsx"
Content-Transfer-Encoding: base64
<ケース3>filename属性が存在しない
--------------
Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;
name="Book1.xlsx"
Content-Transfer-Encoding: base64
Content-Disposition:"Book1.xlsx"
ファイル名を取得するには、上記で説明したフローに次の処理を追加します。
1) MIMEDecodeコンポーネントをもう1つ配置し、POP3コンポーネントからMIMEデータを入力する
2) MIMEDecodeコンポーネントで、次のように指定します
- 出力ストリームをParameterListにする
- ストリームタブのParameterListストリーム定義に「フィールド名」を「Content-Type」、「データ型」をStringで定義する
3) Mapperコンポーネントで、ファイル名を次のようにマッピングします。
- MIMEDecodeコンポーネントの出力フィールドContent-TypeをMIMEParameterParser関数を使ってname属性を取得し、FilePutコンポーネントの「ファイルパス」プロパティへマッピング
- MIMEParameterParser関数の「取り出すパラメータ名」プロパティにnameを設定
フローとMapperコンポーネントは次のようになります。
MIMEDecode1で添付ファイルを、MIMEDecode2でヘッダをそれぞれ取得しています。
このMapperでは、MIMEParameterParser関数を使ってname属性のファイル名をマッピングしています。
サンプルダウンロード
サンプルのプロジェクトを用意しました。
MIMEDecode.zip
※ダウンロードの前に「ダウンロードソフトウェア契約書」を読んでください。
以下のフローが含まれています。ケース1、2、3のMIMEデータファイルも含んでいますので、POP3メールサーバーを使わないテストにお使いください。
フロー名:POP3_Content-Disposition
POP3コンポーネントでメールを取得、MIMEDecodeコンポーネントのMQLでContent-Dispositionヘッダを指定して添付ファイルを取得
フロー名:POP3_Content-Type
POP3コンポーネントでメールを取得、MIMEDecodeコンポーネントのMQLでContent-Typeヘッダを指定して添付ファイルを取得
フロー名:POP3_Content-Type_name
POP3コンポーネントでメールを取得、MIMEDecodeコンポーネントのMQLでContent-Typeヘッダを指定して添付ファイルを取得、かつ、Content-Typeヘッダからファイル名を取得
フロー名:Case1_Content-Type
ケース1のテストメールのMIMEデータファイルから、MIMEDecodeコンポーネントのMQLでContent-Dispositionヘッダを指定して添付ファイルを取得
フロー名:Case2_Content-Type
ケース2のテストメールのMIMEデータファイルから、MIMEDecodeコンポーネントのMQLでContent-Typeヘッダを指定して添付ファイルを取得し、かつ、Content-Typeヘッダからファイル名を取得
フロー名:Case3_Content-Type
ケース3のテストメールのMIMEデータファイルから、MIMEDecodeコンポーネントのMQLでContent-Typeヘッダを指定して添付ファイルを取得し、かつ、Content-Typeヘッダからファイル名を取得
※サンプルフロー、コンポーネントの各プロパティの設定値については、こちらの仕様書を参考にしてください。