問題:
メール内の特定のヘッダーの存在を送信先の IP アドレスと送信リレー ホストの TCP ポートに結び付ける Postfix の milter を作成しようとしています。
Postfix のmilter ガイドに従うと、milter を実装する必要があるようですbefore-queue
。
これには、 Sendmail::Milter perl モジュールを使用します。
中継先の最終的な宛先 (IP とポート) を除いて、ヘッダー、エンベロープなどで必要なすべてを取得できます。明らかに、それはmilterにとって理にかなっています。before-queue
リレー情報はどこで入手できますか?
Postfix ログを見ると、次の形式のメッセージが表示されます。
TIMESTAMP HOST postfix/qmgr[pid]: XXXXXXXXXX: log message here
TIMESTAMP HOST postfix/smtp[pid]: XXXXXXXXXX: log message here
TIMESTAMP HOST postfix/smtpd[pid]: XXXXXXXXXX: log message here
ログ行のいくつかには、私が探しているリレー情報があります。
<TIMESTAMP> <HOST> postfix/smtp[pid]: XXXXXXXXXX: to=EMAIL, relay=HOST[ADDR]:PORT, ...
それはまさに私が探しているものですADDR
。PORT
これXXXXXXXXXX
は、ログですべてを結び付けているようです。これは、話している内容に応じて「キュー ID」または「ジョブ ID」と呼ばれていると思われます。
milter からその Queue/Job ID を取得できればXXXXXXXXXX
、ログを結び付けても問題ありません。
試しましたか?
コールバックから呼び出すことで、ベンダー固有の情報を取得できるよう$ctx->getsymval SYMNAME
です。
Additional information is passed in to the vendor filter routines using symbols.
Symbols correspond closely to sendmail macros. The symbols defined depend on the
context. SYMNAME is the name of the symbol to access.
This function returns the value of the symbol name SYMNAME.
milter ガイドには、「キュー ID」を取得するための次のようなコードがあります。
/* Determine the job ID for logging. */
if (dfc->mctx_jobid == 0 || strcmp(dfc->mctx_jobid, JOBIDUNKNOWN) == 0) {
char *jobid = smfi_getsymval(ctx, "i");
if (jobid != 0)
dfc->mctx_jobid = jobid;
}
getsymval
そのジョブIDを(およびそのSYMNAME
可能性がある)または他のコンテキストメソッドを介して取得できるかどうかはわかりません。
何か案は?