Postfix: thay đổi người gửi trong tin nhắn xếp hàng


8

Sau khi cài đặt lại hoàn chỉnh, chúng tôi gặp vấn đề với cấu hình: địa chỉ người gửi bị sai và một số người nhận (máy chủ thư) đã từ chối họ.

Vì vậy, có một loạt các thư bị mắc kẹt trong hàng đợi Postfix.

Lý tưởng nhất là thay đổi địa chỉ người gửi trực tiếp trong các thư được xếp hàng, và sau đó xóa hàng đợi sẽ là tối ưu.

Tôi đã thử câu trả lời này giải quyết vấn đề này rất nhiều. Nhưng các tin nhắn dường như không thể sửa đổi dễ dàng trong phiên bản tôi có (2.11.0).

Ví dụ, không có /var/spool/mqueuethư mục, nhưng, thay vào đó,/var/spool/postfix/...

active
bounce
corrupt
defer
deferred
dev
etc
flush
hold
incoming
lib
maildrop
pid
private
public
saved
trace
usr

và các dir quan tâm là deferred. Tôi đã cố gắng sửa đổi một vài tệp ở đó thay đổi tên miền sai với tên miền chính xác (và cẩn thận để đảm bảo chỉ những tệp đó đã được thay đổi).

Nhưng sau đó, những thư đó đã được chuyển đến corrupt, có nghĩa là một thay đổi văn bản đơn giản dường như không hoạt động (được thực hiện với vi).

Bất kỳ cách nào khác để thay đổi người gửi trong thư xếp hàng?

Câu trả lời:


19

Tôi đã thử trả lời r mà giải quyết vấn đề này rất. Nhưng các tin nhắn dường như không thể sửa đổi dễ dàng trong phiên bản tôi có (2.11.0).

Chẳng hạn, không có / var / spool / mqueue dir, nhưng, thay vào đó, / var / spool / postfix / ...

Tôi muốn làm rõ hai điều.

  • Đầu tiên, câu trả lời đó đã được áp dụng cho sendmail KHÔNG postfix.
  • Thứ hai, các tệp hàng đợi thao tác trực tiếp thô không được hỗ trợ.

Vì vậy, bạn có một số tùy chọn ở đây

1. tham số smtp_generic_maps

Câu trả lời này lấy cảm hứng từ câu trả lời tuyệt vời này . Nó sẽ tự động viết lại địa chỉ cũ thành địa chỉ mới. Bạn có thể xác định tệp để ánh xạ địa chỉ cũ sang địa chỉ mới.

/etc/postfix/main.cf:
    smtp_generic_maps = hash:/etc/postfix/generic

/etc/postfix/generic:
    account@localdomain.example.com       account@example.com

Đừng quên postmap /etc/postfix/genericvà chạypostfix reload

  • Ưu điểm: Bạn không cần phải yêu cầu tin nhắn
  • Nhược điểm: Postfix sẽ viết lại địa chỉ người gửi và người nhận phù hợp account@localdomain.example.com.

2. sender_canonical_address

Để khắc phục nhược điểm của tùy chọn đầu tiên, bạn có thể sử dụng sender_canonical_maps. Giải pháp này dựa trên đề xuất của tác giả Postfix . Tương tự như tùy chọn đầu tiên, bạn có thể xác định tệp để ánh xạ địa chỉ cũ sang địa chỉ mới.

/etc/postfix/main.cf:
    sender_canonical_maps = hash:/etc/postfix/sender_canonical

/etc/postfix/sender_canonical:
    account@localdomain.example.com       account@example.com

Chạy postmap /etc/postfix/sender_canonicalrồi chạy postfix reload. Do dòng chảy của hàng đợi hậu tố, bạn phải xếp hàng lại hàng đợi bị ảnh hưởng bằng lệnhpostsuper -r queueid

  • Ưu điểm: Postfix không viết lại địa chỉ người nhận.
  • Nhược điểm: Bạn phải yêu cầu tất cả các tin nhắn bị ảnh hưởng. Nhưng bạn có thể yêu cầu tất cả hoãn lại bằng một lệnh duy nhấtpostsuper -r ALL deferred

