Вопрос или проблема
Я использую Postfix для управления электронной почтой на определенной машине.
Некоторые письма в конечном итоге пересылаются на определенный адрес, скажем [email protected]
, и почтовый сервер, обслуживающий этот адрес, ТРЕБУЕТ, чтобы поле конверта (MAIL FROM) имело определенное значение, скажем, MAIL FROM [email protected]
.
Как я могу заставить Postfix заменить то, что он изначально хотел поместить в это поле, на то, что я хочу?
Решения, которые не работают:
smtp_generic_maps
устанавливает адрес отправителя на основе оригинального адреса отправителя, sender_canonical_maps
делает то же самое, но на другом этапе обработки почты.
Мне нужно изменить адрес отправителя на основе адреса получателя. Заголовки должны быть нетронутыми.
Нельзя делать предположений о источнике сообщения. Он может быть локальным или внешним.
Вы спрашиваете о маскировке. Но дело в том, что, в основном, все стандартные решения для любых современных MTA предназначены для маскировки адреса отправителя на основе домена отправителя, а не получателя. То, что вы запрашиваете, все еще возможно, но для этого нет стандартной функциональности. Тем не менее, вы могли бы написать свой собственный miler, который делает именно это, но это может оказаться слишком сложным.
На самом деле, я полагаю, что ваш принимающий MTA не требует, чтобы адрес конверта имел какое-либо отношение к адресу получателя, скорее всего, он использует какую-то общую антиспам-технику, которой вы могли бы легко следовать.
Ответ или решение
Для решения задачи по изменению envelope sender (MAIL FROM) в зависимости от поля envelope TO в Postfix, вам нужно будет использовать несколько подходов, поскольку стандартные механизмы Postfix, такие как smtp_generic_maps
и sender_canonical_maps
, не позволят установить значение отправителя на основе значения получателя. Вот подробное объяснение и шаги, которые помогут вам реализовать эту настройку:
Решение через использования Milter
-
Milter (Mail Filter): Ваша задача требует создания фильтра, который будет менять поле отправителя в зависимости от получателя. Наиболее подходящий способ достижения этого в Postfix — использование Milter.
-
Установка Milter: В зависимости от вашего языка программирования и предпочтений, вы можете использовать такие библиотеки, как
libmilter
на C, или же написать Milter на Python с помощьюpyMilter
. -
Пример реализации на Python:
Убедитесь, что у вас установлен
pyMilter
:pip install pymilter
Создайте файл
milter.py
с следующим содержимым:from milter import Milter class SenderMilter(Milter): def envrcpt(self, email): # Здесь вы проверяете адрес получателя if email == "[email protected]": # Устанавливаете envelope sender self.setmlock(1) self.change_envelope_sender("[email protected]") return Milter.CONTINUE def main(): Milter.factory(SenderMilter).start() if __name__ == "__main__": main()
-
Запуск Milter: Скомпилируйте и запустите ваш Milter. Не забудьте указать его адрес и порт в конфигурации Postfix.
Конфигурация Postfix
-
Настройка Postfix для работы с Milter: Добавьте следующие строки в файл конфигурации
main.cf
вашего Postfix:smtpd_milters = unix:/var/run/milter.sock non_smtpd_milters = $smtpd_milters
Убедитесь, что путь к вашему Milter совпадает с указанным вами при его запуске.
-
Перезапуск Postfix: После внесения всех изменений необходимо перезапустить Postfix, чтобы он применил обновления:
sudo systemctl restart postfix
Проверка
После того, как вы настроили ваш Milter и Postfix, протестируйте, отправляя электронные письма на адреса, которые вы указали в вашей программе Milter. Убедитесь, что envelope sender устанавливается корректно в зависимости от получателя.
Вывод
Хотя стандартные настройки Postfix не позволяют менять MAIL FROM в зависимости от TO, использование Milter предоставляет гибкое решение для реализации такой функциональности. Это позволяет вам поддерживать целостность заголовков и в то же время соответствовать требованиям по оформлению envelope address.