2009-11-29 59 views
9

我有一個機器人回覆用戶。但有時候,當我的機器人發送它的回覆時,用戶或他們的電子郵件提供商將自動響應(假期消息,退回消息,來自郵件程序守護進程的錯誤等)。然後,這是來自用戶的一條新消息(所以我的機器人認爲),它反過來回復。郵件循環!如何製作電子郵件機器人回覆用戶不回覆自動回覆,並將自己納入郵件循環

我想讓我的機器人只回復來自真人的真實電子郵件。我目前正在過濾掉承認批量優先或郵件列表的電子郵件,或者將自動提交標題等於「自動回覆」或「自動生成」(請參閱​​下面的代碼)。但我想有一個更全面或標準的方式來處理這個問題。 (我很高興看到除Perl以外的其他語言的解決方案。)

注意:請記住有自己的機器人聲明它是自動回覆!包括

Auto-Submitted: auto-reply 

在您的機器人的電子郵件的標題。

我的原始代碼避免郵件循環如下。只有在realmail返回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 
     ); 
} 

(主體檢查肯定是不必要的,我只是說這些檢查一次一個的問題出現了和上面現在看來工作,所以我不想去觸摸它,除非有一些明確更好。)

+2

我個人更喜歡受時間限制的機器人(例如,一小時內最多發送一封電子郵件給一個人)。當我一次發送很多電子郵件時,我不喜歡收到大量的度假通知。 – notnoop 2009-11-29 03:25:43

+0

好點,notnoop。無論你做什麼,像這樣的限速安全網都很聰明。 – dreeves 2009-11-29 03:28:18

回答

8

RFC 3834提供了你應該做的一些指導,但這裏有一些具體的指導方針:

設置您的信封發件人不是你的自動應答不同的電子郵件地址,以便反彈不會反饋到系統。

我總是在數據庫中存儲一個密鑰,當一個電子郵件回覆從一個特定地址發送到另一個地址時。在任何情況下,我都不會在10分鐘內多次回覆同一個地址。這樣就停止了所有循環,但不能確保良好的行爲(對郵件列表的自動響應令人討厭)。

請確保您添加了其他人匹配的標頭的任何排列以停止循環。這裏的名單我使用:


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

這裏有一些頭正則表達式的我用它來避免環路,並盡力發揮好:


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

我也避免了響應,如果任何的這些信封發件人:


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

我在這裏的答案只涉及更直接的反彈。

使用DSN (Delivery Status Notification)標識符將幫助您檢測DSN /退回的消息。它應該轉到Return-Path而不是Reply-To。

下面是典型的DSN message的示例。標題信息包括消息ID,內容類型具有特定值(交付狀態)等。

無法爲您提供perl中的任何代碼,只是我的2分錢的想法。

PS:請注意,並非所有的郵件服務器或MTA符合這一點,但我想大多數人都這樣做。

2

真的聽起來像是可能從CPAN作爲模塊可用的東西,但我在五分鐘的搜索沒有發現任何明確的相關性。 Mail::Lite::Mbox::Processor看起來像它可能會做你想要什麼:

的Mail ::精簡版::留言::匹配器是自動郵件 處理 框架。例如,您有一個 郵件服務器,您需要 自動處理某些類型的傳入郵件 消息。例如, 可以從郵件流中提取自動的 通知,發票,警報等 ,並根據這些 郵件的內容執行一些 任務。

但是它的文檔非常稀疏,以至於它自身是否提供了這些示例函數或者是否必須提供代碼來驅動它們並不明顯。

不管怎樣,如果你還沒有檢查過CPAN,那麼如果我想要做這樣的事情,那就是我要開始的地方。

1

應該有一個處理這個問題的標準方法,但問題是,你必須假設發送自動回覆的系統符合該標準,而在大多數情況下,他們卻沒有。

你如何得到你回覆的地址?我希望你沒有使用From:標題。首先檢查Reply-to:標題,如果不存在,請使用Return-path:

但是無論你做什麼,你都只需要記錄下你發給誰的信息,並且讓你的機器人在一段時間內收到一些合理的消息。