Настройка двойной переадресации 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
- Как настроить несколько записей MX в DNS?
- К сожалению, записи DNS MX поддерживают сопоставление только с одним сервером для каждого уровня приоритета, поэтому этот подход не будет работать для одновременной пересылки на несколько серверов.
- Какова цель transport_maps директива?
- transport_maps Директива в Postfix определяет сопоставление адресов электронной почты или доменов определенным методам и местам транспортировки почты.
- Может sender_dependent_relayhost_maps помочь в этом случае?
- Да, sender_dependent_relayhost_maps может маршрутизировать электронные письма через разные хосты ретрансляции на основе адреса отправителя, но его необходимо творчески адаптировать для пересылки на несколько серверов.
- Как virtual_alias_maps работать в Постфиксе?
- virtual_alias_maps Директива позволяет Postfix сопоставлять адреса электронной почты с другими адресами, позволяя пересылать и перенаправлять электронные письма.
- Какова роль recipient_bcc_maps?
- recipient_bcc_maps Директива позволяет Postfix автоматически добавлять получателей BCC во входящие электронные письма, что полезно для дублирования сообщений.
- Могу ли я использовать Amavisd-new с Postfix для пересылки электронной почты?
- Да, Amavisd-new может быть интегрирован с Postfix для применения пользовательских правил фильтрации и пересылки, обеспечивая больший контроль над обработкой электронной почты.
- Что master.cf файл используется для?
- master.cf Файл в Postfix определяет процессы доставки почты и их конфигурации, включая специальные транспортные службы.
- Как мне обновить transport map база данных?
- Использовать postmap /etc/postfix/transport команда для создания или обновления двоичной базы данных из файла карты транспорта.
- Почему важна перезагрузка Postfix?
- Перезагрузка Postfix с помощью systemctl reload postfix применяет изменения конфигурации без остановки службы, обеспечивая бесперебойную работу.
- Что smtplib используется в Python?
- smtplib библиотека Python используется для отправки электронной почты через SMTP, позволяя сценариям программно обрабатывать передачу электронной почты.
Заключительные мысли о переадресации двух серверов
Настройка Postfix для пересылки сообщений на несколько SMTP-серверов включает в себя комбинацию пользовательских сценариев и подробных настроек Postfix. Хотя первоначальные попытки использования DNS или простых сценариев Python могут не обеспечить требуемой надежности, интеграция расширенных функций и инструментов Postfix, таких как Amavisd-new или Procmail, может обеспечить более надежное решение. Тщательно настроив транспортные карты, карты виртуальных псевдонимов и карты BCC получателей, вы можете обеспечить плавную и эффективную пересылку сообщений как на серверы james, так и на серверы winmail. Такой подход гарантирует, что ваша инфраструктура электронной почты останется устойчивой и сможет справиться со сложными требованиями маршрутизации.