2016-08-26 53 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');