2

问题:

尝试为 Postfix 编写一个 milter,以将电子邮件中某些标头的存在与出站中继主机的目标 IP 地址和 TCP 端口联系起来。

按照 Postfix milter 指南,我似乎需要实现一个before-queuemilter。

使用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, ...

那正是我正在寻找的ADDRPORTXXXXXXXXXX似乎在日志中将它们联系在一起。我被引导相信这被称为“队列 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。

有任何想法吗?

4

1 回答 1

2

使用下面获取 queue_id。

my $queue_id = $ctx->getsymval('i'); 
于 2016-08-29T05:01:29.027 回答