2016-01-04 4 views
-2

Мои навыки программирования в лучшем случае являются промежуточными, и я раньше не использовал Perl, поэтому, пожалуйста, ответьте мягко.Разбор заголовка сообщения с perl

Я пытаюсь извлечь оригинал «из адреса» (НЕ «конверт-с адреса») из входящих писем.

Я обрабатываю входящие письма, которые проходят через программное обеспечение MailScanner на моем сервере. Если я пишу (с помощью встроенного объекта сообщения MailScanner в):

my($message) = @_; 
MailScanner::Log::InfoLog("from address: @{$message->{headers}}"); 

я получаю следующую запись в журнале (продезинфицировать):

Received: from [192.168.12.34] (port=56309 helo=theirserver.theirdomain.tld) by server.mydomain.tld with esmtp (Exim 4.86) (envelope-from <[email protected]>) id 1aG62o-0002ad-Hu  for [email protected]; Mon, 04 Jan 2016 09:23:34 -0500 Received: from 00a657f7.theirserver.theirdomain.tld ([127.0.0.1]:8056 helo=theirserver.theirdomain.tld)  by theirserver.theirdomain.tld with ESMTP id 00PA657MF7; for <[email protected]>; Mon, 4 Jan 2016 06:22:53 -0800 Date: Mon, 4 Jan 2016 06:22:53 -0800 To: <[email protected]> Message-ID: <[email protected]> From: "Sender" <[email protected]> Subject: test Content-Language: en-us MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: multipart/alternative; boundary="----=Part.960.1818.1451917373" 

Если я пишу (на основе предложения по автору MailScanner в):

my($message) = @_; 
my $from_address = grep /^From:\s+/i, @{$message->{headers}}; 
MailScanner::Log::InfoLog("from address after grep = $from_address "); 

я получаю следующую запись в журнале:

from address after grep = 0 

Не уверен, что делать с этим результатом, я попытался с помощью Data :: Dumper через совместимый сценарий MailScanner я нашел в Интернете, и были получены следующие результаты:

