MQL (MIME Query Language for FlowService)

MQLとは、MIME形式のデータのどの部分を取得するかを指定する条件式を記述するためのASTERIA Warp独自の言語です。MIMEデータからボディやヘッダーを取得するMIMEDecodeコンポーネントや、条件によって分岐するBranchStartコンポーネントなどで使います。

フローでメールを受信してその本文や添付ファイルを処理する場合には、メール監視トリガーを使うと便利です。指定したPOP3サーバーでメールを受信するとフローを起動するように実行設定を定義します。MQLを使うことなく、MIMEヘッダーはフロー変数に自動的に設定され、メール本文や添付ファイルが開始コンポーネントの出力ストリームになります。詳しくはフローサービスマニュアルの「はじめに」-「トリガーごとのフローの作成」-「メール監視起動のフロー」を参照してください。
MIMEDecodeコンポーネントは、IMAPサーバーで受信したメールの処理や特殊なMIME形式からのデータの取り出しなどに利用します。

MIMEの概要、MQLの書式と使用例について説明します。

  1. MIMEとは
  2. MQLの書式
  3. MQLの使用例
  4. 記述したMQLどおりに処理されない場合

※MQLの書式は、BranchStartコンポーネントヘルプのMQLに同様の説明があります。

■1. MIMEとは

MIME(Multipurpose Internet Mail Extension)とは、メールやHTTP通信等で利用される多様な言語やファイルを扱うための規格です。テキストデータやファイルなどをパートごとに持ち、1つのデータとして扱う形式になっています。パートとは各種データの区分で、1つのパートはヘッダーとボディで構成されます。ヘッダーには決められた情報が記述されており、メールであればFrom、To、Subjectなどがあります。

MIMEには、シングルパートとマルチパートの2つのタイプがあります。

  • シングルパート
    メインパートのみのデータです。本文だけのメールなどがこれに該当します。
    mql-mimesingle.png
  • マルチパート
    メインパートのボディの中に複数の異なるデータがそれぞれ子パートとして含まれています。本文に加え、ファイルが添付されているメールなどがこれに該当します。
    mql-mimemulti.png

■2. MQLの書式

MQLとは、MIME形式のデータのどの部分を取得するかを指定する条件式を記述するためのASTERIA Warp独自の言語です。
MQLの書式は以下のようになっています。

《例》
part[0].header[xxx].attribute[yyy] = "zzz"

<パート句>.<ヘッダー句>.<属性句><比較演算子><値>

以下にそれぞれの要素について説明します。

パート句

part[0以上の数値または*]

何番目のMIMEパートを対象とするかを指定します。

《例》
part[*]
すべてのパートが対象になります。

  • 添え字には0以上の数値、または「*」が使用できます。
  • 添え字が[0]の場合はパートそれ自身が対象になります。part[0]はメインパートそれ自身が対象になります。シングルパートの場合、この記述になります。マルチパートの場合は、メインパートおよび子パートすべてのパートを指定したことになり、特にメインパートのヘッダー値を取得するときなどに使用します。
  • 添え字が[1]以降の数値の場合はパートの添え字番目の子パートが対象になります。part[1]はメインパートの最初の子パートが対象になります。
  • 添え字が[*]の場合はメインパートおよび子パートすべてのパートが対象になります。
  • 子パートが階層化しているような場合には、part[1][2](メインパートの1番目の子パートの2番目の子パート)のように記述できます。
  • パート句のみを指定した場合、header[*] = *が補われて評価されます。例えば、part[0] という記述は part[0].header[*]=* と同じです。

ヘッダー句

header[ヘッダー名または*]

条件の対象とするMIMEヘッダーを指定します。

《例》
part[0].header[Subject]
メインパートのSubjectというヘッダーが対象になります。
part[*].header[Content-Type] = "text/plain"
すべてのパートの中でContent-Typeヘッダーが「text/plain」であるものが対象になります。

  • 添え字には文字列(ヘッダー名)、または「*」が使用できます。
  • 添え字が[ヘッダー名]の場合は指定されたヘッダーが対象になります。ヘッダー名は大文字小文字を区別しません。
  • 添え字が[*]の場合はすべてのヘッダーが対象になります。

属性句

attribute[パラメータ名または*]

条件の対象とするMIMEヘッダーの属性(パラメータ)を指定します。

《例》
part[2].header[Content-Disposition].attribute[filename]
2番目の子パートのContent-Dispositionヘッダーのfilenameパラメータが対象になります。

  • 添え字には文字列(パラメータ名)、または「*」が使用できます。
  • 添え字が[パラメータ名]の場合は指定されたパラメータが対象になります。パラメータ名は大文字小文字を区別しません。
  • 添え字が[*]の場合はすべてのパラメータが対象になります。

ヘッダー句と属性句は評価の対象範囲が異なります。属性句は必要に応じて使用します。

《例》
Content-Disposition: attachment; filename="TEST.txt"

