Як пересилати електронні листи на кілька серверів 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. The /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. The transport_maps Директива в Postfix визначає зіставлення адрес електронної пошти або доменів із певними методами транспортування пошти та призначеннями.
  5. може sender_dependent_relayhost_maps допомогти в цьому сценарії?
  6. так, sender_dependent_relayhost_maps може маршрутизувати електронні листи через різні хости ретрансляції на основі адреси відправника, але його потрібно творчо адаптувати для пересилання на кілька серверів.
  7. Як virtual_alias_maps працювати в Postfix?
  8. The virtual_alias_maps Директива дозволяє Postfix зіставляти адреси електронної пошти з іншими адресами, уможливлюючи пересилання та перенаправлення електронних листів.
  9. Яка роль recipient_bcc_maps?
  10. The recipient_bcc_maps директива дозволяє Postfix автоматично додавати прихованих копій одержувачів до вхідних електронних листів, що корисно для дублювання повідомлень.
  11. Чи можу я використовувати Amavisd-new з Postfix для пересилання електронної пошти?
  12. так, Amavisd-new можна інтегрувати з Postfix для застосування спеціальних правил фільтрації та пересилання, забезпечуючи більше контролю над обробкою електронної пошти.
  13. Що master.cf файл використовується для?
  14. The master.cf файл у Postfix визначає процеси доставки пошти та їх конфігурації, включаючи спеціальні транспортні служби.
  15. Як оновити transport map база даних?
  16. Використовувати postmap /etc/postfix/transport команда для створення або оновлення бінарної бази даних із файлу транспортної карти.
  17. Чому перезавантаження Postfix є важливим?
  18. Перезавантаження Postfix за допомогою systemctl reload postfix застосовує зміни конфігурації без зупинки служби, забезпечуючи безперебійну роботу.
  19. Що smtplib використовується в Python?
  20. The smtplib Бібліотека в Python використовується для надсилання електронних листів через SMTP, дозволяючи сценаріям обробляти передачу електронних листів програмним шляхом.

Останні думки щодо переадресації подвійного сервера

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