Как пересылать электронные письма на несколько SMTP-серверов

Как пересылать электронные письма на несколько SMTP-серверов
Как пересылать электронные письма на несколько SMTP-серверов

Настройка двойной переадресации SMTP

Управление несколькими серверами электронной почты с одинаковыми учетными записями пользователей может оказаться сложной задачей. В этом сценарии, когда электронное письмо отправляется пользователю на сайте example.com, оно должно быть получено серверами james и winmail, гарантируя, что содержимое электронного письма останется неизменным.

Обычные решения, такие как настройка нескольких записей MX в DNS, не оправдывают ожиданий, поскольку они могут одновременно направлять example.com только на один сервер. Использование Postfix для пересылки электронной почты на оба сервера без локального хранилища оказалось сложным, что привело к появлению таких решений, как создание сценариев с помощью smtplib, которые могут быть ненадежными. Давайте рассмотрим лучшие альтернативы.

Команда Описание
import smtplib Импортирует библиотеку Simple Mail Transfer Protocol для отправки электронных писем с помощью Python.
import sys Импортирует модуль параметров и функций, специфичный для системы, используемый для получения аргументов командной строки.
from email.mime.text import MIMEText Импортирует класс MIMEText для создания текстовых сообщений электронной почты.
from email.mime.multipart import MIMEMultipart Импортирует класс MIMEMultipart для создания составных сообщений электронной почты.
msg.attach(MIMEText('text', 'plain')) Прикрепляет текстовое тело к сообщению электронной почты.
with smtplib.SMTP(server) as smtp Открывает соединение с SMTP-сервером и обеспечивает его правильное закрытие после отправки электронного письма.
postmap /etc/postfix/transport Генерирует двоичную базу данных из файла карты транспорта, используемую Postfix для маршрутизации почты.
systemctl reload postfix Перезагружает конфигурацию Postfix без остановки службы, применяя все внесенные изменения.

Понимание интеграции Postfix и Python

Предоставленные сценарии предназначены для пересылки электронной почты на два SMTP-сервера, гарантируя, что оба сервера получат одну и ту же электронную почту. Скрипт Python, multi_forward.py, использует import smtplib библиотека для обработки отправки электронной почты. Он импортирует sys чтобы получить аргументы командной строки, такие как отправитель и получатель. Скрипт создает электронное письмо, используя from email.mime.text import MIMEText и from email.mime.multipart import MIMEMultipart чтобы создать и прикрепить тело электронного письма. Затем он перебирает список SMTP-серверов и отправляет электронное письмо каждому из них, используя with smtplib.SMTP(server) as smtp.

На стороне Postfix конфигурация включает в себя изменение /etc/postfix/master.cf файл для определения пользовательской транспортной службы, multi_forward, который использует скрипт Python. /etc/postfix/main.cf файл обновляется и включает в себя транспортную карту, указанную в /etc/postfix/transport. Команда postmap /etc/postfix/transport создает двоичную базу данных из транспортной карты и systemctl reload postfix применяет изменения конфигурации без остановки службы Postfix. Эта настройка гарантирует, что любое электронное письмо, отправленное на example.com, будет обработано сценарием Python и перенаправлено на оба SMTP-сервера.

Пересылка электронной почты на несколько SMTP-серверов с помощью Python

Использование Python для управления пересылкой SMTP

# multi_forward.py
import smtplib
import sys
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
 
sender = sys.argv[1]
recipient = sys.argv[2]
 
def forward_email(sender, recipient):
    msg = MIMEMultipart()
    msg['From'] = sender
    msg['To'] = recipient
    msg['Subject'] = 'Forwarded email'
    msg.attach(MIMEText('This is the body of the email', 'plain'))
 
    # SMTP servers
    smtp_servers = ['james.example.com', 'winmail.example.com']
 
    for server in smtp_servers:
        with smtplib.SMTP(server) as smtp:
            smtp.sendmail(sender, recipient, msg.as_string())
 
if __name__ == '__main__':
    forward_email(sender, recipient)

Настройка Postfix для использования сценария Python

Конфигурация Postfix для индивидуальной пересылки почты

# /etc/postfix/master.cf
multi_forward unix - n n - - pipe
  flags=Rhu user=nobody argv=/usr/local/bin/multi_forward.py ${sender} ${recipient}
 
# /etc/postfix/main.cf
transport_maps = hash:/etc/postfix/transport
 
