在执行 Postfix before-queue (perl) milter 期间获取 Queue ID
Get Queue ID during execution of Postfix before-queue (perl) milter
问题:
正在尝试为 Postfix 编写一个 milter 以将电子邮件中某些 headers 的存在与出站中继主机的目标 IP 地址和 TCP 端口联系起来。
按照 Postfix milter guide 看来我需要实现一个 before-queue
milter。
使用 Sendmail::Milter perl 模块这样做。
我可以在 headers、信封等中找到我需要的一切,除了将中继到的最终目的地(IP 和端口)。显然 对于 before-queue
milter 来说是有意义的。
从哪里获取中继信息?
查看我们的 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
似乎在日志中将它们联系在一起。我被引导相信这被称为 'Queue ID' 或 'Job ID' 取决于你在说什么。
如果我能从 milter 中得到那个 XXXXXXXXXX
Queue/Job ID,那么将日志绑定在一起就没问题了。
试过了吗?
看来我可以通过从回调中调用 $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 指南包含如下代码以获取 'Queue 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
(以及 SYMNAME
可能是什么)或其他一些上下文方法获得该工作 ID。
有什么想法吗?
使用下面得到queue_id。
my $queue_id = $ctx->getsymval('i');
问题:
正在尝试为 Postfix 编写一个 milter 以将电子邮件中某些 headers 的存在与出站中继主机的目标 IP 地址和 TCP 端口联系起来。
按照 Postfix milter guide 看来我需要实现一个 before-queue
milter。
使用 Sendmail::Milter perl 模块这样做。
我可以在 headers、信封等中找到我需要的一切,除了将中继到的最终目的地(IP 和端口)。显然 对于 before-queue
milter 来说是有意义的。
从哪里获取中继信息?
查看我们的 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
似乎在日志中将它们联系在一起。我被引导相信这被称为 'Queue ID' 或 'Job ID' 取决于你在说什么。
如果我能从 milter 中得到那个 XXXXXXXXXX
Queue/Job ID,那么将日志绑定在一起就没问题了。
试过了吗?
看来我可以通过从回调中调用 $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 指南包含如下代码以获取 'Queue 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
(以及 SYMNAME
可能是什么)或其他一些上下文方法获得该工作 ID。
有什么想法吗?
使用下面得到queue_id。
my $queue_id = $ctx->getsymval('i');