複数の SMTP サーバーに電子メールを転送する方法

複数の SMTP サーバーに電子メールを転送する方法
複数の SMTP サーバーに電子メールを転送する方法

デュアル SMTP 転送の設定

同一のユーザー アカウントを使用して複数の電子メール サーバーを管理するのは困難な場合があります。このシナリオでは、電子メールが example.com のユーザーに送信されると、james サーバーと winmail サーバーの両方で受信され、電子メールの内容が変更されないことが保証される必要があります。

DNS で複数の MX レコードを構成するなどの一般的なソリューションでは、example.com を一度に 1 つのサーバーにしか送信できないため、不十分です。 Postfix を使用してローカル ストレージを使用せずに両方のサーバーに電子メールを転送する方法は複雑であることが判明し、smtplib を使用したスクリプトのようなソリューションが必要になりますが、これは信頼性が低い可能性があります。より良い代替案を検討してみましょう。

指示 説明
import smtplib Python を使用して電子メールを送信するための Simple Mail Transfer Protocol ライブラリをインポートします。
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 の統合について理解する

提供されたスクリプトは、電子メールを 2 つの 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 サーバーに転送されます。

Python を使用して複数の SMTP サーバーにメールを転送する

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)

Python スクリプトを使用するように Postfix を構成する

カスタムメール転送のための 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 ツールと構成を使用することが含まれます。そのようなツールの 1 つが Postfix です。 sender_dependent_relayhost_mapsを使用すると、送信者のアドレスに基づいてさまざまなリレー ホストを指定できます。この機能は通常、送信メールを異なるリレー ホスト経由でルーティングするために使用されますが、創造的な構成を使用してユースケースに適応させることができます。たとえば、次の組み合わせ virtual_alias_maps そして recipient_bcc_maps 電子メールを複製して別のアドレスに転送し、それぞれのサーバーにルーティングするために使用できます。

さらに、Postfix を次のようなメールフィルターと統合します。 Amavisd-new または Procmail 電子メールの処理とルーティングをより柔軟に行うことができます。これらのフィルターは電子メールが Postfix を通過するときに処理できるため、カスタム スクリプトまたはルールでメッセージを複製し、複数の宛先に転送できます。この設定は単純な Python スクリプトを使用するよりも複雑になる可能性がありますが、堅牢な電子メール処理機能を必要とする環境に優れた信頼性と拡張性を提供できます。

Postfix メール転送に関するよくある質問と解決策

  1. DNS で複数の MX レコードを構成するにはどうすればよいですか?
  2. 残念ながら、DNS MX レコードは優先レベルごとに 1 つのサーバーへのマッピングのみをサポートしているため、このアプローチは複数のサーバーに同時に転送する場合には機能しません。
  3. の目的は何ですか transport_maps 指令?
  4. transport_maps Postfix のディレクティブは、電子メール アドレスまたはドメインを特定のメール転送方法および宛先にマッピングすることを指定します。
  5. できる sender_dependent_relayhost_maps このシナリオに役立ちますか?
  6. はい、 sender_dependent_relayhost_maps は、送信者のアドレスに基づいてさまざまなリレー ホストを介して電子メールをルーティングできますが、複数のサーバーに転送するには創造的に適応させる必要があります。
  7. どうやって virtual_alias_maps Postfixで働いていますか?
  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 経由で電子メールを送信するために使用され、スクリプトで電子メール送信をプログラム的に処理できるようになります。

デュアルサーバー転送に関する最終的な考え

メッセージを複数の SMTP サーバーに転送するように Postfix を設定するには、カスタム スクリプトと詳細な Postfix 設定の組み合わせが必要になります。 DNS や単純な Python スクリプトを使用した最初の試みでは必要な信頼性が得られない可能性がありますが、高度な Postfix 機能と Amavisd-new や Procmail などのツールを統合すると、より堅牢なソリューションが提供されます。トランスポート マップ、仮想エイリアス マップ、および受信者 BCC マップを慎重に構成することで、james サーバーと winmail サーバーの両方にシームレスかつ効率的にメッセージを転送できます。このアプローチにより、電子メール インフラストラクチャの回復力が維持され、複雑なルーティング要件を処理できることが保証されます。