Thiết lập chuyển tiếp SMTP kép
Việc quản lý nhiều máy chủ email với tài khoản người dùng giống hệt nhau có thể là một thách thức. Trong trường hợp này, khi một email được gửi đến người dùng tại example.com, cả máy chủ james và winmail đều phải nhận email đó, đảm bảo nội dung email không thay đổi.
Các giải pháp phổ biến, chẳng hạn như định cấu hình nhiều bản ghi MX trong DNS, không hiệu quả vì chúng chỉ có thể chuyển hướng example.com đến một máy chủ tại một thời điểm. Việc sử dụng Postfix để chuyển tiếp email đến cả hai máy chủ mà không có bộ nhớ cục bộ đã được chứng minh là phức tạp, dẫn đến các giải pháp như tạo tập lệnh bằng smtplib, có thể không đáng tin cậy. Hãy khám phá những lựa chọn thay thế tốt hơn.
Yêu cầu | Sự miêu tả |
---|---|
import smtplib | Nhập thư viện Giao thức truyền thư đơn giản để gửi email bằng Python. |
import sys | Nhập mô-đun chức năng và tham số dành riêng cho hệ thống, được sử dụng để nhận các đối số dòng lệnh. |
from email.mime.text import MIMEText | Nhập lớp MIMEText để tạo email dựa trên văn bản. |
from email.mime.multipart import MIMEMultipart | Nhập lớp MIMEMultipart để tạo thư email nhiều phần. |
msg.attach(MIMEText('text', 'plain')) | Đính kèm nội dung văn bản đơn giản vào email. |
with smtplib.SMTP(server) as smtp | Mở kết nối đến máy chủ SMTP và đảm bảo kết nối được đóng đúng cách sau khi gửi email. |
postmap /etc/postfix/transport | Tạo cơ sở dữ liệu nhị phân từ tệp bản đồ truyền tải, được Postfix sử dụng để định tuyến thư. |
systemctl reload postfix | Tải lại cấu hình Postfix mà không dừng dịch vụ, áp dụng bất kỳ thay đổi nào được thực hiện. |
Tìm hiểu về tích hợp Postfix và Python
Các tập lệnh được cung cấp được thiết kế để chuyển tiếp email đến hai máy chủ SMTP, đảm bảo cả hai máy chủ đều nhận được cùng một email. Tập lệnh Python, multi_forward.py, sử dụng import smtplib thư viện để xử lý việc gửi email. Nó nhập khẩu sys để nhận các đối số dòng lệnh, chẳng hạn như người gửi và người nhận. Kịch bản xây dựng email bằng cách sử dụng from email.mime.text import MIMEText Và from email.mime.multipart import MIMEMultipart để tạo và đính kèm nội dung email. Sau đó, nó lặp lại danh sách các máy chủ SMTP và gửi email đến từng máy chủ bằng cách sử dụng with smtplib.SMTP(server) as smtp.
Về phía Postfix, cấu hình liên quan đến việc sửa đổi /etc/postfix/master.cf tập tin để xác định dịch vụ vận chuyển tùy chỉnh, multi_forward, sử dụng tập lệnh Python. Các số 8 tập tin được cập nhật để bao gồm một bản đồ vận chuyển, được chỉ định trong /etc/postfix/transport. Lệnh postmap /etc/postfix/transport tạo cơ sở dữ liệu nhị phân từ bản đồ vận chuyển và systemctl reload postfix áp dụng các thay đổi cấu hình mà không dừng dịch vụ Postfix. Thiết lập này đảm bảo rằng mọi email được gửi tới example.com đều được tập lệnh Python xử lý và chuyển tiếp đến cả hai máy chủ SMTP.
Chuyển tiếp email đến nhiều máy chủ SMTP bằng Python
Sử dụng Python để xử lý chuyển tiếp 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)
Định cấu hình Postfix để sử dụng tập lệnh Python
Cấu hình postfix để chuyển tiếp thư tùy chỉnh
# /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
Nâng cao chức năng Postfix với các công cụ bổ sung
Một cách tiếp cận khác để chuyển tiếp email đến nhiều máy chủ SMTP liên quan đến việc sử dụng các công cụ và cấu hình Postfix bổ sung. Một công cụ như vậy là Postfix sender_dependent_relayhost_maps, cho phép chỉ định các máy chủ chuyển tiếp khác nhau dựa trên địa chỉ của người gửi. Mặc dù tính năng này thường được sử dụng để định tuyến thư đi qua các máy chủ chuyển tiếp khác nhau nhưng tính năng này có thể được điều chỉnh cho phù hợp với trường hợp sử dụng của chúng tôi bằng một số cấu hình sáng tạo. Ví dụ, sự kết hợp của virtual_alias_maps Và recipient_bcc_maps có thể được sử dụng để sao chép email và chuyển tiếp chúng đến các địa chỉ khác nhau, sau đó được chuyển đến các máy chủ tương ứng.
Ngoài ra, việc tích hợp Postfix với bộ lọc thư như Amavisd-new hoặc Procmail có thể mang lại sự linh hoạt hơn trong việc xử lý và định tuyến email. Các bộ lọc này có thể xử lý email khi chúng đi qua Postfix, cho phép các tập lệnh hoặc quy tắc tùy chỉnh sao chép và chuyển tiếp thư đến nhiều đích. Mặc dù thiết lập này có thể phức tạp hơn việc sử dụng tập lệnh Python đơn giản nhưng nó có thể mang lại độ tin cậy và khả năng mở rộng cao hơn cho các môi trường yêu cầu khả năng xử lý email mạnh mẽ.
Các câu hỏi và giải pháp phổ biến để chuyển tiếp email Postfix
- Làm cách nào tôi có thể định cấu hình nhiều bản ghi MX trong DNS?
- Thật không may, bản ghi DNS MX chỉ hỗ trợ ánh xạ tới một máy chủ cho mỗi mức độ ưu tiên, vì vậy phương pháp này sẽ không hiệu quả để chuyển tiếp đến nhiều máy chủ cùng một lúc.
- Mục đích của việc này là gì transport_maps chỉ thị?
- Các transport_maps chỉ thị trong Postfix chỉ định việc ánh xạ các địa chỉ email hoặc tên miền tới các điểm đến và phương thức vận chuyển thư cụ thể.
- Có thể sender_dependent_relayhost_maps giúp đỡ trong tình huống này?
- Đúng, sender_dependent_relayhost_maps có thể định tuyến email qua các máy chủ chuyển tiếp khác nhau dựa trên địa chỉ của người gửi, nhưng nó cần được điều chỉnh một cách sáng tạo để chuyển tiếp đến nhiều máy chủ.
- Làm thế nào virtual_alias_maps làm việc trong Postfix?
- Các virtual_alias_maps chỉ thị cho phép Postfix ánh xạ địa chỉ email tới các địa chỉ khác, cho phép chuyển tiếp và chuyển hướng email.
- Vai trò của là gì recipient_bcc_maps?
- Các recipient_bcc_maps chỉ thị cho phép Postfix tự động thêm người nhận BCC vào các email đến, hữu ích cho việc sao chép thư.
- Tôi có thể sử dụng không? Amavisd-new với Postfix để chuyển tiếp email?
- Đúng, Amavisd-new có thể được tích hợp với Postfix để áp dụng các quy tắc lọc và chuyển tiếp tùy chỉnh, cung cấp nhiều quyền kiểm soát hơn đối với việc xử lý email.
- cái gì là master.cf tập tin được sử dụng cho?
- Các master.cf tệp trong Postfix xác định quy trình gửi thư và cấu hình của chúng, bao gồm các dịch vụ truyền tải tùy chỉnh.
- Làm cách nào để cập nhật transport map cơ sở dữ liệu?
- Sử dụng postmap /etc/postfix/transport lệnh tạo hoặc cập nhật cơ sở dữ liệu nhị phân từ tệp bản đồ truyền tải.
- Tại sao việc tải lại Postfix lại quan trọng?
- Tải lại Postfix với systemctl reload postfix áp dụng các thay đổi cấu hình mà không dừng dịch vụ, đảm bảo hoạt động trơn tru.
- Là gì smtplib được sử dụng trong Python?
- Các smtplib thư viện trong Python được sử dụng để gửi email qua SMTP, cho phép các tập lệnh xử lý việc truyền email theo chương trình.
Suy nghĩ cuối cùng về chuyển tiếp máy chủ kép
Thiết lập Postfix để chuyển tiếp thư đến nhiều máy chủ SMTP bao gồm sự kết hợp của các tập lệnh tùy chỉnh và cấu hình Postfix chi tiết. Mặc dù những nỗ lực ban đầu sử dụng DNS hoặc các tập lệnh Python đơn giản có thể không mang lại độ tin cậy cần thiết, nhưng việc tích hợp các tính năng và công cụ Postfix nâng cao như Amavisd-new hoặc Procmail có thể cung cấp giải pháp mạnh mẽ hơn. Bằng cách định cấu hình cẩn thận bản đồ truyền tải, bản đồ bí danh ảo và bản đồ BCC người nhận, bạn có thể đảm bảo chuyển tiếp thư liền mạch và hiệu quả tới cả máy chủ james và winmail. Cách tiếp cận này đảm bảo rằng cơ sở hạ tầng email của bạn vẫn linh hoạt và có khả năng xử lý các yêu cầu định tuyến phức tạp.