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:
Чтобы узнать, как работает регулярное выражение, посетите эту страницу.