Проблема:Получить идентификатор очереди во время выполнения 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
может быть) или через какой-либо другой метод контекста.
Любые идеи?
'my $ queue_id = $ ctx-> getsymval ('i');' должен предоставить вам идентификатор очереди. –
Работает для 'Sendmail :: Milter' из коробки, спасибо. Заметили, что мы случайно использовали 'Sendmail :: PMilter', который необходимо было запланировать. Если вы хотите написать ответ, я соглашусь с ним. –
Я вижу. Я добавил ответ. –