# /etc/postfix/transport
example.com multi_forward:
 
# Update transport map
postmap /etc/postfix/transport
 
# Reload Postfix
systemctl reload postfix

Расширение функциональности Postfix с помощью дополнительных инструментов

Другой подход к пересылке электронной почты на несколько SMTP-серверов включает использование дополнительных инструментов и конфигураций Postfix. Одним из таких инструментов является Postfix. sender_dependent_relayhost_maps, что позволяет указать разные хосты ретрансляции на основе адреса отправителя. Хотя эта функция обычно используется для маршрутизации исходящей почты через разные узлы ретрансляции, ее можно адаптировать для нашего случая использования с помощью некоторой творческой настройки. Например, сочетание virtual_alias_maps и recipient_bcc_maps может использоваться для дублирования электронных писем и пересылки их на разные адреса, которые затем перенаправляются на соответствующие серверы.

Кроме того, интеграция Postfix с почтовым фильтром, например Amavisd-new или Procmail может обеспечить большую гибкость в обработке и маршрутизации электронной почты. Эти фильтры могут обрабатывать электронные письма, когда они проходят через Postfix, позволяя настраиваемым сценариям или правилам дублировать и пересылать сообщения по нескольким адресатам. Хотя эта настройка может быть более сложной, чем использование простого сценария Python, она может обеспечить большую надежность и масштабируемость для сред, требующих надежных возможностей обработки электронной почты.

Общие вопросы и решения для пересылки электронной почты Postfix

  1. Как настроить несколько записей MX в DNS?
  2. К сожалению, записи DNS MX поддерживают сопоставление только с одним сервером для каждого уровня приоритета, поэтому этот подход не будет работать для одновременной пересылки на несколько серверов.
  3. Какова цель transport_maps директива?
  4. transport_maps Директива в Postfix определяет сопоставление адресов электронной почты или доменов определенным методам и местам транспортировки почты.
  5. Может sender_dependent_relayhost_maps помочь в этом случае?
  6. Да, sender_dependent_relayhost_maps может маршрутизировать электронные письма через разные хосты ретрансляции на основе адреса отправителя, но его необходимо творчески адаптировать для пересылки на несколько серверов.
  7. Как virtual_alias_maps работать в Постфиксе?
  8. virtual_alias_maps Директива позволяет Postfix сопоставлять адреса электронной почты с другими адресами, позволяя пересылать и перенаправлять электронные письма.
  9. Какова роль recipient_bcc_maps?
  10. recipient_bcc_maps Директива позволяет Postfix автоматически добавлять получателей BCC во входящие электронные письма, что полезно для дублирования сообщений.
  11. Могу ли я использовать Amavisd-new с Postfix для пересылки электронной почты?
  12. Да, Amavisd-new может быть интегрирован с Postfix для применения пользовательских правил фильтрации и пересылки, обеспечивая больший контроль над обработкой электронной почты.
  13. Что master.cf файл используется для?
  14. master.cf Файл в Postfix определяет процессы доставки почты и их конфигурации, включая специальные транспортные службы.
  15. Как мне обновить transport map база данных?
  16. Использовать postmap /etc/postfix/transport команда для создания или обновления двоичной базы данных из файла карты транспорта.
  17. Почему важна перезагрузка Postfix?
  18. Перезагрузка Postfix с помощью systemctl reload postfix применяет изменения конфигурации без остановки службы, обеспечивая бесперебойную работу.
  19. Что smtplib используется в Python?
  20. smtplib библиотека Python используется для отправки электронной почты через SMTP, позволяя сценариям программно обрабатывать передачу электронной почты.

Заключительные мысли о переадресации двух серверов

Настройка Postfix для пересылки сообщений на несколько SMTP-серверов включает в себя комбинацию пользовательских сценариев и подробных настроек Postfix. Хотя первоначальные попытки использования DNS или простых сценариев Python могут не обеспечить требуемой надежности, интеграция расширенных функций и инструментов Postfix, таких как Amavisd-new или Procmail, может обеспечить более надежное решение. Тщательно настроив транспортные карты, карты виртуальных псевдонимов и карты BCC получателей, вы можете обеспечить плавную и эффективную пересылку сообщений как на серверы james, так и на серверы winmail. Такой подход гарантирует, что ваша инфраструктура электронной почты останется устойчивой и сможет справиться со сложными требованиями маршрутизации.