Luaでのメール処理

このセクションの内容:

概要

Milter用のスクリプト

Spamd用のスクリプト

Rspamd用のスクリプト

メッセージ構造を説明する表

メッセージ構造を説明するテーブル

概要

Dr.Web MailDコンポーネントはLuaプログラムインタプリタを介したインタラクションをサポートします(バージョン5.3.4を使用。Dr.Web for UNIX Mail Serversに同梱)。Luaで記述されたスクリプトをコンポーネントで使用すると、メールメッセージの分析と処理を実行できます。

いずれかのインターフェース(MilterSpamdRspamd)を介してスキャン用に受信したメールメッセージの解析は、対応する*Hookパラメータの指定したインターフェースのパラメータグループにあるDr.Web MailD設定で指定されるLuaのスクリプトを使用して実行されます(Luaプログラムテキスト、または必要な処理プログラムを含むファイルへのパスのいずれかを指定できます)。

その他のメール処理用Luaスクリプトの例は、次の場所にあります。
https://github.com/DoctorWebLtd/drweb-lua-examples/tree/master/maild

Milterインターフェースのメッセージ処理のためのスクリプト

スクリプトの必要条件

ファイルには、メッセージスキャンモジュールのエントリポイントとなるグローバル関数が含まれている必要があります(Dr.Web MailDは、新しく受信したメッセージを処理する際にこの関数を呼び出します)。処理関数は、次の呼び出し規則を満たす必要があります。

1.関数名milter_hookです。

2.引数MilterContextテーブルのみです(関数から処理されたメールメッセージに関する情報へのアクセス権限を付与します)。

3.返り値MilterResult完了テーブルのみです。返り値は、スキャンされたメッセージについての判定(承認:"accept"、拒否:"reject"、変更:"change"、破棄:"discard")の他、メッセージが承認された場合にメッセージに適用される(可能性がある)アクションを定義します。

Milterインターフェースを介してスキャンするために受信されたすべてのメッセージのAccept判定を無条件にDr.Web MailDに返すスクリプトの定義例(ctx引数はMilterContextテーブルのインスタンスになります)

function milter_hook(ctx)
  return {action = "accept"}
end

処理中に以下の変更を加える例:

メールメッセージで検出された脅威の名前をヘッダーX-Foundの値として追加する。

スパムスコアが100ポイントを超える場合は、メールの件名(ヘッダーSubjectの値)に"[SPAM]"プレフィックスを追加する。

function milter_hook (ctx)

 -- 検出された脅威の名前をヘッダーに追加します
 for threat in ctx.message.threats() do
   ctx.modifier.add_header_field("X-Found", threat.name)
 end

 -- メッセージのスパムスコアが100ポイントを超える場合は、
 -- Subjectヘッダーの値を変更します
 if ctx.message.spam.score > 100 then
  local old_value = ctx.message.header.value("Subject") or ""
  local new_value = "[SPAM] " .. old_value
   ctx.modifier.change_header_field("Subject", new_value)
 end

 -- 保留中の変更を適用して受信者にメッセージを送信します
 return {
   action = "accept",
   modifications = ctx.modifier.modifications()
 }

end

処理中にメッセージをリパックする例:

検出された脅威を保護されたアーカイブに移動する。

スパムスコアが100ポイントを超える場合は、保護されたアーカイブにメールメッセージを移動する。

function milter_hook(ctx)

 ctx.modifier.repack_password = "xxx"
 ctx.modifier.repack_message = ""

 -- すべての部分をパスワードで保護されたアーカイブに移動します
 -- 脅威が見つかったメッセージ
 for threat, path in ctx.message.threats() do
   ctx.modifier.repack(path)
  local msg = " Threat found: " .. threat.name
   ctx.modifier.repack_message = ctx.modifier.repack_message .. msg
 end

 -- スパムスコアが100ポイントを超えている場合、
 -- メッセージ全体をリパックします
 if ctx.message.spam.score > 100 then
   ctx.modifier.repack()
  local msg = " Spam score: " .. ctx.message.spam.score
   ctx.modifier.repack_message = ctx.modifier.repack_message .. msg
 end

 -- 保留中の変更を適用して受信者にメッセージを送信します
 -- 変更テーブルが指定されていない場合は、
-- 自動的に返されます
 return {action = "accept"}

end

メッセージから削除された不要な部分をすべて含むアーカイブは、新しく生成されたメッセージ(リパックされたメッセージ)の添付ファイルとして受信者に送信されます。アーカイブはパスワードで保護されます。この場合のパスワードは、文字列"xxx"が強制的に適用されます。

使用中のテーブル

テーブルMilterContext

milter_hook関数の入力引数として使用されます。処理されたメールメッセージに関する情報(フィールド、構造、ヘッダー、本文、送信者と受信者に関する情報、SMTPセッションに関する情報)へのアクセス権限を提供します。テーブルには以下のフィールドを含みます。

フィールド

説明

データタイプ

session_id

このクライアントからのメッセージが処理されている間のクライアントセッションの識別子。

文字列

sender

メールの送信者に関する情報。

テーブルMilterSender

helo

メールメッセージを送信したSMTPクライアントから受信したウェルカム文字列HELO/EHLO、または文字列が見つからない/不明の場合(MTAによって提供されない場合)はnil

文字列

from