ファイル名に「TEST」という文字列が含まれているかどうかを判定するには、次のように記述します。
header[Content-Disposition].attribute[filename] ~= "TEST"

ヘッダーの評価として、次のように記述すると結果はfalseになるため、注意してください。(パラメータはヘッダー句の評価対象に含まれないので、ヘッダー句の対象範囲は「attachment」という文字列に限られます。)
header[Content-Disposition] ~= "TEST"

比較演算子、値

比較演算子は、「=(等しい)」「!=(等しくない)」「~=(値を含む)」が使用できます。値は、文字列、変数、ワイルドカード(*) が使用できます。ワイルドカードが指定された場合は値のチェックは行われず指定のヘッダー(またはパラメータ)の存在のみがチェックされます。

■3. MQLの使用例

ここでは、MIMEDecodeコンポーネントを利用して実際にメールのMIMEデータから各データを取得するためのMQLの使用例を説明します。

取得するのは、以下のデータです。

  • 差出人、宛先、件名
  • メール本文
  • 添付ファイル

利用するMIMEデータ例は次のとおりです。
mql-sample.png

差出人、宛先、件名

差出人、宛先、件名は、メインパートのヘッダー名「From」「To」「Subject」にそれぞれ該当します。MQLはどのパートかを特定するための条件式なので、ここではメインパートを指定するだけになります。

条件式プロパティ:part[0]

ヘッダー情報を取得する場合は、MIMEDecodeコンポーネントの出力ストリーム型をParameterListにし、ヘッダー名と同じフィールド名を指定することで取得することができます。
mql-parameterlist.png

メール本文

メール本文は、この例ではメインパートのボディ内にある子パート1のボディに該当します。

条件式プロパティ:part[1]

※この例では子パート1のボディがメール本文ですが、そうでないものもあります。受け取るMIMEデータの形式にあうようにMQLを記述してください。
《例》
part[*].header[Content-Type] = "text/plain"
上記のようにContent-Typeヘッダーで特定する場合、テキスト形式の添付ファイルなども取得します。取得したくない場合は、受け取るMIMEデータの形式にあうようにMQLを記述してください。

メール本文を取得する場合は、MIMEDecodeコンポーネントの出力ストリーム型をTextにします。

添付ファイル

添付ファイルは、この例ではメインパートのボディ内にある子パート2のボディに該当します。
子パート2を直接指定するには次のように記述します。

条件式プロパティ:part[2]

添付ファイルが複数ある場合、すべての添付ファイルを指定したいときは次のように記述します。

part[*].header[Content-Disposition].attribute[filename] = *

※この例ではContent-Dispositionヘッダーのfilenameパラメータにファイル名があることを判断していますが、そうでないものもあります。受け取るMIMEデータの形式にあうようにMQLを記述してください。

添付ファイル名がContent-Typeヘッダーのnameパラメータに指定されている場合は、次の記述で取得することができます。

part[*].header[Content-Type].attribute[name] = *

添付ファイルを取得する場合は、MIMEDecodeコンポーネントの出力ストリーム型をBinaryにします。

添付ファイル名は、MIMEDecodeコンポーネントのストリーム変数FilePathで取得することができます。(下図はMIMEDecodeコンポーネントの次に置いたマッパーで参照したところ)
mql-stream.png

詳しくは、フローサービスマニュアルの「はじめに」-「詳細なトピック」-「変数」-「ストリーム変数」の「フローサービス定義のストリーム変数」を参照してください。

その他の例

◎ファイル名に「.xls」が含まれる
part[*].header[Content-Disposition].attribute[filename] ~= ".xls"

◎ファイル名に「.xls」または「.xlsx」が含まれる
part[*].header[Content-Disposition].attribute[filename] ~= ".xls" || part[*].header[Content-Disposition].attribute[filename] ~= ".xlsx"

◎BranchStartコンポーネントで件名に「AAA」と「BBB」が含まれるMIMEデータのみ処理をしたい
part[*].header[Subject] ~= "AAA" && part[*].header[Subject] ~= "BBB"

※「AAA」または「BBB」のどちらかの場合は右方向に処理は流れません。

■4. 記述したMQLどおりに処理されない場合

MQLに記述したデータが取得できない、または処理の分岐が正しく判断されていない

MIMEデータの指定に誤りがある可能性があります。(特にパート句の添え字に数値を指定した場合に多くあります。)

実際に受け取ったMIMEデータを一旦ファイルなどに出力して内容を確認し、MQLの各句が正しいかを確認してください。
MIMEデータの形式は、そのMIMEを作成したアプリケーション(メールの場合、メーラーなど)に依存するため、送信元が異なる場合はMIMEが異なっていることが多くあります。受け取るデータを処理可能なMIMEに統一するか、MQLで*を使用してマッチするような記述に変更するか、または複数のコンポーネントを利用するなどして対応してください。

「MIMEのxxxxx(ヘッダー名など)が不正です」というメッセージが出力される

記述したヘッダー名などで取得される値に対応していない可能性があります。RFCに準拠しているかどうかを確認してください。

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

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