Обычно входящая почта падает в 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-адреса, которые уже настроены в телефонах. Это важно для них
Что делать?
На вскидку сразу пришли варианты:
- поднять собственный imap-сервер и сделать
info@domain.tldобщим для нужного количества пользователей - установить у каждого пользователя thunderbird и настроить работу с его личной учетной записью gmail и domain.tld. Не исключает #1
- заменить некоторые gmail-адреса в алиасе на адреса альтернативных ESP
- придумать как менять
Message-IDв процессе переадресации - ничего не делать, поскольку входящие на
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-пользователей без проблем
Все

Системный администратор с 2000 года
Участник Freelancehunt, Хабр Q&A
Кейсы