山括弧なしの送信者のメールアドレス(例:user@domain.com

文字列

to

山括弧なしの受信者のメールアドレス

テーブルRcptTo

message

メール(本文とすべてのヘッダーを含む)

テーブルMimeMessage

modifier

MilterModifierテーブルには、MilterResultテーブルのスキャン結果に従って"accept"アクションが生成された場合にメッセージに行われるすべての変更が含まれます。

テーブルMilterModifier

無効になったメタメソッドなし

テーブルMilterSender

MilterContextテーブルのsenderフィールドとして使用されます。このテーブルには、メール送信者に関する情報が格納され、以下のフィールドが含まれます。

フィールド

説明

データタイプ

hostname

送信者のホスト名(FQDN)

文字列

family

文字列で示した接続タイプ

"U" - 不明なタイプ

"L" - UNIXソケット経由の接続

“4” - IPv4経由の接続

"6" - IPv6経由の接続

文字列

port

ポート番号

整数

ip

送信者のホストのIPアドレス。IPアドレスがないか不明の場合(MTAから提供されない場合)はnil

テーブルIpAddress

無効になったメタメソッドなし

テーブルMilterResult

結果として使用されます。milter_hook関数によって返されます。以下のフィールドを含みます。

フィールド

説明

データタイプ

action

メッセージに適用するアクションの説明を含む文字列:

"accept" - 承認(MTAから受信者へのメッセージ送信を許可します)。

"discard" - 送信者に通知せずにメッセージを破棄します

"reject" - メッセージを拒否し、SMTP 5**コードを送信者に返します。

"tempfail" - メッセージを拒否し、SMTP 4**コードを送信者に返します。

"replycode" - codeフィールドで指定されたSMTP応答を送信者に送信します。

必須フィールド。

文字列

code

送信者に送信される3桁のSMTP応答コード(例:"541")。

オプションのフィールドです。action = "replycode"の場合にのみ使用します。

文字列

text

送信者に送信される応答テキストを含む文字列(例:"User not local or invalid address – Relay denied")。

オプションのフィールドです。action = "replycode"の場合にのみ使用します。

文字列

message

送信者に送信された応答テキストを含む文字列(例:"Message rejected as spam")。

オプションのフィールドです。action = "reject"の場合にのみ使用します。

文字列

modifications

変更の説明を含むテーブル。受信者に送信する前にメールメッセージに適用されます。

オプションのフィールドです。action = "accept"の場合にのみ使用します。

テーブルMilterModifications

added_recipients

追加のメッセージ受信者のメールアドレスのリスト。

オプションのフィールドです。action = "accept"の場合にのみ使用します。

文字列の配列

deleted_recipients

メッセージ受信者のリストから除外する必要があるメールアドレスのリスト。

オプションのフィールドです。action = "accept"の場合にのみ使用します。

文字列の配列

incident

Mailタイプの登録済みイベントのインシデントの説明。

このフィールドが文字列の場合、この文字列の内容がMailイベントのincident_textフィールドに送信され、イベントが登録されます。

このフィールドがブール値でfalseに等しい場合、Mailイベントのincident_textフィールドは存在せず、イベントは登録されません。

このフィールドがブール値でtrueに等しい場合、Mailイベントのincident_textフィールドは自動的に入力され、incident_textの値が空でない場合はイベントが登録されます。

文字列またはブール値

無効になったメタメソッドなし

テーブルMilterModifications

受信者への配信が決定された場合(acceptアクションが選択された場合)に、メールメッセージに対して行われる必要がある、すべての変更の説明に使用されます。次のフィールドが含まれます(すべてのフィールドはオプションです。対応するフィールド値がない場合、アクションはメッセージに適用されません)。

フィールド

説明

データタイプ

new_body

処理されたメッセージの本文を置き換えるために使用される新しいメッセージ本文(ヘッダーなし)

文字列

added_fields

処理されたメッセージに追加されるヘッダー

MilterAddedFieldテーブルの配列

changed_fields

処理されたメッセージから変更または削除されるヘッダー

MilterChangedFieldテーブルの配列

無効になったメタメソッドなし

テーブルMilterAddedField

処理されたメッセージに追加されるヘッダーの説明に使用されます。以下のフィールドを含みます。

フィールド

説明

データタイプ

name

ヘッダー名

文字列

value

ヘッダー値

文字列

無効になったメタメソッドなし

テーブルMilterChangedField

処理されたメッセージ内で変更される(または削除される)ヘッダーの説明に使用されます。以下のフィールドを含みます。

フィールド

説明

データタイプ

name

ヘッダー名

文字列

index

変更するメッセージ内でnameの名前を持つヘッダーの序数(1からカウント)

番号

value

ヘッダーの新しい値(ヘッダーを削除する場合、値は空の文字列""になります)。

文字列

無効になったメタメソッドなし

処理後にメッセージに加えられる変更の説明については、MilterModificationsテーブルに直接入力しないことをお勧めします。代わりに、コンテキストから受け取ることができるMilterModifierテーブルのメソッドを使用してください。

テーブルMilterModifier

処理後(および受信者に送信される場合)に、メッセージの変更のスケジュールを設定するためのインターフェースを提供するために使用されます。以下のフィールドを含みます。

フィールド

説明

データタイプ

add_header_field

メールメッセージに新しいヘッダーを追加するアクションのスケジュールを設定する関数。

次の2つの必須の引数を受け取ります。

nameはヘッダー名(文字列)です。

valueはヘッダー値(文字列)です。

値はRFC 2047に従ってエンコードされます。

機能

change_header_field

指定されたヘッダーを変更(または削除)するアクションのスケジュールを設定する関数。

次の2つの必須の引数を受け取ります。

nameはヘッダー名(文字列)です。

valueはヘッダー値(文字列)です。

メッセージに指定された名前を持つ複数のヘッダーがある場合、この関数はその名前を持つ最初のヘッダーの値を変更します。同じヘッダーの値が複数回変更された場合は、最後の値だけが保持されます。valueが空の文字列""の場合、ヘッダーのnameはメッセージから削除されます。

値はRFC 2047に従ってエンコードされます。

機能

modifications

メールメッセージへの実行がスケジュール設定されている変更の全リストを含むMilterModificationsテーブルを返す関数。引数はありません。

機能

repack

指定したメッセージ部分(部分が指定されていないか指定された部分がない場合はメッセージ全体)のリパックのスケジュールを設定する関数。リパック中に、指定した部分がパスワード付きでアーカイブに追加されます。

オプションの引数pathまたはiteratorを受け入れます。

pathは、アーカイブされるスキャンされたメールの添付ファイルへのパスです。パスが指定されていない場合や、指定されたパスが無効な場合は、メッセージ全体がアーカイブされます。

iteratorはメッセージ部分の反復子であり、関数によって、MimePartテーブルのthreatsurlsattachmentsfilespartsleaf_partstext_partsが返されます。この場合、反復子から返されたメッセージのすべての部分がリパックされるようにスケジュールされます。

関数の引数が指定されていない場合、または指定されたパスが無効な場合は、メッセージ全体がアーカイブされます。

例:

-- パスワード付きアーカイブへのメッセージのリパックのスケジュールを設定します
-- (メッセージ全体)
ctx.modifier.repack()

-- パスワード付きアーカイブへのメッセージのリパックのスケジュールを設定します
-- 指定されたパスのメッセージ部分(または
-その部分がない場合メッセージ全体)
ctx.modifier.repack('/1/2/3')

-- パスワード付きアーカイブへのメッセージのリパックのスケジュールを設定します
-- (実行ファイルを含むすべての部分)
ctx.modifier.repack(ctx.message.files{name='*.exe'})

-- パスワード付きアーカイブへのメッセージのリパックのスケジュールを設定します
-- (すべてのZIP添付ファイル)
ctx.modifier.repack(ctx.message.attachments{name='*.zip'})

機能

repack_archive_name

メッセージの悪意のあるアイテムまたは不要なアイテムを圧縮するためのアーカイブの名前。デフォルトでは、"quarantine.zip"

文字列

repack_password

アーカイブ保護のためのパスワード。指定されていない場合は、構成ファイルに指定されたパスワードが使用されます(RepackPasswordパラメータ)。

文字列

repack_message

メッセージ(またはその部分)のリパックの理由を表す任意のメッセージ。最終メッセージに追加されます(省略することもできます)。

文字列

templates_dir

リパックのためのテンプレートが保存されているディレクトリへのパス。パスは、設定ファイル(TemplatesDirパラメータ)に指定したパスを基準にした相対パスになります。デフォルト値は"milter"です(つまり、milterサブディレクトリのテンプレートが使用されます)。

文字列

無効になったメタメソッドなし

このテーブルにアクセスするには、MilterContextテーブルのmodifierフィールドを使用する必要があります。例:

function milter_hook(ctx)

 -- ヘッダーリストの末尾に新しいヘッダーを追加する
 -- スケジュールを設定します
 ctx.modifier.add_header_field("X-Name", "Value")

 -- "Subject"フィールドの値を"New value"に変更するスケジュールを設定します
 ctx.modifier.change_header_field("Subject", "New value")

 -- パスワード付きアーカイブへのメッセージのリパックのスケジュールを設定します
 ctx.modifier.repack()

 -- メッセージ保留中のすべての変更を使用し、
 -- milterプロトコルを介して判定を返します(テーブルMilterResult)
 return { action = "accept"}
end

MilterModifierテーブルは使用せずに、MilterModifierテーブル(およびそのmodificationsフィールド、つまりMilterModificationsテーブル)に直接入力する例。

-- “X-Checked: True”ヘッダーを追加し、
-- 受信者へのメッセージ送信を有効にします。

function milter_hook(ctx)
 return {
  action = “accept”,
  modifications = {
    added_fields = {
      {
        name = "X-Checked",
        value = "True"
      }
    }
  }
 }
end

MilterModifierテーブルに加えられた変更を無視した、accept判定の返信例:

function milter_hook(ctx)

 …

-- メッセージヘッダーを追加するスケジュールを設定します
 ctx.modifier.add_header_field('X-Header', 'some value')

 …

-- 空のMilterModificationsテーブルを強制的に返します
 return {action = "accept", modifications = {}}
end

Spamdインターフェースのメッセージ処理のためのスクリプト

スクリプトの必要条件

ファイルには、メッセージスキャンモジュールのエントリポイントとなるグローバル関数が含まれている必要があります(Dr.Web MailDは、新しく受信したメッセージを処理する際にこの関数を呼び出します)。処理関数は、次の呼び出し規則を満たす必要があります。

1.関数名spamd_report_hookです。

2.引数SpamdContextテーブルのみです(関数から処理されたメールメッセージに関する情報へのアクセス権限を付与します)。

3.返り値は入力済みのSpamdReportResultテーブルのみです。返り値はSpamdを介した応答を定義します。

Dr.Web MailDでメッセージをスパムとしてマークする必要があるという判定を無条件に返すスクリプトの適切な定義の例(スパムポイント:200、スパム認識しきい値:100、メッセージ:メッセージはスパムとして認識されました。これ以降、ctx引数はSpamdContextテーブルのインスタンスになります):

-- 簡単な実行例
 
function spamd_report_hook(ctx)
 return {
  score = 200,
  threshold = 100,
  report = "The message was recognized as spam"
 }
end

使用中のテーブル

テーブルSpamdContext

spamd_report_hook関数の入力引数として使用されます。処理されたメールメッセージに関する情報(フィールド、構造、ヘッダー、本文、送信者と受信者に関する情報、SMTPセッションに関する情報)へのアクセス権限を提供します。テーブルには以下のフィールドを含みます。

フィールド

説明

データタイプ

session_id

このクライアントからのメッセージが処理されている間のクライアントセッションの識別子。

文字列

message

メールメッセージ。

テーブルMimeMessage

無効になったメタメソッドなし

テーブルSpamdReportResult

結果として使用されます。spamd_report_hook関数によって返されます。スパムのスキャン結果をDr.Web MailDに渡します。結果はMTAに返されます。以下のフィールドを含みます。

フィールド

説明

データタイプ

score

スキャン中にメールメッセージに割り当てられたスパムポイントの数(MTAの場合、Eximによって$spam_score変数と$spam_score_int変数が入力されます)

番号

threshold

メッセージがスパムと見なされるしきい値

番号

report

メッセージスキャンのテキスト結果(MTAの場合、Eximによって$spam_report変数が入力されます)

文字列

incident

Mailタイプの登録済みイベントのインシデントの説明。

このフィールドが文字列の場合、この文字列の内容がMailイベントのincident_textフィールドに送信され、イベントが登録されます。

このフィールドがブール値でfalseに等しい場合、Mailイベントのincident_textフィールドは存在せず、イベントは登録されません。

このフィールドがブール値でtrueに等しい場合、Mailイベントのincident_textフィールドは自動的に入力され、incident_textの値が空でない場合はイベントが登録されます。

文字列またはブール値

無効になったメタメソッドなし

Rspamdインターフェースのメッセージ処理のためのスクリプト

スクリプトの必要条件

ファイルには、メッセージスキャンモジュールのエントリポイントとなるグローバル関数が含まれている必要があります(Dr.Web MailDは、新しく受信したメッセージを処理する際にこの関数を呼び出します)。処理関数は、次の呼び出し規則を満たす必要があります。

1.関数名rspamd_hookです。

2.引数RspamdContextテーブルのみです(関数から処理されたメールメッセージに関する情報へのアクセス権限を付与します。下のテーブルの説明を参照)。

3.返り値は入力済みのRspamdResultテーブルのみです(下のテーブルの説明を参照)。返り値はRspamDを介した応答を定義します。

スクリプトの定義例(ctx引数はRspamdContextテーブルのインスタンスになります):

-- 簡単な実行例

function rspamd_hook(ctx)
 return {
  score = 200,
  threshold = 100
 }
end

MTAと、メールメッセージにスパムポイントを付与する理由を定義するRspamdSymbolテーブルに対して推奨されるアクションの応答例:

function rspamd_hook(ctx)
 return {
  score = 1080,
  threshold = 100,
  action = "REJECT:Malicious message"
  symbols = {
   {
     name = "Threat found",
     score = 1000
   },
   {
     name = "Spam score by VadeRetro",
     score = 80
   }
  }
 }
end

使用中のテーブル

テーブルRspamdContext

rspamd_hook関数の入力引数として使用されます。処理されたメールメッセージに関する情報へのアクセス権を提供します。テーブルには以下のフィールドを含みます。

フィールド

説明

データタイプ

session_id

このクライアントからのメッセージが処理されている間のクライアントセッションの識別子。

文字列

sender

メッセージ送信者に関する情報

テーブルRspamdSender

helo

SMTPクライアントから受信した文字列HELO/EHLO、または文字列が見つからない/不明の場合(MTAによって提供されない場合)はnil

文字列

from

送信者のメールアドレス(山括弧なし、例:user@domain.com)。アドレスが見つからない/不明な場合(MTAから提供されない場合)はnil

文字列

to

山括弧なしの受信者のメールアドレス

テーブルRcptTo

message

メールメッセージ

テーブルMimeMessage

無効になったメタメソッドなし

テーブルRspamdSender

メッセージ送信者に関する情報を記述します。以下のフィールドを含みます。

フィールド

説明

データタイプ

hostname

送信者のホストの名前(FQDN)、または名前が見つからないか不明の場合(MTAによって提供されない場合)はnil

文字列

ip

送信者のホストのIPアドレス。アドレスが見つからないか不明の場合(MTAから提供されない場合)はnil

テーブルIpAddress

無効になったメタメソッドなし

テーブルRspamdResult

これは、rspamd_hook関数の結果として使用されます。次のフィールドとしてメッセージスキャンレポートが含まれます。

フィールド

説明

データタイプ

score

スキャン中にメールメッセージに割り当てられたスパムポイントの数(MTAの場合、Eximによって$spam_score変数と$spam_score_int変数が入力されます)

番号

threshold

メッセージがスパムと見なされるしきい値

番号

action

オプションのフィールドです。メッセージスキャンの結果としてMTAに推奨されるアクション(MTAの場合、Eximにより$spam_action変数が入力されます)

文字列

symbols

オプションのフィールドです。scoreフィールドで指定されたスパムポイント数を割り当てる理由を特定するためのRspamdSymbolテーブルの配列

RspamdSymbolテーブルの配列

incident

Mailタイプの登録済みイベントのインシデントの説明。

このフィールドが文字列の場合、この文字列の内容がMailイベントのincident_textフィールドに送信され、イベントが登録されます。

このフィールドがブール値でfalseに等しい場合、Mailイベントのincident_textフィールドは存在せず、イベントは登録されません。

このフィールドがブール値でtrueに等しい場合、Mailイベントのincident_textフィールドは自動的に入力され、incident_textの値が空でない場合はイベントが登録されます。

文字列またはブール値

無効になったメタメソッドなし

テーブルRspamdSymbol

記号の内容を表すテーブル。メッセージに割り当てられている特定数のスパムポイントに対してスキャン中に見つかったアイテム(脅威のあるファイル、不要なURLなど)を示します。テーブルには以下のフィールドを含みます。

フィールド

説明

データタイプ

name

検出されたアイテムの名前。

文字列

score

アイテム検出のためにメッセージに割り当てられるスパムポイントの数。

番号

description

オプションのフィールドです。検出されたアイテムの説明

文字列

無効になったメタメソッドなし

メッセージ構造を説明する表

テーブルRcptTo

SMTPプロトコルのRCPT TOコマンドで発生したメッセージ受信者(山括弧なし)のメールアドレスの配列を含むテーブル。さらに、次のフィールドが含まれています。

フィールド

説明

データタイプ

search

アドレス配列内の指定されたテンプレートの少なくとも1つに対応する少なくとも1つのアドレスの存在を確認する関数。

Perl構文(PCRE)の1つの必須patterns引数(検索パターン:1つ(文字列)または複数(文字列の配列))の正規表現を受け入れます。

ブール値を返します。

true - 少なくとも1つのテンプレートに完全に対応するアドレスが見つかった場合。

false - それ以外の場合。

大文字と小文字を区別しません。

機能

all_match

すべてのアドレスがアドレス配列内の指定されたテンプレートの少なくとも1つに対応するかどうかをチェックする関数。

Perl構文(PCRE)の1つの必須patterns引数(検索パターン:1つ(文字列)または複数(文字列の配列))の正規表現を受け入れます。

ブール値を返します。

true - すべてのアドレスが少なくとも1つのテンプレートに完全に対応する場合。

false - それ以外の場合。

大文字と小文字を区別しません。

機能

無効になったメタメソッドなし

テーブルMimeMessage

このテーブルは、スキャンされたメールメッセージの概要を示します(MimePartテーブルから継承され、そのすべてのフィールドを含みます)。テーブルには以下のフィールドを含みます。

フィールド

説明

データタイプ

dkim

メールメッセージのDKIM署名(RFC 6376を参照)

DKIMテーブル

raw

クライアントから受信したメッセージ

文字列

spam

スパムの兆候に対するメッセージスキャンの結果についてのレポート

テーブルSpam

from

メッセージにFromがない場合、メッセージヘッダーの値はFromまたはnil

テーブルFrom

to

メッセージにToがない場合、メッセージヘッダーの値はToまたはnil

テーブルTo

date

メッセージにDateがない場合、メッセージヘッダーの値は、Dateまたはnil

文字列

message_id

メッセージにMessage-IDがない場合、メッセージヘッダー値はMessage-IDまたはnil

文字列

subject

メッセージにSubjectがない場合、メッセージヘッダーの値はSubjectまたはnil

文字列

user_agent

メッセージにUser-Agentがない場合、メッセージヘッダーの値はUser-Agentまたはnil

文字列

MimePartテーブルから継承したフィールド)

