MIMEDecodeコンポーネントでメールの添付ファイルを処理する

フローで、メールサーバーで受信したメールを取得し、メールの添付ファイルを処理するには次の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コンポーネントでも処理は同じです。

F1.jpeg

ループ処理

ここでフローのループ処理について説明します。
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コンポーネントの「ファイルパス」プロパティにマッピングしています。

F1C4_1.jpeg

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でヘッダをそれぞれ取得しています。

F3.jpeg

このMapperでは、MIMEParameterParser関数を使ってname属性のファイル名をマッピングしています。

F3C5_1.jpeg

サンプルダウンロード

サンプルのプロジェクトを用意しました。
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ヘッダからファイル名を取得

※サンプルフロー、コンポーネントの各プロパティの設定値については、こちらの仕様書を参考にしてください。

この記事は役に立ちましたか?
1人中1人がこの記事が役に立ったと言っています

他のキーワードで検索する