2016-08-26 50 views
2

问题:获取队列ID

尝试写雄鱼为后缀,以配合特定的报头的存在下,在电子邮件发送到目的地IP地址和TCP端口的出站中继主机。

继Postfix milter guide看来我需要实现一个before-queue milter。

否则使用Sendmail::Milter Perl模块,。

我能在我需要的一切在头,信封等除外最终目的地(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, ... 

ADDRPORT正是我要找的。 XXXXXXXXXX似乎将它们全部结合在一起。我被认为取决于你在说什么,这被称为'队列ID'或'工作ID'。

如果我能在那XXXXXXXXXX队列/作业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. 

的雄鱼指南有像下列代码来获得在“队列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可能),或通过其他上下文方法。

任何想法?下面

+0

'my $ queue_id = $ ctx-> getsymval('i');'应该为您提供队列ID。 –

+0

开箱即用的'Sendmail :: Milter',谢谢。注意到我们不小心使用了需要修补的'Sendmail :: PMilter'。如果你想写出答案,我会接受它。 –

+0

我明白了。我已经添加了答案。 –

回答

2

用得到queue_id。

my $queue_id = $ctx->getsymval('i');