2017-10-05 17 views
0

저는 MIME의 파서를 해독하려고하는 초보자입니다. 나는 주로 작동하지만 코드에 결함이 있거나 메시지를 제대로 디코딩하지 못하게하는 다른 문제가 있습니다.MIME :: Parser를 사용하면 일부 이메일을 디코딩하지 못합니다.

우분투 보안 메일 링리스트에서받은 이메일입니다. 어쨌든 그들은 텍스트 전체에 이상한 문자를 생성하고, 알파인으로 이메일을 읽는 것은 괜찮습니다. 여기

 Felix Wilhelm, Fermin J. Serna, Gabriel Campana and Kevin Hamacher 
 discovered that Dnsmasq incorrectly handled DNS requests. A remote 
 attacker could use this issue to cause Dnsmasq to crash, resulting in 
 a denial of service, or possibly execute arbitrary code. 
 (CVE-2017-14491)` 

내가 이것을 사용하고 코드 조각입니다 :이 디코딩 됐어요 후 다음

이메일에서 한 조각이다

use MIME::Parser; 
use MIME::Entity; 
use MIME::WordDecoder; 
use MIME::Tools; 
use MIME::Decoder; 
use Email::MIME; 
my $parser = MIME::Parser->new; 
$parser->extract_uuencode(1); 
$parser->extract_nested_messages(1); 
$parser->output_to_core(1); 
my $buf; 
while(<STDIN>){ 
     $buf .= $_; 
} 
my $entity = $parser->parse_data($buf); 
my $subject = $entity->head->get('Subject'); 
my $from = $entity->head->get('From'); 
my $AdvDate = $entity->head->get('Date'); 
my @mailData; 
my $msg = Email::MIME->new($buf); 
$msg->walk_parts(sub { 
    my ($part) = @_; 
    #warn($part->content_type . ": " . $part->subparts); 
    if (($part->content_type =~ /text\/plain$/i) && [email protected]) { 
     #print $part->body; 
     @mailData = split('\n', $part->body); 
    } 
    elsif (($part->content_type =~ /text\/plain; charset=\"?utf-8\"?/i) && [email protected]) { 
     #print $part->body; 
     @mailData = split('\n', $part->body); 
    } 
    elsif (($part->content_type =~ /text\/plain; charset=\"?us-ascii\"?/i) && [email protected]) { 
     #print $part->body; 
     @mailData = split('\n', $part->body); 
    } 
    elsif (($part->content_type =~ /text\/plain; charset=\"?windows-1252\"?/i) && [email protected]) { 
     #print $part->body; 
     @mailData = split('\n', $part->body); 
    } 
    elsif (($part->content_type =~ /text\/plain; charset=\"?iso-8859-1\"?/i) && [email protected]) { 
     #print $part->body; 
     @mailData = split('\n', $part->body); 
    } 
}); 

는 나중에 나는 $ 버피에 다양한 작업을 할 그것을 데이터베이스에 쓰기 전에.

여기

https://pastebin.com/raw/2csUvWup

이 문제가 발생 제가 제대로이 이메일을 디코딩 제공 할 수있는 다른 어떤 정보를 알려 주시기 바랍니다 이메일 중 하나의 사본을 배치했습니다.

답변

0

불행히도 링크하는 예가 질문에 포함 된 예와 일치하지 않습니다. 또한 코드에는 출력이 완료된 위치와 방법이 표시되지 않습니다. 즉, Minimal, Complete, and Verifiable example을 제공하지 않고 대신 수행중인 작업을 표시하지만 실제로 수행 한 작업을 표시하지 않는 조각 만 표시합니다.

이 정보를 바탕으로 문제의 원인을 추측 할 수는 있지만이 추측을 확인할 수는 없습니다. 내 생각 엔 Email::MIME::body_str 대신 Email::MIME::body을 사용하는 데 문제가 있다는 것입니다. body"디코딩 및 바이트 스트링 같이 객체 본문을 반환"문서화 charset 인코딩뿐만 아니라 body_str는 "(본문 방법 등)을 상기 몸체의 콘텐츠 전송 인코딩 계층 모두를 디코딩 동안 을 같이 (본문 메서드와 달리), 유니 코드 문자열 "을 반환합니다. 즉

, body원료 옥텟 UTF-8 인코딩 된 메시지의, body_str 대신 문자을 제공을 제공합니다. 그리고 마지막 것은 아마 당신이 실제로 원하는 것일 것입니다.

+0

사과드립니다. 도움을 주셔서 대단히 감사드립니다. 다음은 적절한 pastebin입니다. https://pastebin.com/raw/hB7N3h8a 또한 body_str을 사용해 보았지만 작동하지 않았습니다. 원래 게시물을 수정할 수없는 것 같습니다. 다음은 내가 만든 스크립트의 pastebin입니다. https://pastebin.com/f1pZBvep –

+0

@AlexRegan : 어디에서 발췌 문장을 얻었는지 전혀 모르지만 데이터가 utf8이므로 utf8 출력을 사용해야합니다. 즉, STDOUT'binmode (STDOUT, ": utf8 "); 그리고 utf8 가능한 소프트웨어로 파일을 읽어야합니다. –

+0

나는 이해하지 못한다. 이것은 내가 작성한 코드입니다. 문제를 더욱 혼란스럽게하지 않기 위해이 데이터를 작성하는 함수를 데이터베이스에 제외했습니다. 그것은 utf8에 대해 아무것도 모릅니다. MIME :: Parser의 목적은 표준 텍스트에 대한 첨부 파일 형식을 디코딩하는 것이라고 생각했습니다. 그것이 내가 필요한 것입니다. –