问题:
尝试为 Postfix 编写一个 milter,以将电子邮件中某些标头的存在与出站中继主机的目标 IP 地址和 TCP 端口联系起来。
按照 Postfix milter 指南,我似乎需要实现一个before-queue
milter。
使用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”,具体取决于您在说什么。
如果我可以XXXXXXXXXX
从 milter 中获得该队列/作业 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 指南有如下代码来获取“队列 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
可能是什么)或通过其他一些上下文方法获得该 jobid。
有任何想法吗?