Postfix неверный синтаксис параметра уведомления

Пожалуйста, терпите меня, потому что я не опытный администратор

У меня есть почтовый сервер linux, который работал пару лет, и теперь неожиданно определенный пользователь не может отправлять электронные письма. Они немедленно получают ответ от "Системного администратора", говорящий

501 5.5.4 error bad notify parameter syntax

Это происходит только для этого пользователя и только на его компьютере. Он хорошо работает в Thunderbird, но не в Outlook 2013. Другие пользователи могут использовать Outlook 2013 без проблем.

Я смотрел журнал, и это то, что он говорит, когда этот пользователь пытается отправить электронную почту

replacing command "RCPT TO: <myemail@gmail.com> NOTIFY=SUCCESS,FAILURE,DELAY" with "RCPT TO: <myemail@gmail.com> NOTIFY=SUCCESS,FAILURE,DELAY NOTIFY=NEVER"

Я проверил все правила Outlook, которые могут включать добавление заголовков, отключение сканера вирусов электронной почты, повторное добавление учетной записи и т. Д.

Я читал, и кажется, что NOTIFY = НИКОГДА не может быть смешан с любыми другими командами NOTIFY

У меня есть настройка smtpd_command_filter, как это

/^(RCPT\s+TO:<.*>.*)\s+NOTIFY=\S+(.*)/ $1 NOTIFY=NEVER$2
/^(RCPT\s+TO:.*)/                    $1 NOTIFY=NEVER

Я не очень хорошо разбираюсь в регулярных выражениях, но, полагаю, он неправильно анализирует исходную команду и добавляет NOTIFY=NEVER в конец вместо ее замены.

Тем временем я прокомментировал это, что отправляет уведомление "Ваше сообщение было успешно доставлено" отправителю. Я заставил это замолчать, добавив

smtpd_discard_ehlo_keywords = silent-discard, dsn

к main.cf

С моими новыми настройками все в порядке или мне нужно исправить исходную проблему, которая, как я предполагаю, содержится в регулярном выражении? Есть идеи?

1 ответ

Решение

Я читал, и кажется, что NOTIFY= НИКОГДА не может быть смешан с любыми другими командами NOTIFY

Для справки, это определено в RFC 1891, раздел 5.1.

Команда RCPT, выданная клиентом, может содержать необязательное ключевое слово esmtp "NOTIFY", чтобы указать условия, при которых SMTP-сервер должен генерировать уведомления о доставке для этого получателя. Если используется ключевое слово NOTIFY esmtp, оно ДОЛЖНО иметь соответствующее значение esmtp, отформатированное в соответствии со следующими правилами с использованием ABNF в RFC 822:

notify-esmtp-value = "NEVER" / 1#notify-list-element

notify-list-element = "SUCCESS" / "FAILURE" / "DELAY"

Заметки:

а. Множество элементов notify-list, разделенных запятыми, МОГУТ появляться в параметре NOTIFY; однако ключевое слово НИКОГДА НЕ ДОЛЖНО появляться само по себе.

б. Любое из ключевых слов НИКОГДА, УСПЕХ, ОТКАЗ или ЗАДЕРЖКА может быть написано в любой комбинации букв верхнего и нижнего регистра.


Это ваше регулярное выражение (похоже, скопировано с этой страницы)

/^(RCPT\s+TO:<.*>.*)\s+NOTIFY=\S+(.*)/ $1 NOTIFY=NEVER$2
/^(RCPT\s+TO:.*)/                    $1 NOTIFY=NEVER

Это командная строка RCPT из Outlook 2013

RCPT TO: <myemail@gmail.com> NOTIFY=SUCCESS,FAILURE,DELAY

Выше строка будет соответствовать второй строке. Зачем? Потому что между TO: а также <myemail@gmail.com>Там есть пробел. Ваша первая строка регулярного выражения не содержит пробелов между TO: и '<`.

Для пробела между ':' и '<', вот что говорит RFC 5321

Поскольку это был распространенный источник ошибок, стоит отметить, что пробелы не допускаются ни с одной стороны двоеточия после FROM в команде MAIL или TO в команде RCPT. Синтаксис в точности как указано выше.

Итак, вот почему проблема появляется локально. Похоже, внешний вид все еще добавляет пространство после RCPT TO: Таким образом, нарушение RFC спец.

Regex Solution:

Измените первую строку регулярного выражения, чтобы оно стало таким

/^(RCPT\s+TO:\s*<.*>.*)\s+NOTIFY=\S+(.*)/ $1 NOTIFY=NEVER$2

добавление \s* будет соответствовать строке с нулевым или большим количеством пробелов после RCPT TO:

Чтобы узнать, как работает регулярное выражение, посетите эту страницу.

Другие вопросы по тегам