> $VAR1 = bless({ 
       'nameinfected' => 0, 
       'otherinfected' => 0, 
       'disarmedtags' => [], 
       'othertypes' => {}, 
       'file2entity' => { 
            '' => bless({ 
                'ME_Parts' => [ 
                    bless({ 
                      'ME_Bodyhandle' => bless({ 
                             'MB_Path' => '/var/spool/MailScanner/incoming/9365/1aG62o-0002ad-Hu/nmsg-9365-3.txt' 
                             }, 'MIME::Body::File'), 
                      'ME_Parts' => [], 
                      'mail_inet_head' => bless({ 
                             'mail_hdr_foldlen' => 79, 
                             'mail_hdr_modify' => 0, 
                             'mail_hdr_list' => [ 
                                   'Content-Transfer-Encoding: 8bit 
', 
                                   'Content-Type: text/plain; charset="UTF-8" 
' 
                                  ], 
                             'mail_hdr_hash' => { 
                                   'Content-Type' => [ 
                                        \$VAR1->{'file2entity'}{''}{'ME_Parts'}[0]{'mail_inet_head'}{'mail_hdr_list'}[1] 
                                       ], 
                                   'Content-Transfer-Encoding' => [ 
                                           \$VAR1->{'file2entity'}{''}{'ME_Parts'}[0]{'mail_inet_head'}{'mail_hdr_list'}[0] 
                                          ] 
                                  }, 
                             'mail_hdr_mail_from' => 'KEEP', 
                             'mail_hdr_lengths' => {} 
                             }, 'MIME::Head') 
                      }, 'MIME::Entity'), 
                    bless({ 
                      'ME_Bodyhandle' => bless({ 
                             'MB_Path' => '/var/spool/MailScanner/incoming/9365/1aG62o-0002ad-Hu/nmsg-9365-42.html' 
                             }, 'MIME::Body::File'), 
                      'ME_Parts' => [], 
                      'mail_inet_head' => bless({ 
                             'mail_hdr_foldlen' => 79, 
                             'mail_hdr_modify' => 0, 
                             'mail_hdr_list' => [ 
                                   'Content-Transfer-Encoding: 8bit 
', 
                                   'Content-Type: text/html; charset="UTF-8" 
' 
                                  ], 
                             'mail_hdr_hash' => { 
                                   'Content-Type' => [ 
                                        \$VAR1->{'file2entity'}{''}{'ME_Parts'}[1]{'mail_inet_head'}{'mail_hdr_list'}[1] 
                                       ], 
                                   'Content-Transfer-Encoding' => [ 
                                           \$VAR1->{'file2entity'}{''}{'ME_Parts'}[1]{'mail_inet_head'}{'mail_hdr_list'}[0] 
                                          ] 
                                  }, 
                             'mail_hdr_mail_from' => 'KEEP', 
                             'mail_hdr_lengths' => {} 
                             }, 'MIME::Head') 
                      }, 'MIME::Entity') 
                   ], 
                'ME_Epilogue' => [ 
                     ' 
' 
                    ], 
                'ME_Preamble' => [], 
                'mail_inet_head' => bless({ 
                       'mail_hdr_foldlen' => 79, 
                       'mail_hdr_modify' => 0, 
                       'mail_hdr_list' => [ 
                            'Received: from [192.168.12.34] (port=56309 helo=theirserver.theirdomain.tld) 
    by server.mydomain.tld with esmtp (Exim 4.86) 
    (envelope-from <[email protected]>) 
    id 1aG62o-0002ad-Hu 
    for [email protected]; Mon, 04 Jan 2016 09:23:34 -0500 
', 
                            'Received: from 00a657f7.theirserver.theirdomain.tld ([127.0.0.1]:8056 helo=theirserver.theirdomain.tld) 
    by theirserver.theirdomain.tld with ESMTP id 00PA657MF7; 
    for <[email protected]>; Mon, 4 Jan 2016 06:22:53 -0800 
', 
                            'Date: Mon, 4 Jan 2016 06:22:53 -0800 
', 
                            'To: <[email protected]> 
', 
                            'Message-ID: <[email protected]> 
', 
                            'From: "Sender" <[email protected]> 
', 
                            'Subject: Test 
', 
                            'Content-Language: en-us 
', 
                            'MIME-Version: 1.0 
', 
                            'Content-Transfer-Encoding: 8bit 
', 
                            'Content-Type: multipart/alternative; 
    boundary="----=Part.960.1818.1451917373" 
' 
                            ], 

и так далее.

Так я в следующий раз попытаться разобрать mail_hdr_list со следующим:

my($message) = @_; 
MailScanner::Log::InfoLog("SpamWhitelist $msgid: mail_hdr_list @{$message->{headers}}[mail_hdr_list]"); 

и я получаю этот результат:

Received: from server.theirdomain.tld ([192.168.165.54]:49620 helo=server.theirdomain.tld) 

Я озадачен. Я не могу понять, как получить адрес From: от этого объекта, но не адрес конверта.

Любая помощь по переписыванию моего кода будет принята с благодарностью.

+2

Вы используете Data :: Dumper на $ message или $ message -> {headers} там? –

ответ

0

Данные, которые вы пытаетесь извлечь, из объекта Mime :: Entity blessed. Это означает, что при использовании Data :: Dumper или Data :: Dumper :: Perltidy вы увидите структуру, в которой должны использоваться методы пакета для манипуляции.

Основываясь на некотором быстром ознакомлении с документацией Mime :: Head, вы, вероятно, захотите позвонить -> получить ('From') или тому подобное на том объекте, к которому вы обращаетесь.

Посмотрите на https://metacpan.org/pod/MIME::Head#Getting-field-contents

Надеются, что это помогает.

Смежные вопросы