Функции обратного вызова

Фильтр sendmail должен реализовывать хотя бы одну функцию обратного вызова, которые регистрируются с помощью функции smfi_register.

Табл. 1. Функции обратного вызова
Флаг Описание
xxfi_connect Функция xxfi_connect вызывается один раз в начале каждого соединения SMTP. Функция возвращает значение SMFIS_CONTINUE.
xxfi_hello Функция xxfi_hello вызывается всякий раз, когда клиент отправляет команду HELO/EHLO.
xxfi_envfrom Функция xxfi_envfrom вызывается в начале сообщения.
xxfi_envrcpt Функция xxfi_envrcpt вызывается для каждого получателя.
xxfi_data Функция xxfi_data обрабатывает команду DATA.
xxfi_unknown Функция xxfi_unknown обрабатывает неизвестные команды протокола SMTP.
xxfi_header Функция xxfi_header обрабатывает заголовок сообщения.
xxfi_eoh Функция xxfi_eoh обрабатывает заголовки сообщения.
xxfi_body Функция xxfi_body обрабатывает фрагмент тела сообщения.
xxfi_eom Функция xxfi_eom обрабатывает конец сообщения.
xxfi_abort Функция xxfi_abort обрабатывает сообщения, передача которых прервана.
xxfi_close Функция xxfi_close вызывается для закрытия текущего соединения.
xxfi_negotiate Функция xxfi_negotiate вызывается в начале соединения SMTP.

Функции обратного вызова должны правильно возвращать значение. Если функция обратного вызова возвращает значение, не входящее в число заранее определенных, то возникает ошибка, и команда sendmail прерывает соединение с фильтром.

Параметр Milter позволяет различить процедуры, ориентированные на получателя, сообщение и соединение:
  • Функции обратного вызова, ориентированные на получателя, влияют на обработку сообщения для одного получателя.
  • Функции обратного вызова, ориентированные на сообщение, влияют на обработку одного сообщения.
  • Функции обратного вызова, ориентированные на соединение, действуют в течение всего соединения (в ходе которого может быть доставлено несколько сообщений различным группам получателей).
  • Функция xxfi_envrcpt ориентирована на получателя. Функции xxfi_conect, xxfi_hello и xxfi_close ориентированы на соединение. Все прочие функции обратного вызова ориентированы на сообщение.
Табл. 2. Функции обратного вызова
Флаг Описание

SMFIS_CONTINUE

Продолжить обработку для текущего соединения, сообщения или получателя.

SMFIS_REJECT

  • Для процедур, ориентированных на соединение, прервать это соединение, затем вызвать xxfi_close.
  • Для процедур, ориентированных на сообщение, (за исключением функций xxfi_eom и xxfi_abort), отклонить это сообщение.
  • Для процедур, ориентированных на получателя, отклонить сообщение для данного получателя, но продолжить обработку сообщения.

SMFIS_DISCARD

  • Для процедур, ориентированных на сообщение или получателя, принять сообщение и удалить его.
  • SMFIS_DISCARD не может возвращаться процедурами, ориентированными на соединение.

SMFIS_ACCEPT

  • Для процедур, ориентированных на соединение, принять это соединение без его дальнейшей обработки фильтром, затем вызвать xxfi_close.
  • Для процедур, ориентированных на сообщение или получателя, принять это соединение без его дальнейшей обработки фильтром.

SMFIS_TEMPFAIL

Возвратить временную ошибку, то есть соответствующая команда SMTP возвращает код ошибки 4xx.

  • Для процедур, ориентированных на сообщение, за исключением функции xxfi_envfrom, ошибка относится к сообщению.
  • Для процедур, ориентированных на соединение, ошибка относится к соединению, после этого вызывается xxfi_close.
  • Для процедур, ориентированных на получателя, ошибка относится только к данному получателю, и обработка сообщения продолжается.

SMFIS_SKIP

Пропустить дальнейшие обратные вызовы того же типа в этой транзакции. В данный момент это значение может возвращать только функция xxfi_body. Это значение можно использовать, если для параметра milter передано достаточно фрагментов тела сообщения для принятия решения. Однако возможны случаи, когда для возвращаемого значения будут вызываться функции модификации сообщений, разрешенные только из функции xxfi_eom.

Прим.: Параметр milter должен согласовать это поведение с почтовой программой (MTA). Параметр milter проверяет, доступно ли действие протокола SMFIP_SKIP. Если действие SMFIP_SKIP доступно, то параметр milter должен его потребовать.

SMFIS_NOREPLY

  • Не отправлять ответ почтовой программе (MTA). Параметр milter должен согласовать это поведение с почтовой программой (MTA). Параметр milter должен проверить, доступно ли соответствующее действие протокола SMFIP_NR_*. Если действие SMFIP_NR_* доступно, то параметр milter должен его потребовать.
  • Если действие протокола SMFIP_NR_* определено с обратным вызовом, то обратный вызов должен всегда возвращать SMFIS_NOREPLY. Любой другой код ответа несовместим с API. Если в какой-либо ситуации, например, из-за недостатка ресурсов, обратный вызов может возвратить другой код, то не следует устанавливать SMFIP_NR_*, и необходимо использовать SMFIS_CONTINUE как код а по умолчанию. Вместо этого также можно отложить сообщение об ошибке для другой функции обратного вызова, для которой не установлен код SMFIP_NR_*.