無効になったメタメソッドなし

テーブルMimePart

このテーブルは、メールメッセージの部分を説明したもので、次のフィールドが含まれます。

フィールド

説明

データタイプ

header

メールメッセージのヘッダー

テーブルMimeHeader

body

該当部分の本体。添付された部品がある場合はnil

テーブルMimeBody

part

テーブルの配列として(現在のメッセージ部分に)添付された部分。添付された部品がない場合、配列は空になります。

MimePartテーブルの配列

content_disposition

このヘッダーが該当部分にない場合、Content-Dispositionヘッダーのコンテンツ、またはnil

ContentDispositionテーブル

content_id

このヘッダーが該当部分にない場合、Content-IDヘッダーのコンテンツまたはnil

文字列

content_type

このヘッダーが該当部分にない場合、Content-Typeヘッダーのコンテンツまたはnil

ContentTypeテーブル

name

添付ファイル名。該当部分が添付ファイルでない場合はnil

文字列

part_at

path引数(メッセージの子部分へのパス)を受け取る関数。指定されたパスにある添付されたメッセージ部分(テーブルMimePart)を返します。

path"/ 1/2/3"のような文字列となります。これは、root_part. part [1]. part [2]. part [3]を意味します。数字のない"""/""//"のようなパスはメッセージ部分に対応し、この関数の呼び出し元になります(例:root_part)。指定したパスに子部分がない場合や、パスが正しくない場合は、関数はnilを返します。

機能

threats

オプションの引数filterを1つ受け取る関数。この関数は単一の値、つまり反復子関数を返します。この反復子を使用すると、メッセージのこの部分と添付部分にある、指定されたfilter条件を満たすすべての脅威を調べることができます。反復子関数は引数を持たず、次の2つの値を返します。

Virusテーブル。

検出された脅威を含むメッセージ部分への相対パス。

filter引数として、次のものを使用できます。

ThreatFilterテーブル。

Virus引数のみを受け取り、次のブール値を返す任意の叙述関数:

otrue - 引数が条件を満たしている(脅威である)場合。

ofalse - それ以外の場合。

機能

urls

オプションの引数filterを1つ受け取る関数。この関数は単一の値、つまり反復子関数を返します。この反復子を使用すると、メッセージのこの部分と添付部分にある、指定されたfilter条件を満たすすべてのURLを調べることができます。反復子関数は引数を持たず、次の2つの値を返します。

Urlテーブル。

見つかったURLを含むメッセージ部分への相対パス。

filter引数として、次のものを使用できます。

UrlFilterテーブル。

Url引数のみを受け取り、次のブール値を返す任意の叙述関数:

otrue - 引数が条件を満たしている(不要である)場合。

ofalse - それ以外の場合。

機能

attachments

オプションの引数filterを1つ受け取る関数。この関数は単一の値、つまり反復子関数を返します。この反復子を使用すると、メッセージのこの部分と添付部分にある、指定されたfilter条件を満たすすべての添付ファイルを調べることができます。反復子関数は引数を持たず、次の2つの値を返します。

MimePartテーブル。

見つかった添付ファイルを含むメッセージ部分への相対パス。

filter引数として、次のものを使用できます。

PartFilterテーブル。

MimePart引数のみを受け取り、次のブール値を返す任意の叙述関数

otrue - 引数が条件を満たしている場合。

ofalse - それ以外の場合。

機能

files

オプションの引数filterを1つ受け取る関数。この関数は単一の値、つまり反復子関数を返します。この反復子を使用すると、メッセージのこの部分と添付部分(アーカイブを含む)にある、指定されたfilter条件を満たすすべてのファイルを調べることができます。反復子関数は引数を持たず、次の2つの値を返します。

文字列で示したファイル名。

見つかったファイルを含むメッセージ部分への相対パス。

filter引数として、次のものを使用できます。

FileFilterテーブル。

ファイル名を文字列として受け取り、次のブール値を返す任意の叙述関数:

otrue - 引数が条件を満たしている場合。

ofalse - それ以外の場合。

機能

parts

オプションの引数filterを1つ受け取る関数。この関数は単一の値、つまり反復子関数を返します。この反復子を使用すると、メッセージのこの部分と添付部分にある、指定されたfilter条件を満たすすべてのメッセージ部分を調べることができます。反復子関数は引数を持たず、次の2つの値を返します。

MimePartテーブル。

メッセージ部分への相対パス。

filter引数として、次のものを使用できます。

PartFilterテーブル。

MimePartテーブルを受け取り、次のブール値を返す任意の叙述関数:

otrue - 引数が条件を満たしている場合。

ofalse - それ以外の場合。

機能

leaf_parts

オプションの引数filterを1つ受け取る関数。この関数は単一の値、つまり反復子関数を返します。この反復子を使用すると、メッセージのこの部分と添付部分にある、指定されたfilter条件を満たすすべてのリーフ部分を調べることができます。反復子関数は引数を持たず、次の2つの値を返します。

MimePartテーブル。

メッセージ部分への相対パス。

filter引数として、次のものを使用できます。

PartFilterテーブル。

MimePartテーブルを受け取り、次のブール値を返す任意の叙述関数:

otrue - 引数が条件を満たしている場合。

ofalse - それ以外の場合。

機能

text_parts

オプションの引数filterを1つ受け取る関数。この関数は単一の値、つまり反復子関数を返します。この反復子を使用すると、メッセージのこの部分と添付部分にある、指定されたfilter条件を満たすすべてのテキスト部分を調べることができます。反復子関数は引数を持たず、次の2つの値を返します。

MimePartテーブル。

メッセージ部分への相対パス。

filter引数として、次のものを使用できます。

PartFilterテーブル。

MimePartテーブルを受け取り、次のブール値を返す任意の叙述関数:

otrue - 引数が条件を満たしている場合。

ofalse - それ以外の場合。

機能

scan_reports

オプションのfilterを1つ受け取る関数。この関数は単一の値、つまり反復子関数を返します。この反復子を使用すると、指定されたfilter条件を満たす、メールの該当部分およびその添付ファイルの部分をスキャンするレポートを処理できます。

反復子関数には引数がなく、単一の値、つまりScanReportテーブルを返します。

filter引数として、次のものを使用できます。

ScanReportFilterテーブル。

ScanReportテーブルを受け取り、次のブール値を返す任意の叙述関数:

otrue - 引数が条件を満たしている場合。

ofalse - それ以外の場合。

機能

has_url

オプション引数filterを1つの受け取る関数(既述のurls関数の説明を参照)。

ブール値を返します。

true - メッセージの該当部分とその添付された部分に条件filterを満たすURLが含まれる場合。

false - それ以外の場合。

例:

if ctx.message.has_url() then
  -- メールメッセージに少なくとも1つのURLが見つかりました
end

if ctx.message.has_url{category = "adult_content"} then
  -- adult contentのリンクが見つかりました
end

if ctx.message.has_url{category = {"adult_content", "social_networks"}} then
  -- 「adult_content」または「social_networks」リンクが見つかった場合
end

if ctx.message.has_url{category = "black_list"} then
  -- ブラックリストリソースへのリンクが見つかった場合
end

if ctx.message.has_url{host = "example.com"} then
  -- ホスト部分が"example.com"であるリンクが見つかりました
end

if ctx.message.has_url{host_not = "*example.com"} then
  -- ホスト部分が"*example.com"に該当しないリンクが見つかりました
end

if ctx.message.has_url(function(url) return port > 80 end) then
  -- ポート番号が80より大きいリンクが見つかりました
end

機能

has_threat

オプション引数filterを1つの受け取る関数(既述のthreats関数の説明を参照)。

ブール値を返します。

true - メッセージの該当部分と添付ファイル部分に条件filterを満たす脅威が含まれる場合。

false - それ以外の場合。

例:

if ctx.message.has_threat() then
  -- メッセージに、いずれかのカテゴリーの脅威が1つ以上含まれています
end

if ctx.message.has_threat({category = "known_virus"}) then
  -- メッセージに、「known_virus」カテゴリーの脅威が1つ以上含まれている
end

if ctx.message.has_threat{category = "known_virus"} then
  -- 同上
end

if ctx.message.has_threat({category = {"known_virus", "joke"}}) then
  -- メッセージに、「known_virus」カテゴリーまたは「joke」カテゴリーの脅威が1つ以上含まれている
end

if ctx.message.has_threat{category_not = "joke"} then
  -- メッセージに、「joke」以外のカテゴリーの脅威が含まれている
end

機能

has_file

オプション引数filterを1つの受け取る関数(既述のfiles関数の説明を参照)。

ブール値を返します。

true - メッセージの該当部分とその添付ファイル部分に条件filterを満たすファイルが含まれる場合(アーカイブのファイルを含む)。

false - それ以外の場合。

例:

if ctx.message.has_file() then
  -- メールメッセージに少なくとも1つのファイルが見つかりました
end

if ctx.message.has_file{name = "*.exe"} then
  -- メールメッセージに少なくとも1つのexeファイルが見つかりました
end

機能

has_part

オプション引数filterを1つの受け取る関数(既述のparts関数の説明を参照)。

ブール値を返します。

true - メッセージの該当部分とその添付ファイル部分に条件filterを満たす部分が含まれる場合。

false - それ以外の場合。

機能

has_scan_report

オプション引数filterを1つ受け取る関数(上記のscan_reports関数の説明を参照)。

ブール値を返します。

true - メッセージの該当部分とその添付ファイル部分に条件filterを満たすスキャンレポートが含まれる場合。

false - それ以外の場合。

使用例については、ScanReportFilterテーブルの編集を参照してください。

機能

search

正規表現(PCRE)を使用してこのメッセージセクション内のテキストを検索する関数。正規表現(文字列)を受け取ります。引用符内で文字列を使用する場合は、スラッシュ文字をエスケープする必要があります。

ブール値を返します。

true - 指定した正規表現との一致がこのセクションまたは子部分で見つかった場合。

false - それ以外の場合。

機能

無効になったメタメソッドなし

テーブルFrom

Fromメールメッセージヘッダーを説明するテーブル。ヘッダー(文字列の配列)から抽出されたメールアドレスのリストが含まれます。さらに、次のフィールドが含まれます。

フィールド

説明

データタイプ

search

アドレス配列内の指定されたテンプレートの少なくとも1つに対応する少なくとも1つのアドレスの存在を確認する関数。

Perl構文(PCRE)の1つの必須patterns引数(検索パターン:1つ(文字列)または複数(文字列の配列))の正規表現を受け入れます。

ブール値を返します。

true - 少なくとも1つのテンプレートに完全に対応するアドレスが見つかった場合。

false - それ以外の場合。

大文字と小文字を区別しません。

機能

all_match

すべてのアドレスがアドレス配列内の指定されたテンプレートの少なくとも1つに対応するかどうかをチェックする関数。

Perl構文(PCRE)の1つの必須patterns引数(検索パターン:1つ(文字列)または複数(文字列の配列))の正規表現を受け入れます。

ブール値を返します。

true - すべてのアドレスが少なくとも1つのテンプレートに完全に対応する場合。

false - それ以外の場合。

大文字と小文字を区別しません。

機能

無効になったメタメソッド:

__tostringは、デコードされたヘッダー値を返す関数です。

__concatは、ヘッダーの復号化された値と文字列を結合する関数です。

テーブルTo

Toメールメッセージヘッダーを説明するテーブル。Fromテーブルと同じフィールドとメソッドが含まれています。

ContentTypeテーブル

メッセージ部分のContent-Typeヘッダーを説明するテーブル。以下のフィールドを含みます。

フィールド

説明

データタイプ

type

メッセージ部分のMIMEタイプ

文字列

subtype

メッセージ部分のサブタイプ

文字列

param

次のフィールドを持つテーブル配列形式のヘッダーパラメータ:

nameはパラメータ名(文字列)です。

valueはパラメータ値(文字列)です。

テーブル配列

無効になったメタメソッド:

__tostringは、デコードされたヘッダー値を返す関数です。

__concatは、ヘッダーの復号化された値と文字列を結合する関数です。

ContentDispositionテーブル

メッセージ部分のContent-Dispositionヘッダーを説明するテーブル。以下のフィールドを含みます。

フィールド

説明

データタイプ

type

メッセージ部分のビュータイプ

文字列

param

次のフィールドを持つテーブル配列形式のヘッダーパラメータ:

nameはパラメータ名(文字列)です。

valueはパラメータ値(文字列)です。

テーブル配列

無効になったメタメソッド:

__tostringは、デコードされたヘッダー値を返す関数です。

__concatは、ヘッダーの復号化された値と文字列を結合する関数です。

テーブルSpam

スパムに対するメッセージスキャンについてのレポートを説明するテーブル。以下のフィールドを含みます。

フィールド

説明

データタイプ

type

メッセージのタイプ(スパムのステータス)可能な値:

"legit" - メッセージはスパムではありません。

"spam" - メッセージはスパムです。

"virus" - ヒューリスティックアナライザVadeRetroにより、メッセージ本文にウイルスが検出されました。

"bounce" - メッセージには、元のメッセージの送信者に送信されたネガティブ配信確認(DSN)に関するレポートが含まれています。

"suspicious" - 疑わしいメッセージ。

"pce" - 有効なサブスクリプションサービスによって送信される「プロフェッショナルな」商用(広告)メッセージ。

"mce" - 有効なサブスクリプションサービスでは送信されないが、サブスクリプションを解除する方法が含まれる商用(広告)メッセージ。

"dce" - サブスクリプションを解除する方法のない「ダーティーな」コマーシャル(広告)メッセージ。

"community" - ソーシャルネットワークからのメッセージ。

"transactional" - トランザクション関連のメッセージ(登録、サービスまたは商品の購入)。

"phishing" - 不正なメッセージ。

"scam" - 不正なメッセージ(詐欺メッセージ)。

文字列

score

メッセージごとに記録されたスパムポイント数。

番号

normalized_score

インターバル[0, 1]で正規化されたスパムスコア

番号

reason

メールメッセージがスパムであるとされた理由の説明を含む暗号化された文字列

文字列

version

VadeRetroライブラリバージョン

文字列

無効になったメタメソッドなし

テーブルVirus

脅威を説明するテーブル。以下のフィールドを含みます。

フィールド

説明

データタイプ

type

脅威の種類(Doctor Webの分類による)。可能な値:

"known_virus" - 既知の脅威(ウイルスデータベースに説明がある脅威)。

"virus_modification" - 既知の脅威の亜種。

"unknown_virus" - 未知の脅威、疑わしいオブジェクト。

"adware" - 広告プログラム。

"dialer" - ダイアラープログラム

"joke" - ジョークプログラム。

"riskware" - 潜在的に危険なプログラム。

"hacktool" - ハッキングツール。

文字列

name

脅威の種類(Doctor Webの分類による)

文字列

無効になったメタメソッドなし

テーブルUrl

URLを説明するテーブル。以下のフィールドを含みます。

フィールド

説明

データタイプ

scheme

スキーム(プロトコル)プレフィックス。例:"http"

文字列

host

ホスト名またはIPアドレス。例:"example.com"

文字列

port

ポート番号。例:80。URLに含まれていない場合、値はnilになります。

番号

path

リソースへのパス。例:"index.html"。URLに含まれていない場合、値はnilになります。

文字列

categories

スキャンの結果としてURLに割り当てられたカテゴリー。可能な値:

"infection_source" - 感染源。

"not_recommended" - 非推奨のWebサイト。

"adult_content" - アダルトコンテンツ。

"violence" - 暴力。

"weapons" - 武器。

"gambling" - ギャンブル。

"drugs" - 薬物。

"obscene_language" - 卑猥な表現。

"chats" - チャット。

"terrorism" - テロリズム。

"free_email" - 無料メール。

"social_networks" - ソーシャルネットワーク。

"owners_notice" - 著作権者からの申し立てによってリストに登録されたWebサイト。

"online_games" - オンラインゲーム。

"anonymizers" - アノニマイザー。

"cryptocurrency_mining_pools" - 仮想通貨マイニングプール。

"jobs" - 求人検索サイト。

"black_list" - ブラックリスト(メールサーバー管理者によって非推奨と見なされるリソース)。

文字列のテーブル

legal_url

URLがowners_noticeカテゴリーに属する場合、フィールドには所有者のWebサイトへのURLが含まれます。属さない場合は、nilになります。

文字列

無効になったメタメソッド:

__toString - この関数は、Urlコンテンツを文字列(UTF-8)として返します。

__concat - この関数は、URL文字列値と別の文字列を連結します。

テーブルThreatFilter

脅威に対するフィルターを説明するテーブル。次のフィールドが含まれます(すべてのフィールドはオプションです)。

フィールド

説明

データタイプ

category

脅威が該当するカテゴリーのリスト(大文字と小文字は区別されません)。Virusテーブルのtypeフィールドの説明にあるカテゴリーのリストを参照してください。

文字列または文字列のテーブル

category_not

脅威が該当しないカテゴリーのリスト(大文字と小文字は区別されません)。

文字列または文字列のテーブル

無効になったメタメソッドなし

フィルターフィールドが指定されていない(値がnil)場合、脅威はフィルターと一致します。複数のフィルターフィールドが指定されている場合、条件は接続詞(論理積)によって結合されます。フィルターフィールドがテーブル(リスト)の場合、オブジェクトは少なくとも1つのテーブル(リスト)の項目と一致する必要があります。

使用例:

1.メッセージ内に見つかったすべての脅威名をログに出力するには、次の手順を実行します。

function milter_hook(ctx)

 …

 for virus in ctx.message.threats() do
  dw.notice("threat found: " .. virus.name)
 end

 …

end

2.カテゴリーフィルターに一致する脅威名と、脅威が検出されたメッセージ部分の名前をログに出力するには、次の手順を実行します。

function milter_hook(ctx)

 …

 for v, p in ctx.message.threats({category = "known_virus"}) do
  dw.notice("found " .. v.name .. " in " .. ctx.message.part_at(p).name(p))
 end

 …

end

3.叙述関数に一致する脅威名と、脅威が検出されたメッセージ部分の名前をログに出力するには、次の手順を実行します。

function milter_hook(ctx)

 …

 local function eicar_filter(v)
  return v.name == "EICAR Test File (NOT a Virus!)"
 end

 for v, p in ctx.message.threats(eicar_filter) do
  dw.notice("found " .. v.name .. " in " .. ctx.message.part_at(p).name(p))
 end

 …

end

テーブルUrlFilter

URLのフィルターを説明するテーブル(既述のテーブルThreatFilterと同様のもの)。次のフィールドが含まれます(すべてのフィールドはオプションです)。

フィールド

説明

データタイプ

category

URLが該当するカテゴリーのリスト(大文字と小文字は区別されません)。Urlテーブルのcategoriesフィールドの説明にあるカテゴリーのリストを参照してください。

文字列または文字列のテーブル

category_not

URLが該当しないカテゴリーのリスト(大文字と小文字は区別されません)。

文字列または文字列のテーブル

text

URLと一致しなければならないテキスト

文字列または文字列のテーブル

text_not

URLと一致できないテキスト

文字列または文字列のテーブル

host

URLに存在するホスト(ドメイン)

文字列または文字列のテーブル

host_not

URLにないホスト(ドメイン)

文字列または文字列のテーブル

無効になったメタメソッドなし

フィルターフィールドが指定されていない(値がnil)場合、脅威はフィルターと一致します。複数のフィルターフィールドが指定されている場合、条件は接続詞(論理積)によって結合されます。フィルターフィールドがテーブル(リスト)の場合、オブジェクトは少なくとも1つのテーブル(リスト)の項目と一致する必要があります。

使用例:

1.メッセージ内に見つかったすべてのURLをログに出力するには、次の手順を実行します。

function milter_hook(ctx)

 …

 for url in ctx.message.urls() do
  dw.notice("url found: " .. url)
 end

 …

end

2.カテゴリーに一致するURLと、URLが検出されたメッセージ部分の名前をログに出力するには、次の手順を実行します。

function milter_hook(ctx)

 …

 for u, p in ctx.message.urls{category = "adult_content"} do
  dw.notice("found " .. u.text .. " in " .. ctx.message.part_at(p).name(p))
 end

 …

end

テーブルFileFilter

ファイルのフィルターを説明するテーブル(既述のテーブルThreatFilterと同様のもの)。次のフィールドが含まれます(すべてのフィールドはオプションです)。

フィールド

説明

データタイプ

name

ファイルに必要な名前。例:"*.exe""eicar.txt"

大文字と小文字を区別しません。

文字列または文字列のテーブル

name_re

ファイル名が一致しなければならない正規表現(PCRE)。例:".*\\.zip"[[.*\.zip]]

大文字と小文字を区別しません。引用符内で文字列を使用する場合は、スラッシュ文字をエスケープする必要があります。

文字列または文字列のテーブル

name_not

ファイルが持つことができない名前。

大文字と小文字を区別しません。

文字列または文字列のテーブル

name_re_not

ファイル名が一致できない正規表現(PCRE)。

大文字と小文字を区別しません。引用符内で文字列を使用する場合は、スラッシュ文字をエスケープする必要があります。

文字列または文字列のテーブル

無効になったメタメソッドなし

複数のフィルターフィールドが指定されている場合、条件は接続詞(論理積)によって結合されます。フィルターフィールドがテーブル(配列)の場合、オブジェクトは少なくとも1つのテーブル(配列)の項目と一致する必要があります。フィルターフィールドが指定されていない(値がnil)場合、ファイルはフィルターと一致します。

使用例:

拡張子として"exe”を持つファイルを含む部分の名前をログに出力する場合

function milter_hook(ctx)

 …

 for f, p in ctx.message.files{name = "*.exe"} do
  local where = ctx.message.part_at(p).name
  if not where or where == "" then where = p end
  dw.notice("EXE found in " .. where)
 end

 …

end

テーブルPartFilter

メッセージ部分のフィルターを説明するテーブル(既述のテーブルFileFilterと同様のもの)。次のフィールドが含まれます(すべてのフィールドはオプションです)。

フィールド

説明

データタイプ

name

その部分に必要な名前。例:"*.exe""eicar.txt"

大文字と小文字を区別しません。

文字列または文字列のテーブル

name_re

部分名が一致しなければならない正規表現(PCRE)。例:".*\\.zip"[[.*\.zip]]

大文字と小文字を区別しません。引用符内で文字列を使用する場合は、スラッシュ文字をエスケープする必要があります。

文字列または文字列のテーブル

content_type

部品(添付ファイル)に必要なContent-Type値。例:"image/*"

大文字と小文字を区別しません。

文字列または文字列のテーブル

content_disposition

該当部分(添付ファイル)が持っていなければならないContent-Disposition値。例:"inline""attachment"

大文字と小文字を区別しません。

文字列または文字列のテーブル

name_not

部分が持つことができない名前。

大文字と小文字を区別しません。

文字列または文字列のテーブル

name_re_not

メッセージ部分の名前が一致できない正規表現(PCRE)。

大文字と小文字を区別しません。引用符内で文字列を使用する場合は、スラッシュ文字をエスケープする必要があります。

文字列または文字列のテーブル

content_type_not

Content-Type部分で一致することができない値。

大文字と小文字を区別しません。

文字列または文字列のテーブル

content_disposition_not

Content-Disposition部分で一致することができない値。

大文字と小文字を区別しません。

文字列または文字列のテーブル

無効になったメタメソッドなし

フィルターフィールドが指定されていない(値がnil)場合、任意の部分(添付ファイル)がフィルターと一致します。複数のフィルターフィールドが指定されている場合、条件は接続詞(論理積)によって結合されます。フィルターフィールドがテーブル(配列)の場合、オブジェクトは少なくとも1つのテーブル(配列)の項目と一致する必要があります。

使用例:

1.すべての添付ファイルとそのMD5ハッシュをログに出力するには、次の手順を実行します。

function milter_hook(ctx)

 …

 for a, p in ctx.message.attachments() do
  -- Content-TypeとContent-Dispositionに指定されていない場合、
  -- 添付ファイル名は空文字列になります
  local name = a.name
  if name == "" then name = "at path " .. p end
  dw.notice("Attachment: " .. name .. "; md5=" .. a.body.md5)
 end

 …

end

2..exe拡張子を持つすべての添付ファイルをログに出力するには、次の手順を実行します。

function milter_hook(ctx)

 …

 for a in ctx.message.attachments{name = "*.exe"} do
  dw.notice("EXE attachment: " .. a.name)
 end

 …

end

3.メールメッセージ内の画像を種類別にカウントするには、次の手順を実行します。

function milter_hook(ctx)

 …

 local images = {}
 for part, path in ctx.message.parts{content_type = "image/*"} do
  local subtype = part.content_type.subtype
  images[subtype] = (images[subtype] or 0) + 1
 end

 for t, c in pairs(images) do
  dw.notice("Found " .. t .. " images: " .. c)
 end

 …

end

4.添付ファイルにあるすべてのオーディオファイルをログに出力するには、次の手順を実行します。

function milter_hook(ctx)

 …

 for p, path in ctx.message.parts{
  content_type = "audio/*",
  content_disposition = {"inline", "attachment"}
 } do
    local name = p.name
    if name == "" then name = "<unnamed>" end
    dw.notice("Audio file: " .. name)
 end

 …

end

テーブルScanReportFilter

脅威のメッセージ部分をスキャンするレポートのフィルターを説明するテーブル(上記のFileFilterと同様)。次のフィールドが含まれます(すべてのフィールドはオプションです)。

フィールド

説明

データタイプ

error

ScanReportに含める必要のあるエラー。たとえば、"password_protected""scan_timeout"

大文字と小文字を区別しません。

文字列または文字列のテーブル

error_not

ScanReportに含めることができないエラー。たとえば、"password_protected""scan_timeout"

大文字と小文字を区別しません。

文字列または文字列のテーブル

無効になったメタメソッドなし

複数のフィルターフィールドが指定されている場合、条件は接続詞(論理積)によって結合されます。フィルターフィールドがテーブル(配列)の場合、スキャンレポートは少なくとも1つのテーブル(配列)の項目と一致する必要があります。フィルターフィールドが指定されていない場合(値はnil)、スキャンレポートはすべてフィルターに一致します。

使用例:

1.パスワードで保護されたアーカイブのスキャンに失敗した場合は、メッセージを隔離します。

function milter_hook(ctx)

 …

 if ctx.message.has_scan_report{error = 'password_protected'} then
  return
    {
      action = 'accept', deleted_recipients = ctx.to,
      added_recipients = {'quarantine@mail.domain.com'}
    }
 end

 …

end

2.スキャン制限を超えている場合は、次のようにメッセージを隔離します。

function milter_hook(ctx)

 …

 local limit_errors = {
  'archive_level_limit', 'compression_limit',
  'container_level_limit', 'mail_level_limit',
  'packer_level_limit', 'report_size_limit'
 }

 if ctx.message.has_scan_report{error = limit_errors} then
  return
    {
      action = 'accept', deleted_recipients = ctx.to,
      added_recipients = {'quarantine@mail.domain.com'}
    }
 end

 …

end

3.スキャンエラーがある場合は、次のようにメッセージを拒否します。

function milter_hook(ctx)

 …

 if ctx.message.has_scan_report{error = '*'} then
  return {action = 'reject'}
 end

 …

end

テーブルMimeHeader

このテーブルは、メッセージ部分のヘッダーについて説明します。以下のフィールドを含みます。

フィールド

説明

データタイプ

field

ヘッダーとその値のリスト

HeaderFieldテーブルの配列

search

正規表現(PCRE)を使用してヘッダーを検索する関数。正規表現(文字列)を受け取ります。メッセージ部分のすべてのヘッダーが検索対象になります。引用符内で文字列を使用する場合は、スラッシュ文字をエスケープする必要があります。

ブール値を返します。

true - field.name .. ": " .. field.value.decoded文字列が、少なくとも1つのヘッダーに対して指定した正規表現と一致する場合。

false - それ以外の場合。

機能

value

指定したヘッダーの値を返す関数。ヘッダー名(文字列)を受け取ります。

指定した名前を持つ最初に見つかったヘッダーに対応するHeaderFieldValueテーブルを返します。ヘッダーが見つからなかった場合は、nilを返します。

機能

無効になったメタメソッドなし

テーブルHeaderField

このテーブルは、メッセージ部分のヘッダーについて説明します。以下のフィールドを含みます。

フィールド

説明

データタイプ

name

ヘッダー名

文字列

value

ヘッダー値

テーブルHeaderFieldValue

url

ヘッダー値に含まれるURLのリスト(Subjectヘッダーのみ)。それ以外のヘッダーの場合は、nil

Urlテーブルの配列

無効になったメタメソッドなし

テーブルHeaderFieldValue

このテーブルは、メールメッセージヘッダーの値を説明したもので、次のフィールドが含まれます。

フィールド

説明

データタイプ

raw

未加工の(デコードされていない)ヘッダー値

文字列

decoded

デコードされたヘッダー値

文字列

無効になったメタメソッド:

__toString - この関数は、HeaderFieldValueの内容(decodedフィールドの値)を文字列として返します。

__concat - この関数は、HeaderFieldValuedecodedフィールドの値)と別の文字列を連結します。

テーブルMimeBody

このテーブルは、メッセージ部分の本体について説明します。以下のフィールドを含みます。

フィールド

説明

データタイプ

raw

メッセージ部分の未加工の(デコードされていない)本文

文字列

decoded

メッセージ部分本体のデコードされた値(Content-Transfer-EncodingヘッダーとContent-Typeヘッダーの値に応じたもの)

文字列

text

Content-Typeヘッダーのcharsetパラメータに従って、UTF-8でデコードされたメッセージ部分本体の値。

"Content-Type: text/*"を持つ部分またはContent-Typeが空の部分にのみ存在します。それ以外の場合は、nilになります。

文字列

scan_report

脅威のスキャンについてのレポート

テーブルScanReport

url

部分テキストに見つかったURL。Urlテーブルの配列。

textフィールドがない場合(nil)、フィールドは空になります。

Urlテーブルの配列

search

正規表現(PCRE)を使用してこの本文内のテキストを検索する関数。正規表現(文字列)を受け取ります。引用符内で文字列を使用する場合は、スラッシュ文字をエスケープする必要があります。

ブール値を返します。

true - 本文がテキストであり、一致が見つかった場合

false - それ以外の場合。

機能

md5

メールメッセージ本文のMD5ハッシュ。

文字列

sha1

メールメッセージ本文のSHA1ハッシュ。

文字列

sha256

メールメッセージ本文のSHA256ハッシュ。

文字列

無効になったメタメソッドなし

テーブルScanReport

脅威のスキャンについてのレポートを説明するテーブル。以下のフィールドを含みます。

フィールド

説明

データタイプ

object

スキャンされたオブジェクトの名前

文字列

archive

スキャンされたオブジェクトがコンテナの場合は、コンテナに関する情報。オブジェクトがコンテナではない場合、nil

Archiveテーブル

virus

検出された脅威のリスト

Virusテーブルの配列

error

エラーが発生した場合は、スキャンエラーの文字列が含まれます。発生していない場合は、nilになります。使用可能な値:

"path_not_absolute" - 指定されたパスは絶対パスではありません。

"file_not_found" - ファイルが見つかりませんでした。

"file_not_regular" - ファイルは通常のファイルではありません。

"file_not_block_device" - ブロックデバイスではありません。

"name_too_long" - 名前が長すぎます。

"no_access" - アクセスが拒否されました。

"read_error" - 読み取りエラーが発生しました。

"write_error" - 書き込みエラー。

"file_too_large" - ファイルが大きすぎます。

"file_busy" - ファイルは使用中です。

"unpacking_error" - アンパックエラー。

"password_protected" - アーカイブはパスワードで保護されています。

"arch_crc_error" - CRCアーカイブエラー。

"arch_invalid_header" - 無効なアーカイブヘッダー。

"arch_no_memory" - アーカイブを解凍するための十分なメモリがありません。

"arch_incomplete" - 不完全なアーカイブ。

"can_not_be_cured" - ファイルを修復できません。

"packer_level_limit" - パックされたオブジェクトのネストレベルの上限を超えました。

"archive_level_limit" - アーカイブのネストレベルの上限を超えました。

"mail_level_limit" - メールファイルのネストレベルの上限を超えました。

"container_level_limit" - コンテナのネストレベルの上限を超えました。

"compression_limit" - 圧縮率の上限を超えました。

"report_size_limit" - レポートサイズの上限を超えました。

"scan_timeout" - スキャンタイムアウトの上限を超えました。

"engine_crash" - スキャンエンジンの障害。

"engine_hangup" - スキャンエンジンのハングアップ。

"engine_error" - スキャンエンジンエラー。

"no_license" - アクティブなライセンスが見つかりません。

"multiscan_too_late" - マルチスキャンエラー。

"curing_limit_reached" - 修復試行の上限を超えました。

"non_supported_disk" - ディスクタイプはサポートされていません。

"unexpected_error" - 予期しないエラー。

文字列

item

スキャンされたオブジェクトがコンテナ(アーカイブ、添付されたMIMEオブジェクトなど)の場合、添付されたアイテムのスキャンについて報告します。

ScanReport テーブルの配列

無効になったメタメソッドなし

Archiveテーブル

アーカイブを説明するテーブル。以下のフィールドを含みます。

フィールド

説明

データタイプ

type

アーカイブの種類:

"archive" - アーカイブ。

"mail"- メールファイル。

"container" - その他のコンテナ。

文字列

name

アーカイブ名。例:ZIP

文字列

無効になったメタメソッドなし

DKIMテーブル

メッセージ内のすべてのDKIM署名を説明するテーブル。以下のフィールドを含みます。

フィールド

説明

データタイプ

signature

メッセージに存在するDKIM署名のリスト

DKIMSignatureテーブルの配列

has_valid_signature

1つのオプションの引数filterを受け取って返す関数

DKIMSignatureテーブルの形式で"pass"に等しいスキャン結果を持つ最初に検出されたDKIM署名。

検証で署名が検出されなかった場合、nilが表示されます。

filter引数として、次のものを使用できます。

DKIMSignatureFilterテーブル。

DKIMSignature引数のみを受け取り、ブール値を返す任意の叙述関数

otrue - 引数が条件を満たしている場合。

ofalse - それ以外の場合。

機能

無効になったメタメソッドなし

DKIMSignatureテーブル

メッセージのDKIM署名を説明するテーブル。以下のフィールドを含みます。

フィールド

説明

データタイプ

auid

DKIM署名の"i"タグから取得されるエージェントまたはユーザー識別子(AUID)の値は、デフォルト値を考慮します

文字列

data

DKIM署名の"b"タグから抽出された署名のテキスト(base64)値

文字列

result

DKIM署名検証結果

DKIMResultテーブル

sdid

DKIM署名の"d"タグから取得した署名ドメイン識別子(SDID)の値

文字列

selector

DKIM署名の"s"タグから取得したセレクター

文字列

無効になったメタメソッドなし

DKIMResultテーブル

メッセージのDKIM署名を説明するテーブル。以下のフィールドを含みます。

フィールド

説明

データタイプ

type

テキスト形式のDKIM署名検証結果。次の値が含まれる場合があります。

passは、署名の検証が成功したことを示します。

failは、署名の検証が失敗したことを示します(つまり、メール本文のハッシュと一致しないか、署名を検証できませんでした)。

neutralは、DKIM署名の構文エラーです。

temperrorは、ドメインキーの取得に失敗したことを示します(DNSエラー)。

permerrorは、他のタイプのエラー(署名形式、キー形式、キーと署名の間の不整合など)を示します。

文字列

comment

スキャン結果のコメント(Authentication-Resultsのコメントとして使用できます)

文字列

key_size

スキャン中に使用されるキーサイズはnilか、キーまたはスキャン結果の取得に失敗した場合はneutral

番号

無効になったメタメソッドなし

テーブルDKIMSignatureFilter

DKIMメッセージ署名のフィルターを説明するテーブル(上記のFileFilterテーブルと同様)。次のフィールドが含まれます(すべてのフィールドはオプションです)。

フィールド

説明

データタイプ

domain

DKIM署名のSDIDフィールドのドメインが対応するドメイン

文字列または文字列のテーブル

domain_not

DKIM署名のSDIDフィールドのドメインが対応すべきではないドメイン

文字列または文字列のテーブル

無効になったメタメソッドなし

フィルターフィールドが指定されていない場合(つまり、nil値が含まれている場合)、このメッセージのDKIM署名はすべてフィルターと一致します。複数のフィルターフィールドが指定されている場合、条件は接続詞(論理積)によって結合されます。フィルターフィールドタイプがテーブル(配列)の場合、フィルターされたオブジェクトは、テーブル(配列)要素の少なくとも1つと一致する必要があります。

利用可能な補助モジュール

LuaのプログラムスペースでDr.Web for UNIX Mail Serversとやり取りするために、次の特定のモジュールをインポートできます。

モジュール名

機能

Luaプログラムを起動したDr.Web for UNIX Mail ServersコンポーネントとLuaプロシージャの非同期実行の手段のログに、Luaプログラムからのメッセージを記録する機能を提供するモジュール

Dr.Web LookupDモジュールを呼び出して外部ソースからデータを要求するためのツールを提供するモジュール

ホストのアドレスがDNSxLブラックリストにあるかどうかを確認するためのツールを提供するモジュール

文字列と正規表現を一致させるためのインターフェースを提供するモジュール

外部アプリケーション(プロセス)を実行するためのインターフェースを提供するモジュール

Dr.Web MailD設定パラメータ値を持つテーブルを提供するモジュール。

drwebモジュールの内容

1.機能

このモジュールは次の機能を提供します。

1.1.LuaプログラムからのメッセージをDr.Web for UNIX Mail Serversコンポーネントログに保存するための機能:

log(<level>, <message>)<message>文字列をDr.Web for UNIX Mail Serversログ<level>レベル(必要なレベルは、「debug」「info」「notice」「warning」「error」を使用して定義します)で書き込みます。

debug(<message>)<message>文字列をDr.Web for UNIX Mail ServersログDEBUGレベルで書き込みます。

info(<message>)<message>文字列をDr.Web for UNIX Mail ServersログINFOレベルで書き込みます。

notice(<message>)<message>文字列をDr.Web for UNIX Mail ServersログNOTICEレベルで書き込みます。

warning(<message>)<message>文字列をDr.Web for UNIX Mail ServersログWARNINGレベルで書き込みます。

error(<message>)<message>文字列をDr.Web for UNIX Mail ServersログERRORレベルで書き込みます。

1.2.Luaプロシジャの同期管理のための機能:

sleep(<sec.>)はこのLuaプロシジャインスタンスの実行を指定された秒数で一時停止します。

async(<Lua function>[, <argument list>])は、指定された関数の非同期開始を起動し、指定された引数リストに転送します。async関数呼び出しはすぐに完了し、戻り値(Futureテーブル)を使用すると、<Lua function>の結果を取得できます(まだ実行が完了していない場合は、完了するまで待機している可能性があります)。

1.3.IPアドレスをIpAddressテーブルとして表示するための機能:

ip(<address>は、IpAddressテーブルの形式で<address>文字列として送信される、IPアドレスを指定します。IPv4またはIPv6アドレスのいずれかを使用できます。

1.4.テキストファイルから外部データをアップロードするには:

load_set(<file path>は、指定されたテキストファイルのコンテンツからtrue値を含むテーブルを生成し、ファイルから読み取られた文字列はキーとして使用されます。空の文字列と空白文字のみで構成される文字列は無視され、テーブルには含まれません。

load_array(<file path>は、指定されたテキストファイルのコンテンツから文字列の配列を生成します。空の文字列と空白文字のみで構成される文字列は無視され、配列には含まれません。

2.テーブル

2.1.Futureテーブルは、async関数を使用して関数を実行した後の保留中の結果を表します。テーブルには以下のフィールドを含みます。

フィールド

説明

データタイプ

wait

async関数を使用して開始した関数の結果を返す関数。関数がまだ実行を完了していない場合は、完了を待って結果を返します。waitが呼び出される前に関数が完了した場合、結果はすぐに返されます。開始された関数が失敗した場合、wait呼び出しは同じエラーを生成します。

機能

無効になったメタメソッドなし

2.2 IpAddressテーブルはIPアドレスを表します。以下のフィールドを含みます。

フィールド

説明

データタイプ

belongs

指定したサブネット(IPアドレス範囲)のIpAddressテーブルに保存されているIPアドレスの所属を確認する関数。

<IP address>または<IP address>/<mask>のような文字列を唯一の引数として受け取ります。ここで、<IP address>はホストアドレスまたはネットワークアドレス(「127.0.0.1」など)、<mask>はサブネットワークマスク(「255.0.0.0」などのIPアドレスとして、または「8」などの数値形式で指定できます)です。

ブール値を返します。

trueは、アドレスが指定されたアドレスの少なくとも1つと等しいか、指定されたサブネット(IPアドレスの範囲)の少なくとも1つに属していることを示します。

false - それ以外の場合。

機能

無効になったメタメソッド:

__tostringは、文字列内のIpAddressを変更する関数です。例:「127.0.0.1」(IPv4)または「::1」(IPv6)

__concatは、IpAddressを文字列に結合する関数です。

__eqは、2つのIpAddressが等しいことを確認するための関数です。

__bandは、マスクを適用するための関数(例:dw.ip('192.168.1.2') & dw.ip('255.255.254.0'))です

3.例

3.1.非同期的に開始される手順によって生成される、ログへの出力メッセージ:

local dw = require "drweb"

-- この関数は2秒間待機して文字列を返します。
-- 引数として受信されます
function out_msg(message)
 dw.sleep(2)
 return message
end

-- 「メイン」関数
function intercept(ctx)
 -- NOTICEレベルでDr.Web for UNIX Mail Serversログに文字列を出力します
 dw.notice("Intercept function started.")

 -- out_msg関数の2つのコピーを非同期で起動します
 local f1 = dw.async(out_msg, "Hello,")
 local f2 = dw.async(out_msg, " world!")

 -- out_msg関数のコピーの完了を待機中です
 -- out_msgとその結果をログに出力します
 -- Dr.Web for UNIX Mail Servers ログにデバッグレベルで出力します
 dw.log("debug", f1.wait() .. f2.wait())
end

3.2.指定されたスケジュールに従って定期的に開始する手順を作成する:

local dw = require "drweb"

-- Futureテーブルをfutureグローバル変数で保存し、
-- Luaのガベージコレクターにより
-- 計画されたタスクが破壊されないようにします
future = dw.async(function()
  while true do
     -- 毎日、次のメッセージがログに表示されます
     dw.sleep(60 * 60 * 24)
     dw.notice("A brand new day began")
  end
end)

3.3.文字列のIPアドレスを変更する:

local dw = require "drweb"

local ipv4 = dw.ip("127.0.0.1")
local ipv6 = dw.ip("::1")
local mapped = dw.ip("::ffff:127.0.0.1")

drweb.lookupモジュールの内容

1.機能

このモジュールは次の機能を提供します。

lookup(<request>, <parameters>)はDr.Web LookupDモジュールから利用できる外部ストレージからデータを要求します。<request>パラメータは、Dr.Web LookupD設定内のセクション(文字列<type>@<tag>)に対応している必要があります。<parameters>引数はオプションで、リクエストを生成するために使用される置換を表します。これらのパラメータはテーブルとして設定されます。このテーブルのキーと値は文字列でなければなりません。この関数は、リクエストの結果である文字列の配列を返します。

check(<checked string><request><parameters>は、Dr.Web LookupDモジュールを介して利用できる外部リポジトリで<checked string>が見つかった場合にtrueを返します。引数<request>および<parameters>は、lookup関数の引数と同じです(上記を参照)。<checked string>引数は、文字列または__tostringメタメソッドを持つテーブル(つまり、文字列にフォーマットできる)であると想定されます。

2.例

データソースLookupD.LDAP.usersから取得されたユーザーリストのログへの出力:

local dw = require "drweb"
local dwl = require "drweb.lookup"

-- 「メイン」関数
function intercept(ctx)
 -- NOTICEレベルでDr.Web for UNIX Mail Serversログに文字列を出力します
 dw.notice("Intercept function started.")

 -- リクエスト結果をDr.Web for UNIX Mail Serversログへ出力
 -- 'ldap@users’データソースへ
 for _, s in ipairs(dwl.lookup("ldap@users", {user="username"})) do
   dw.notice("Result for request to 'ldap@users': " .. s)
 end

end

drweb.dnsxlモジュールの内容

1.機能

このモジュールは次の機能を提供します。

ip(<IP address>, <DNSxL server>)は指定されたIPアドレス<IP address>に対応するDNSxLサーバー<DNSxL server>からAタイプのDNSレコードをリクエストします。

検査されているIPアドレスがDNSxLサーバーのリストに登録されている場合、結果は架空のIPアドレスのリストになります。さらに、返された架空のIPアドレスのそれぞれに、検査済みの<IP address>がこのサーバーのリストに表示されている理由が含まれていることがあります(通常、理由タイプは返された架空のIPアドレスの最後のオクテット値によって決まります)。DNSxLサーバーにIPアドレス<IP address>に対応するAタイプのDNSレコードが含まれていない場合、関数はnilを返します。

url(<URL>, <SURBL server>)<URL>ドメイン部分に対応する<SURBL server>サーバーにからAタイプのDNSレコードをリクエストします(HTTPリダイレクトは処理されません)。

<URL>から取得された、検査されているドメインがSURBLサーバーのサーバーリストに登録されている場合、結果は架空のIPアドレスのリストになります。さらに、返された架空のIPアドレスのそれぞれに、検査済みのドメインがこのサーバーのリストに表示されている理由が含まれていることがあります(通常、理由タイプは返された架空のIPアドレスの最後のオクテット値によって決まります)。SURBLサーバーに<URL>からのドメインに対応するAタイプのDNSレコードが含まれていない場合、この関数はnilを返します。

関数の引数は、文字列または文字列にキャストされるオブジェクトです(たとえば、<IP address>としてはIpAddressテーブルを使用でき、<URL>としてはUrlテーブルを使用できます)。IPアドレスは、IpAddressテーブルの配列として返されます。

2.テーブル

2.1.IpAddressテーブルはIPアドレスを表します。テーブルについてはで説明しています。

3.例

DNSxLサーバーによるIPアドレスのスキャン結果のログへの出力:

local dw = require "drweb"
local dwxl = require "drweb.dnsxl"

-- 「メイン」関数
function intercept(ctx)
 -- NOTICEレベルでDr.Web for UNIX Mail Serversログに文字列を出力します
 dw.notice("Intercept function started.")

 -- スキャン結果をDr.Web for UNIX Mail Serversログに出力します
 -- IPアドレス10.20.30.40はDNSxLサーバーのブラックリストに登録されています
 -- dnsxl.server1.org
 local records = dwxl.ip("10.20.30.40", "dnsxl.server1.org")
 if records then
  for _, ip in ipairs(records) do
    dw.notice("DNSxL A record for 10.20.30.40: " .. ip)
  end
 end

end

drweb.regexモジュールの内容

1.機能

このモジュールは次の機能を提供します。

search(<template>, <text>[, <flags>]) - <text>文字列に<template>正規表現と一致するサブストリングが含まれている場合はtrueを返します。オプションの<flags>パラメータ(整数)は、関数の動作に影響を与える一連のフラグであり、論理和でつなげられます。

match(<template>, <text>[, <flags>]) - <template>正規表現がそのサブストリングだけでなく<text>ストリング全体と一致しなければならない点を除いてsearchと同じです。

2.利用可能なフラグ

ignore_caseはテキストの大文字と小文字を区別しません。

3.例

local rx = require "drweb.regex"

rx.search("te.?t", "some TexT") -- false
rx.search("te.?t", "some TexT", rx.ignore_case) -- true

rx.match("some.+", "some TexT") -- true

drweb.subprocessモジュールの内容

1.機能

このモジュールは次の機能を提供します。

run(<parameters >)指定されたプロセス(アプリケーション)を同期モードで実行します(この関数はプロセスが終了した後にのみコントロールを戻します)。<parameters>引数は、ファイルへの実行可能ファイルのパス、起動時にアプリケーションに渡されるすべての引数(配列argv)、アプリケーションの入出力ストリーム(stdinstdoutstderr)に関連付けられたオプションのパラメータを含むテーブルです。オプションのパラメータは、アプリケーションの(現在の)作業ディレクトリと環境変数を指定します。

関数の結果は、終了後のプロセス操作の結果(プロセスが終了した終了コードまたはシグナル番号)を含むテーブルになります。さらに、プロセス実行パラメータのテーブルで指定すると、返されるテーブルに、stdoutおよびstderr出力ストリームから読み込まれるデータを含むフィールドを含めることができます。

2.テーブル

2.1.入力実行パラメータのテーブル。以下のフィールドを含みます。

フィールド

説明

データタイプ

(名前なし)

ファイルパスとアプリケーション実行引数(配列argv)。

必須フィールド。フィールドはコマンドライン引数の数だけ繰り返され、最初の値はargv[0]、つまり実行可能パスに対応します。

文字列

stdin

実行後にアプリケーション(プロセス)が入力ストリーム(stdin)から受け取るテキスト。オプションのフィールド(指定しない場合、stdinは何も受け取りません)。

文字列

stdout

返されるテーブルのフィールドの名前。このフィールドは、プロセスがstdoutストリームに出力するテキストを受け取ります。オプションのフィールド(指定しない場合、出力はstdoutに保存されません)。

文字列

stderr

返されるテーブルのフィールドの名前。このフィールドは、プロセスがstderrストリームに出力するテキストを受け取ります。オプションのフィールド(指定しない場合、出力はstderrに保存されません)。

文字列

env

プロセス環境に送信される環境変数をフィールドに持つテーブル。環境変数は、"<variable name>"="<value>"のペアで指定されます。オプションのフィールド(指定しない場合、環境変数は設定されません)。

テーブル

workdir

実行中のプロセスの作業(現在の)ディレクトリ。オプションのフィールド(指定しない場合、作業ディレクトリは設定されません)。

文字列

2.2.実行結果のテーブル(run関数の戻り値)以下のフィールドを含みます。

フィールド

説明

データタイプ

exit_status

プロセスが正常に終了したときの返りコード。発生していない場合は、nilになります。

番号

exit_signal

プロセスが終了したときのシグナル番号発生していない場合は、nilになります。

番号

(入力パラメータテーブルのstdoutフィールドの値)

終了したプロセスのstdoutストリームから読み込まれたデータ。フィールドは、入力パラメータのテーブルでstdoutフィールドが指定されている場合にのみ使用可能です。

文字列

(入力パラメータテーブルのstderrフィールドの値)

終了したプロセスのstderrストリームから読み込まれたデータ。フィールドは、入力パラメータのテーブルでstderrフィールドが指定されている場合にのみ使用可能です。

文字列

3.例

3.1.catユーティリティを引数なしで実行し、'some data'テキストをその入力ストリームに渡し、コマンド出力の結果を返されるテーブルのstdout_fieldフィールドに渡すには、次のように指定します。

local sp = require 'drweb.subprocess'

local cat_result = sp.run({
   '/bin/cat',
   stdin = 'some data',
   stdout = 'stdout_field',
})

cat_result変数に格納される結果のテーブルには、以下のフィールドが含まれます。

フィールド

exit_status

0

exit_signal

nil

stdout_field

'some data'

3.2.env | grep TESTVAR 1>&2のパラメータを指定してshコマンド(インタプリタによりコマンド実行)を実行し、VALUE値を持つTESTVAR変数を環境に追加し、コマンドstderrの出力結果を返されるテーブルのstderr_fieldフィールドに渡すには、次のように指定します。

local sp = require 'drweb.subprocess'

local env_result = sp.run({
   '/bin/sh', '-c', 'env | grep TESTVAR 1>&2',
   env = { TESTVAR = 'VALUE' },
   stderr = 'stderr_field'
})

env_result変数に格納される結果のテーブルには、以下のフィールドが含まれます。

フィールド

exit_status

0

exit_signal

nil

stderr_field

'TESTVAR=VALUE\n'

3.3.pwdコマンドを実行して作業ディレクトリをシステムのルートディレクトリに設定し、コマンドstdoutの出力結果を返されるテーブルのstdout_fieldフィールドに渡すには、次のように指定します。

local sp = require 'drweb.subprocess'

local pwd_result = sp.run{
   '/bin/pwd',
   workdir = '/',
   stdout = 'stdout_field'
}

pwd_result変数に格納される結果のテーブルには、以下のフィールドが含まれます。

フィールド

exit_status

0

exit_signal

nil

stdout_field

'/\n'

3.4.killコマンドをbashで実行し、SIGKILLシグナルをインタプリタに渡すには、次のように指定します。

local sp = require 'drweb.subprocess'

local kill_result = sp.run{'/bin/bash', '-c', 'kill -9 $$'}

kill_result変数に格納される結果のテーブルには、以下のフィールドが含まれます。

フィールド

exit_status

nil

exit_signal

9

プロセスを非同期的に実行するには、async関数呼び出し内でrun関数を実行します(上を参照)。

drweb.configモジュールの内容

1.機能

このモジュールには関数はありません。

2.利用可能なテーブル

このモジュールでは、次のフィールドでMailDConfigテーブルを提供します。

フィールド

説明

データタイプ

version

Dr.Web MailDバージョン。

文字列

無効になったメタメソッドなし

MailDConfigテーブルは、モジュールによってmaildフィールドとして提供されます。

3.例

以下はDr.Web MailDコンポーネントの現在のバージョンをログに記録する出力です。

local dw  = require 'drweb'
local cfg = require 'drweb.config'

-- 「メイン」関数
function milter_hook(ctx)

 -- NOTICEレベルでDr.Web for UNIX Mail Serversログに文字列を出力します
 dw.notice(cfg.maild.version)

end