2016-08-26 3 views
2

Проблема:Получить идентификатор очереди во время выполнения Postfix до-очереди (Perl) Milter

Попытка написать Milter для Postfix, чтобы связать наличие определенных заголовков в письме к IP-адресу назначения и TCP-порт узла исходящего ретранслятора.

После Postfix milter guide кажется, что мне нужно реализовать before-queue milter.

Выполнение этого действия с использованием модуля perl Sendmail::Milter.

Я могу получить все, что мне нужно, в заголовках, конвертах и ​​т. Д., За исключением конечного адресата (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 - это то, что, кажется, связывает все это вместе в журналах. Я убежден, что это называется «Идентификатор очереди» или «Идентификатор задания» в зависимости от того, о чем вы говорите.

Если бы я мог получить от этого XXXXXXXXXX Идентификатор очереди/Идентификатора от milter, тогда было бы без проблем связывать журналы вместе.

Пробовал?

Похоже, что я мог бы получить определенную информацию о конкретном поставщике, вызвав $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; 
} 

Я просто не могу понять, если я могу получить в этом JobID через getsymval (и что SYMNAME может быть) или через какой-либо другой метод контекста.

Любые идеи?

+0

'my $ queue_id = $ ctx-> getsymval ('i');' должен предоставить вам идентификатор очереди. –

+0

Работает для 'Sendmail :: Milter' из коробки, спасибо. Заметили, что мы случайно использовали 'Sendmail :: PMilter', который необходимо было запланировать. Если вы хотите написать ответ, я соглашусь с ним. –

+0

Я вижу. Я добавил ответ. –

ответ

2

Используйте ниже, чтобы получить queue_id.

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