2009-11-29 8 views
9

사용자에게 응답하는 로봇이 있습니다. 하지만 때로는 내 봇이 답장을 보내면 사용자 또는 이메일 제공 업체가 자동 응답합니다 (휴가 메시지, 바운스 메시지, 메일러 데몬 오류 등). 그런 다음 사용자가 보낸 새 메시지 (내 봇이 생각하기에)가 차례로 응답합니다. 메일 루프!사용자에게 응답하는 전자 메일 봇을 자동 응답에 회신하지 않고 메일 루프로 가져 오는 방법

실제 로봇의 실제 이메일에만 답장을 보내고 싶습니다. 현재 대량 우선 순위 나 메일 링리스트에서 승인하는 이메일을 필터링하고 있거나 자동 제출 된 헤더가 "자동 응답 됨"또는 "자동 생성 됨"(아래 코드 참조)과 같습니다. 그러나이 문제를 다루는보다 포괄적 인 표준 방법이 있다고 상상해보십시오. (Perl 외에도 다른 언어의 솔루션도 제공하게되어 기쁩니다.)

NB : 자동 응답한다는 사실을 기억하십시오! 봇의 이메일 헤더에

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

+0

좋은 점, notnoop. 당신이하는 일이 무엇이든, 속도 제한 안전망은 똑똑합니다. – dreeves

답변

8

RFC 3834는 당신이 무엇을해야하는지에 대한 몇 가지 지침을 제공하지만, 여기에 몇 가지 구체적인 지침은 다음과 같습니다

반송 시스템에 피드백하지 않도록

은 자동 응답이 아닌 다른 이메일 주소로 메일 발신자 설정 .

전자 메일 응답이 특정 주소에서 다른 주소로 전송되었을 때의 키를 항상 데이터베이스에 저장합니다. 어떠한 경우에도 10 분 내에 한 번 이상 같은 주소로 응답하지 않습니다. 이것은 혼자서 모든 루프를 멈추었지만 좋은 행동 (메일 링리스트에 대한 자동 응답은 성가신 일입니다)을 보장하지 않습니다.

루프를 중지하기 위해 다른 사람들이 매치하는 헤더의 순열을 추가해야합니다. 여기에 목록 내가 사용하는 것 :


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

을 이들의이 봉투 보낸 사람이 있다면 나 또한 응답 피하기 : 여기


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

내가 루프를 방지하고 좋은 재생하려고하는 데 사용하는 일부 헤더 정규식의 위치 :


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/반송 된 메시지를 감지하는 데 도움이됩니다. 회신 경로가 아닌 회신 경로로 이동해야합니다.

다음은 일반적인 DSN message의 샘플입니다. 헤더 정보에는 메시지 ID, 컨텐트 유형에 특정 값 (배달 상태)이 포함됩니다.

perl에서 코드를 제공 할 수 없으며 단지 2 센트입니다.

추 신 : 모든 메일 서버 또는 MTA이이 규칙을 따르는 것은 아니지만 대부분은 그렇게 생각합니다.

2

실제로은 아마도 CPAN에서 모듈로 사용할 수있는 것으로 들리지만 검색하는 데 5 분 이내에 관련있는 항목이 없습니다.

메일 :: 라이트 :: 메시지 :: Matcher를 자동화 메일 처리를위한 프레임 워크입니다 : 당신이 원하는 것을 할 수있는 것처럼 Mail::Lite::Mbox::Processor 보인다. 예를 들어 메일 서버가 있고 메일의 일부 유형을 처리하려면 메시지가 자동으로 필요합니다. 예를 들어 메일 흐름에서 알림, 인보이스, 알리미 등을 추출하고 메시지의 내용에 따라 일부 개의 작업을 수행 할 수 있습니다.

그러나 그 문서는 이러한 예제 기능 자체를 제공하는지 또는이를 구동하기 위해 코드를 제공해야하는지에 대해 즉시 명확하지는 않습니다.

그러나 CPAN을 아직 확인하지 않았다면, 내가 이런 식으로하고 싶다면 시작할 수 있습니다.

1

이 문제를 처리하는 표준 방법이 있어야하지만 문제는 자동 응답을 보내는 시스템이 해당 표준을 준수한다고 가정해야한다는 것입니다. 대부분의 경우 자동 응답을 사용하지 않는 시스템입니다.

회신 주소는 어떻게 받습니까? From: 헤더를 사용하지 않기를 바랍니다. Reply-to: 헤더를 먼저 확인하고없는 경우 Return-path:을 사용하십시오.

당신이 무엇을 하든지간에, 당신은 당신이 보낸 사람의 로그를 보관하고 시간당 메시지의 합당한 가치에 당신의 봇을 조종해야 할 것입니다.