2009-11-29 39 views
9

Tôi có bot trả lời người dùng. Nhưng đôi khi khi bot của tôi gửi trả lời, người dùng hoặc nhà cung cấp email của họ sẽ tự động trả lời (thư nghỉ, thư bị trả lại, lỗi từ thư gửi-daemon, v.v.). Đó là sau đó một tin nhắn mới từ người sử dụng (vì vậy bot của tôi nghĩ) rằng nó lần lượt trả lời. Vòng lặp thư!Cách tạo bot email trả lời người dùng không trả lời tự động trả lời và tự đăng nhập vào các vòng lặp thư

Tôi muốn bot của mình chỉ trả lời email thực từ con người thực. Tôi hiện đang lọc ra email thừa nhận là ưu tiên hàng loạt hoặc từ danh sách gửi thư hoặc có tiêu đề Tự động gửi bằng "tự động trả lời" hoặc "được tạo tự động" (xem mã bên dưới). Nhưng tôi tưởng tượng có một cách toàn diện hơn hoặc tiêu chuẩn để giải quyết vấn đề này. (Tôi rất vui khi thấy các giải pháp bằng các ngôn ngữ khác ngoài Perl.)

NB: Hãy nhớ có bot của riêng bạn tuyên bố rằng nó tự động trả lời! Bao gồm

Auto-Submitted: auto-reply 

trong tiêu đề email bot của bạn.

Mã ban đầu của tôi để tránh các vòng thư sau. Chỉ trả lời nếu realmail trả về true.

sub realmail { 
    my($email) = @_; 
    $email =~ /\nSubject\:\s*([^\n]*)\n/s; 
    my $subject = $1; 
    $email =~ /\nPrecedence\:\s*([^\n]*)\n/s; 
    my $precedence = $1; 
    $email =~ /\nAuto-Submitted\:\s*([^\n]*)\n/s; 
    my $autosub = $1; 

    return !($precedence =~ /bulk|list|junk/i || 
      $autosub =~ /(auto\-replied|auto\-generated)/i || 
      $subject =~ /^undelivered mail returned to sender$/i 
     ); 
} 

(Vui lòng cung Chủ đề chắc chắn là không cần thiết; Tôi chỉ cần thêm những kiểm tra cùng một lúc như các vấn đề nảy sinh và ở trên bây giờ có vẻ để làm việc vì vậy tôi không muốn chạm vào nó, trừ khi có một cái gì đó dứt khoát hơn.)

+2

Cá nhân tôi thích bot bị hạn chế theo thời gian (ví dụ: gửi email đến một người với nhiều nhất một email trong một giờ). Tôi không thích nhận được hàng tấn thông báo nghỉ khi tôi gửi nhiều email cùng một lúc. – notnoop

+0

Điểm tuyệt vời, notnoop. Dù bạn làm gì khác, một mạng lưới an toàn giới hạn tốc độ như vậy là thông minh. – dreeves

Trả lời

8

RFC 3834 đưa ra một số hướng dẫn cho những gì bạn nên làm, nhưng đây là một số hướng dẫn cụ thể:

Đặt gửi phong bì của bạn đến một địa chỉ email khác với tính năng tự động trả lời khi bạn để trả lại không phản hồi vào hệ thống .

Tôi luôn lưu trữ trong cơ sở dữ liệu là chìa khóa của thời điểm phản hồi email được gửi từ địa chỉ cụ thể đến địa chỉ khác. Trong mọi trường hợp, tôi sẽ không bao giờ trả lời cùng một địa chỉ nhiều hơn một lần trong khoảng thời gian 10 phút. Điều này một mình dừng lại tất cả các vòng, nhưng không đảm bảo hành vi tốt đẹp (tự động phản ứng với danh sách gửi thư là gây phiền nhiễu).

Đảm bảo bạn thêm bất kỳ hoán vị nào của tiêu đề mà người khác đang đối sánh để ngừng vòng lặp. Dưới đây là danh sách tôi sử dụng:


X-Loop: autoresponder 
Auto-Submitted: auto-replied 
Precedence: bulk (autoreply) 

Dưới đây là một số của regex tiêu đề tôi sử dụng để tránh các vòng lặp và để cố gắng chơi đẹp:


/^precedence:\s+(?:bulk|list|junk)/i 
/^X-(?:Loop|Mailing-List|BeenThere|Mailman)/i 
/^List-/i 
/^Auto-Submitted:/i 
/^Resent-/i 

Tôi cũng tránh phản ứng nếu có trong số này là người gửi phong bì:


if ($sender eq "" 
    || $sender =~ /^(?:request|owner|admin|bounce|bounces)-|-(?:request|owner|admin|bounce|bounces)\@|^(?:mailer-daemon|postmaster|daemon|majordomo|ma 
ilman|bounce)\@|(?:listserv|listsrv)/i) { 
1

Câu trả lời của tôi ở đây chỉ đề cập đến các thư bị trả lại đơn giản hơn.

Sử dụng số nhận dạng DSN (Delivery Status Notification) sẽ giúp bạn phát hiện thư DSN/thư bị trả lại. Nó sẽ đi đến Return-Path và không trả lời.

Đây là mẫu của một điển hình DSN message. Thông tin tiêu đề bao gồm id tin nhắn, loại nội dung có giá trị cụ thể (trạng thái phân phối), v.v.

Không thể cung cấp cho bạn bất kỳ mã nào trong perl, chỉ cần 2 xu ý tưởng của tôi.

PS: Lưu ý rằng không phải tất cả máy chủ thư hoặc MTA đều tuân thủ điều này, nhưng tôi đoán hầu hết là vậy.

2

Điều đó thực sự là thực sự giống như một thứ có thể có sẵn như một mô-đun từ CPAN, nhưng tôi không tìm thấy bất kỳ điều gì liên quan rõ ràng trong năm phút tìm kiếm. Mail::Lite::Mbox::Processor vẻ như nó có thể làm những gì bạn muốn:

Thư :: Lite :: Tin :: Matcher là một khuôn khổ cho tự động xử lý mail . Ví dụ: bạn có máy chủ thư và bạn cần phải tự động xử lý một số loại thư đến thư. Ví dụ: bạn có thể trích xuất tự động thông báo, hóa đơn, cảnh báo, v.v. từ luồng thư của bạn và thực hiện một số nhiệm vụ dựa trên nội dung của những thông báo đó.

nhưng tài liệu của nó đủ rộng để không rõ ngay cả khi nó cung cấp các chức năng mẫu đó hoặc nếu bạn phải cung cấp mã để điều khiển chúng.

Trong mọi trường hợp, mặc dù, nếu bạn chưa kiểm tra CPAN, đó là nơi tôi sẽ bắt đầu nếu tôi muốn làm một việc như thế này.

1

Có một cách tiêu chuẩn để giải quyết vấn đề này, nhưng vấn đề là bạn phải giả định rằng hệ thống gửi trả lời tự động tuân theo tiêu chuẩn đó, khi hầu hết thời gian, chúng chỉ không.

Làm thế nào để bạn nhận được địa chỉ mà bạn trả lời? Tôi hy vọng bạn không sử dụng tiêu đề From:. Trước hết hãy kiểm tra tiêu đề Reply-to: và nếu điều đó không tồn tại, hãy sử dụng Return-path:.

Nhưng bất cứ điều gì bạn làm, bạn sẽ chỉ cần giữ một bản ghi những gì bạn đã gửi cho ai và điều tiết bot của bạn đến một số giá trị hợp lý của tin nhắn mỗi lần.

Các vấn đề liên quan