MQLとは、MIME形式のデータのどの部分を取得するかを指定する条件式を記述するためのASTERIA Warp独自の言語です。MIMEデータからボディやヘッダーを取得するMIMEDecodeコンポーネントや、条件によって分岐するBranchStartコンポーネントなどで使います。
※フローでメールを受信してその本文や添付ファイルを処理する場合には、メール監視トリガーを使うと便利です。指定したPOP3サーバーでメールを受信するとフローを起動するように実行設定を定義します。MQLを使うことなく、MIMEヘッダーはフロー変数に自動的に設定され、メール本文や添付ファイルが開始コンポーネントの出力ストリームになります。詳しくはフローサービスマニュアルの「はじめに」-「トリガーごとのフローの作成」-「メール監視起動のフロー」を参照してください。
MIMEDecodeコンポーネントは、IMAPサーバーで受信したメールの処理や特殊なMIME形式からのデータの取り出しなどに利用します。
MIMEの概要、MQLの書式と使用例について説明します。
※MQLの書式は、BranchStartコンポーネントヘルプのMQLに同様の説明があります。
■1. MIMEとは
MIME(Multipurpose Internet Mail Extension)とは、メールやHTTP通信等で利用される多様な言語やファイルを扱うための規格です。テキストデータやファイルなどをパートごとに持ち、1つのデータとして扱う形式になっています。パートとは各種データの区分で、1つのパートはヘッダーとボディで構成されます。ヘッダーには決められた情報が記述されており、メールであればFrom、To、Subjectなどがあります。
MIMEには、シングルパートとマルチパートの2つのタイプがあります。
- シングルパート
メインパートのみのデータです。本文だけのメールなどがこれに該当します。 - マルチパート
メインパートのボディの中に複数の異なるデータがそれぞれ子パートとして含まれています。本文に加え、ファイルが添付されているメールなどがこれに該当します。
■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データ例は次のとおりです。
差出人、宛先、件名
差出人、宛先、件名は、メインパートのヘッダー名「From」「To」「Subject」にそれぞれ該当します。MQLはどのパートかを特定するための条件式なので、ここではメインパートを指定するだけになります。
条件式プロパティ:part[0]
ヘッダー情報を取得する場合は、MIMEDecodeコンポーネントの出力ストリーム型をParameterListにし、ヘッダー名と同じフィールド名を指定することで取得することができます。
メール本文
メール本文は、この例ではメインパートのボディ内にある子パート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コンポーネントの次に置いたマッパーで参照したところ)
詳しくは、フローサービスマニュアルの「はじめに」-「詳細なトピック」-「変数」-「ストリーム変数」の「フローサービス定義のストリーム変数」を参照してください。
その他の例
◎ファイル名に「.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に準拠しているかどうかを確認してください。