2013-05-03 4 views
3

Ruby gem rmail에는 로컬 디스크의 편지함 파일을 구문 분석하는 메소드가 있습니다. 불행히도이 보석은 망가졌습니다 (Ruby 2.0.0에서). 사람들이 보석 mail으로 이동하기 때문에 고정적이지 않을 수도 있습니다.Ruby에서 편지함 파일을 구문 분석하는 방법은 무엇입니까?

보석 mail에는 방법 Mail.read('filename.txt')이 있지만 사서함의 첫 번째 메시지 만 구문 분석합니다.

그 보석과 내장 된 Net::IMAP은 imap을 통해 우편함에 액세스하는 방법에 대한 자습서로 그물을 범람 시켰습니다.

그렇다면 im38없이 파일을 구문 분석하는 방법이 아직 남아 있습니까? 내 그룹의 고독한 루비스트로서 나는 http://docs.python.org/2/library/mailbox.html에 의지하여 자신을 난처하게 만들지 않을 것입니다.

PHP의 imap_open('/var/mail/www-data', ...) - Net::IMAP.new과 같은 파일 이름 만 허용되는 경우.

+0

리터럴 편지함 파일? 디스코가 사라지기 전에 모든 사람들이 [Maildir] (https://en.wikipedia.org/wiki/Maildir)로 이사하지 않았습니까? – tadman

+0

그래, 바로 그거야.

답변

7

좋은 소식은 Mbox format은 정말 간단하지만 단순함이 결국 대체 된 이유입니다. 큰 편지함 파일을 구문 분석하여 단일 메시지를 추출하는 것은 특별히 효율적이지 않습니다.

메일 함 파일을 별도의 문자열로 분리 할 수 ​​있으면 이러한 문자열을 메일 라이브러리에 전달하여 구문 분석 할 수 있습니다.

예시 시작점 :

def parse_message(message) 
    Mail.new(message) 

    do_other_stuff! 
end 

message = nil 

while (line = STDIN.gets) 
    if (line.match(/\AFrom /)) 
    parse_message(message) if (message) 
    message = '' 
    else 
    message << line.sub(/^\>From/, 'From') 
    end 
end 

키는 각각의 메시지는 그 후에 공간 열쇠 "From " 시작한다는 것이다.헤더는 From:으로 정의되고 ">From"으로 시작하는 라인은 실제로는 "From"으로 처리됩니다. 이 인코딩 방법을 실제로 부적절하게 만드는 것은 이런 것들이지만, Maildir이 옵션이 아니라면, 여러분이해야 할 일입니다.

+0

문제의 메일 박스를 빠르게 둘러 보면 '/ From : /'이 아니라'/^From /'이 실제로 메시지를 구분한다는 것을 확인할 수 있습니다. –

1

tmail parsing email boxes을 사용할 수 있지만 mail으로 바뀌었지만 실제로는 find a class that substitutes it이 아닙니다. 그래서 당신은 tmail을 계속 지키고 싶을 것입니다.

편집 : @tadman이 지적했듯이, 루비 1.9에서 작동하지 않아야합니다. 그러나이 클래스를 이식 할 수 있습니다. (다른 사람들이 사용할 수 있도록 :-))

+0

제 경험상,'tmail '은 1.9.x에서 정말로 망가졌습니다. '메일'에 찬성하여 더 이상 사용되지 않습니다. – tadman

+0

@tadman 당신은 항상 UNIXMbox 클래스 만 포팅 할 수 있습니다. – fotanus

0

mbox 형식은 얻을 수있는만큼 간단합니다. 단순히 빈 줄로 구분하여 모든 메시지를 연결 한 것입니다. 각 메시지의 첫 번째 줄은 다섯 개의 문자 "From"로 시작합니다. 메시지가 파일에 추가되면 "From"을 시작하는 모든 행 앞에 >이 붙어 있으므로 메시지의 시작임을 나타내는 지표로 "From"으로 시작하는 행을 안정적으로 사용할 수 있습니다.

물론 이것은 이전 형식이므로 결코 표준화되지 않았으므로 다양한 변형이 있습니다. 한 변형은 Content-Length 헤더를 사용하여 메시지의 길이를 결정하며이 변형의 일부 구현은 '>'을 삽입하지 못합니다. 그러나 이것은 실제로는 드문 일이라고 생각합니다.

mbox 형식의 큰 문제는 메일 에이전트가 파일을 수정해야한다는 것입니다. 따라서 모든 구현에는 잠금 프로 시저가 있습니다. 물론 거기에는 표준화가 없으므로 다른 프로세스가 읽는 동안 사서함을 수정하는 것에주의해야합니다. 실제로 많은 메일 시스템은 maildir 형식을 대신 사용하여이 문제를 해결했습니다. 여기서 메일 함은 실제로 디렉토리이고 모든 메시지는 단일 파일입니다.

MIME 디코딩을 포함 할 수도있는 다른 작업이 있지만이를 수행하는 유틸리티를 찾을 수 있어야합니다.

관련 문제