3. thao tác trực tiếp của hàng đợi postfix

Đây là cách cũ thủ công để sửa đổi hàng đợi để xử lý nâng cao. Câu trả lời này đến từ danh sách gửi thư của người dùng postfix

Nói ngắn gọn

  • Trích xuất hàng đợi

    # postsuper -h queueid
    # postcat -qbh queueid > tempfile.eml
    # vi tempfile.eml
    
  • Gửi lại hàng đợi và xóa hàng đợi cũ

    # sendmail -f $sender $recipient < tempfile.eml
    # postsuper -d queueid
    

Để biết tài liệu về lệnh trên, hãy tham khảo trang này

Lưu ý:
Giải pháp ban đầu từ danh sách gửi thư của người dùng postfix , sử dụng postcat -q queueid >tempfileđể trích xuất hàng đợi. Lệnh này sẽ trích xuất tiêu đề, nội dung và thông tin meta của hàng đợi. Như Azendale đã chỉ ra dưới đây , sendmailsẽ từ chối gửi email không đúng định dạng này vì thông tin meta.

Sử dụng -bhtham số ngoài qtham số sẽ làm cho bộ lọc postcat chỉ xuất ra tiêu đề và phần thân, không bao gồm thông tin meta. Một lợi ích phụ của việc này là tempfile có định dạng mà hầu hết các ứng dụng email nhận ra là định dạng .eml, cho phép bạn xem thông báo kết quả (đã chỉnh sửa).


1
Tôi đã thử điều này và ít nhất là với phiên bản postfix của tôi, nó dường như không gửi tin nhắn cho đến khi tôi sử dụng một cái gì đó như thế postcat -qbh queueid >tempfile. (Lợi ích phụ: nó ở định dạng .eml.) Nếu tôi chỉ sử dụng -qthì dường như không làm gì khi tôi chạy sendmail. Phiên bản hậu tố 2.8.4. bất cứ ai có thể xác nhận điều này? Nếu vậy, hãy chỉnh sửa câu trả lời này.
Azendale

Xin chào @Azendale, tôi thử lại giải pháp thứ ba và vâng, chúng tôi cần sử dụng qbhđể làm cho nó hoạt động. Thêm lời giải thích trong câu trả lời được cập nhật ... :)
masegaloeh

Cảm ơn ! Đã tìm kiếm một giải pháp thứ ba như thế nào. nó thật hoàn hảo
JazZ

1

Greate writeup. Tôi gặp sự cố với một máy chủ thư đã chạy vài ngày với cấu hình kém và do đó, có rất nhiều hàng đợi cần phải được gửi lại với người nhận mới. Vì vậy, tôi đã tạo hai lớp lót để lặp qua tất cả các hàng đợi:

Đầu tiên để tìm tất cả các hàng đợi, giữ chúng, lưu chúng dưới dạng tệp .eml và gửi lại:

for ID in `mailq | awk '$1 !~/^$|[@\(^$-]/ { print $1 }' | tr -d \!`; do postsuper -h $ID; postcat -qbh $ID > tempfile$ID.eml; sendmail -f $sender $recipient < tempfile$ID.eml; done

Thứ hai để xóa hàng đợi:

for ID in `mailq | awk '$1 !~/^$|[@\(^$-]/ { print $1 }' | tr -d \!`; do postsuper -d $ID; done

Chỉ cần nhớ kiểm tra rằng không có hàng đợi mới nào không được giữ trước khi chạy mã cuối cùng này. Làm điều đó bằng cách phát hành cái này và tìm id của hàng đợi mà không có '!' cuối cùng:

mailq | awk '$1 !~/^$|[@\(^$-]/ { print $1 }'

Trên có thể dễ dàng đặt hai lớp lót đó thành một, nhưng tôi cảm thấy mình có nhiều quyền kiểm soát hơn bằng cách kiểm tra xem các thư thực sự đã được nhận trước khi xóa hàng đợi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.