Разбор заголовка сообщения с помощью 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 <sender@theirdomain.tld>)    id 1aG62o-0002ad-Hu     for recipient@mydomain.tld; 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 <recipient@mydomain.tld>; Mon, 4 Jan 2016 06:22:53 -0800 Date: Mon, 4 Jan 2016 06:22:53 -0800 To: <recipient@mydomain.tld> Message-ID: <70562391089443970564001376171645@theirserver.theirdomain.tld> From: "Sender" <sender@theirdomain.tld> 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 <sender@theirdomain.tld>)
    id 1aG62o-0002ad-Hu
    for recipient@mydomain.tld; 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 <recipient@mydomain.tld>; Mon, 4 Jan 2016 06:22:53 -0800
',
                                                                                                     'Date: Mon, 4 Jan 2016 06:22:53 -0800
',
                                                                                                     'To: <recipient@mydomain.tld>
',
                                                                                                     'Message-ID: <70562391089443970564001376171645@theirserver.theirdomain.tld>
',
                                                                                                     'From: "Sender" <sender@theirdomain.tld>
',
                                                                                                     '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: от этого объекта, но не адрес конверта.

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

1 ответ

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

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

Взгляните на https://metacpan.org/pod/MIME::Head

Надеюсь это поможет.

Другие вопросы по тегам