여러 SMTP 서버로 이메일을 전달하는 방법

여러 SMTP 서버로 이메일을 전달하는 방법
여러 SMTP 서버로 이메일을 전달하는 방법

이중 SMTP 전달 설정

동일한 사용자 계정으로 여러 이메일 서버를 관리하는 것은 어려울 수 있습니다. 이 시나리오에서는 이메일이 example.com의 사용자에게 전송되면 james와 winmail 서버 모두에서 이를 수신해야 이메일 내용이 변경되지 않도록 해야 합니다.

DNS에서 여러 MX 레코드를 구성하는 것과 같은 일반적인 솔루션은 example.com을 한 번에 하나의 서버에만 연결할 수 있기 때문에 부족합니다. 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 통합 이해

제공된 스크립트는 이메일을 두 개의 SMTP 서버로 전달하여 두 서버가 동일한 이메일을 받도록 설계되었습니다. 파이썬 스크립트, multi_forward.py, 을 사용합니다 import smtplib 이메일 전송을 처리하는 라이브러리. 수입한다 sys 보낸 사람 및 받는 사람과 같은 명령줄 인수를 가져옵니다. 스크립트는 다음을 사용하여 이메일을 구성합니다. 그리고 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 도구 및 구성을 사용하는 것입니다. 그러한 도구 중 하나가 Postfix입니다. sender_dependent_relayhost_maps, 보낸 사람의 주소에 따라 다른 릴레이 호스트를 지정할 수 있습니다. 이 기능은 일반적으로 다양한 릴레이 호스트를 통해 보내는 메일을 라우팅하는 데 사용되지만 일부 창의적인 구성을 통해 사용 사례에 맞게 조정할 수 있습니다. 예를 들어 다음의 조합은 virtual_alias_maps 그리고 recipient_bcc_maps 이메일을 복제하여 다른 주소로 전달한 다음 해당 서버로 라우팅하는 데 사용할 수 있습니다.

또한 Postfix를 다음과 같은 메일 필터와 통합합니다. Amavisd-new 또는 Procmail 이메일 처리 및 라우팅에 더 많은 유연성을 제공할 수 있습니다. 이러한 필터는 이메일이 Postfix를 통과할 때 처리할 수 있으므로 사용자 정의 스크립트나 규칙을 사용하여 메시지를 여러 대상으로 복제하고 전달할 수 있습니다. 이 설정은 간단한 Python 스크립트를 사용하는 것보다 더 복잡할 수 있지만 강력한 이메일 처리 기능이 필요한 환경에 더 큰 안정성과 확장성을 제공할 수 있습니다.

Postfix 이메일 전달에 대한 일반적인 질문 및 해결 방법

  1. DNS에서 여러 MX 레코드를 구성하려면 어떻게 해야 합니까?
  2. 안타깝게도 DNS MX 레코드는 우선 순위 수준당 하나의 서버에 대한 매핑만 지원하므로 이 접근 방식은 여러 서버에 동시에 전달하는 데는 작동하지 않습니다.
  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 스크립트를 사용한 초기 시도는 필요한 안정성을 제공하지 못할 수 있지만 Amavisd-new 또는 Procmail과 같은 고급 Postfix 기능 및 도구를 통합하면 보다 강력한 솔루션을 제공할 수 있습니다. 전송 맵, 가상 별칭 맵 및 수신자 BCC 맵을 주의 깊게 구성하면 james 및 winmail 서버 모두에 원활하고 효율적인 메시지 전달을 보장할 수 있습니다. 이 접근 방식을 통해 이메일 인프라는 탄력성을 유지하고 복잡한 라우팅 요구 사항을 처리할 수 있습니다.