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

Python and Postfix

Настройка двойной переадресации 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, , использует библиотека для обработки отправки электронной почты. Он импортирует чтобы получить аргументы командной строки, такие как отправитель и получатель. Скрипт создает электронное письмо, используя from email.mime.text import MIMEText и чтобы создать и прикрепить тело электронного письма. Затем он перебирает список SMTP-серверов и отправляет электронное письмо каждому из них, используя .

На стороне Postfix конфигурация включает в себя изменение файл для определения пользовательской транспортной службы, , который использует скрипт Python. файл обновляется и включает в себя транспортную карту, указанную в /etc/postfix/transport. Команда создает двоичную базу данных из транспортной карты и применяет изменения конфигурации без остановки службы 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. , что позволяет указать разные хосты ретрансляции на основе адреса отправителя. Хотя эта функция обычно используется для маршрутизации исходящей почты через разные узлы ретрансляции, ее можно адаптировать для нашего случая использования с помощью некоторой творческой настройки. Например, сочетание и может использоваться для дублирования электронных писем и пересылки их на разные адреса, которые затем перенаправляются на соответствующие серверы.

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

  1. Как настроить несколько записей MX в DNS?
  2. К сожалению, записи DNS MX поддерживают сопоставление только с одним сервером для каждого уровня приоритета, поэтому этот подход не будет работать для одновременной пересылки на несколько серверов.
  3. Какова цель директива?
  4. Директива в Postfix определяет сопоставление адресов электронной почты или доменов определенным методам и местам транспортировки почты.
  5. Может помочь в этом случае?
  6. Да, может маршрутизировать электронные письма через разные хосты ретрансляции на основе адреса отправителя, но его необходимо творчески адаптировать для пересылки на несколько серверов.
  7. Как работать в Постфиксе?
  8. Директива позволяет Postfix сопоставлять адреса электронной почты с другими адресами, позволяя пересылать и перенаправлять электронные письма.
  9. Какова роль ?
  10. Директива позволяет Postfix автоматически добавлять получателей BCC во входящие электронные письма, что полезно для дублирования сообщений.
  11. Могу ли я использовать с Postfix для пересылки электронной почты?
  12. Да, может быть интегрирован с Postfix для применения пользовательских правил фильтрации и пересылки, обеспечивая больший контроль над обработкой электронной почты.
  13. Что файл используется для?
  14. Файл в Postfix определяет процессы доставки почты и их конфигурации, включая специальные транспортные службы.
  15. Как мне обновить база данных?
  16. Использовать команда для создания или обновления двоичной базы данных из файла карты транспорта.
  17. Почему важна перезагрузка Postfix?
  18. Перезагрузка Postfix с помощью применяет изменения конфигурации без остановки службы, обеспечивая бесперебойную работу.
  19. Что используется в Python?
  20. библиотека Python используется для отправки электронной почты через SMTP, позволяя сценариям программно обрабатывать передачу электронной почты.

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