Как изменить Message-ID исходящей почты


Обычно входящая почта падает в Maildir или Mailbox пользователя. Далее пользователь взаимодействует с почтовым сообщением из клиентской програмы при помощи протокола imap или pop3. Таковых большинство. Но есть электронные адреса общего назначения (напр. info@domain.tld, billing@domain.tld и т.д.), получать почту с которых должны несколько человек. Такие адреса называют алиасы. Например, в /etc/postfix/alias есть запись

info:   u1[@]gmail.com,u2[@]gmail.com,...,u7[@]gmail.com

это значит, что все входящие письма на info@domain.tld будут пересланы на почтовые ящики пользователей u1, u2, u3, u4, u5, u6, u7 у которых в качестве ESP gmail.com. Локального хранилища почты для info@domain.tld на сервере нет

Однажды возникла необходимость добавить еще одного получателя u8.  После чего в логах появилось предупреждение

Gmail has detected this message exceeded its quota for sending 421-4.7.28 messages with the same Message-ID. To best protect our users, the 421-4.7.28 message has been temporarily rejected.

И не гарантий, что не появятся заинтересованые пользователи u9, u10 и т.д. желающие получать почту с info@domain.tld. Адреса u1-u10 здесь указаны для примера. На самом деле пользователи хотят получать почту на свои личные gmail-адреса, которые уже настроены в телефонах. Это важно для них

Что делать?

На вскидку сразу пришли варианты:

  1. поднять собственный imap-сервер и сделать info@domain.tld общим для нужного количества пользователей
  2. установить у каждого пользователя thunderbird и настроить работу с его личной учетной записью gmail и domain.tld. Не исключает #1
  3. заменить некоторые gmail-адреса в алиасе на адреса альтернативных ESP
  4. придумать как менять Message-ID в процессе переадресации
  5. ничего не делать, поскольку входящие на info@domain.tld сообщения а) не срочные, б) информационные. А доставка все равно произойдет, но попозже

Тут каждый вариант имеет право на жизнь, но в нашем случае рассмотрим вариант #4 как самый быстрый

Как изменить Message-ID исходящей почты

И для этого установим procmail

emerge procmail

В качестве MTA у нас postfix, поэтому в mail.cf можем написать следующее

mailbox_command = /usr/bin/procmail -a "$EXTENSION" DEFAULT=/home/$USER/Maildir/

Заведем в системе пользователя info. В качестве shell укажем /sbin/nologin

groupadd info
useradd -m -G info info
chsh info

Почти готово. В домашней папке пользователя info создадим файл .procmailrc в котором будут инструкции обработки входящей почты

SHELL=/bin/sh
PATH=/bin:/usr/bin:/usr/sbin

# отлупы приходящие на info отправляем в /dev/null
:0
* ^FROM_DAEMON
/dev/null

# переадресация заинтересованым пользователям
:0
* !^FROM_DAEMON
{
  :0c
  | sleep $(shuf -i 5-15 -n 1) && formail -I "Message-ID: <$(uuidgen)@domain.tld>" | sendmail -oi u1[@]gmail.com

  :0c
  | sleep $(shuf -i 5-15 -n 1) && formail -I "Message-ID: <$(uuidgen)@domain.tld>" | sendmail -oi u2[@]gmail.com

  ...

  :0
  | sleep $(shuf -i 5-15 -n 1) && formail -I "Message-ID: <$(uuidgen)@domain.tld>" | sendmail -oi u9[@]gmail.com
}

где:

sleep $(shuf -i 5-15 -n 1) — включаем задержку от 5 до 15 секунд перед выполнением команды formail
uuidgen — тулза генерирует уникальный UUID для каждого сообщения, что делает Message-ID гарантированно уникальным
formail -I "Message-ID: <...>" — заменяет текущий Message-ID на новый
sendmail -oi — отправляет письмо на конкретный адрес
c в правиле :0c — означает, что procmail будет создавать копии письма для каждого правила, сохраняя оригинал для обработки следующим правилом

Проверка

В /etc/postfix/alias комментируем строку с info:, после чего не забываем выполнить

postalias /etc/postfix/alias

Высылаем тестовое сообщение на info@domain.tld и смотрим почтовый лог. Должно быть видно, что message-id у пересылаемых сообщений разные, и gmail принимает на нужное количество u-пользователей без проблем

Все

0 0 голоса
Ваша оценка поста?
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии