Могу ли я анализировать электронную почту, сохраненный как текстовый файл и извлеките / сохранить его вложение, используя Perl?
-
29-09-2019 - |
Вопрос
Я использую Perl & Mail :: imapclient Сохранить электронные письма от Gmail как .txt
Файлы с использованием метода imapClient:
message_to_file
Эти файлы, кажется, содержат вложения электронных писем, закодированных как текст.
Вот некоторые из текстовых файлов:
--0015174c1274ee7ca60495ca69d5
Content-Type: video/3gpp; name="20101112233055.3gp"
Content-Disposition: attachment; filename="20101112233055.3gp"
Content-Transfer-Encoding: base64
X-Attachment-Id: 1353288501407252480-1
AAAAHGZ0eXAzZ3A0AAADADNncDRtcDQxM2dwNgAFHyltZGF0AAABthAwrMK9/Mue7fM+95wsf9P8
WI7mPzzp/ikijbucv72j7OywVGuh5kBzo89Zra6PihxZg0zadDqihZFpsPJeG36Ihk9qZW+LLQ2u
NEd96vsqgpnLFnhhwGBWgL2Xpt0cXkW....[A LOT MORE CHARS]....AAAQAAAALAAAAAQAAABRzdHN6
AAAAAAAAACAAAAChAAAAIHN0Y28AAAAAAAAABAABHNoAASMaAALYFwAFHeU=
--0015174c1274ee7ca60495ca69d5--
Я не могу найти какой-либо метод, который сохранит вложение отдельно. Есть ли способ сделать это через разбор?
Решение
То, что у вас есть необработанный текст сообщения электронной почты, закодированное MIME. Большинство языков имеют библиотеку MIME общего назначения для анализа их. Быстрый поиск на CPAN показывает, чтоMime :: Parser может сделать трюк:
use MIME::Parser;
open(FH, '/var/tmp/test.txt');
my $parser = new MIME::Parser;
my $entity = $parser->parse(\*FH) or die;
$entity->dump_skeleton;
Это будет сбросить различные части электронного письма, хранящегося в простом текстовом файле test.txt to / var / tmp. Проверьте документы MIME :: Parser для дальнейших вариантов.
Другие советы
Это предложение для обходного пути. Вы бы задействовали эту логику после того, как пройдете за заголовками.
use MIME::Base64;
my $attachlines = '';
while ( <$input> ) {
last if index( $_, '--0015174c1274ee7ca60495ca69d5--' ) == 0;
$attachlines .= $_;
}
my $attach = MIME::Base64::decode( $attachlines );
Примечание: Я принимаю как должное, что вы знаете, как работает MIME Multi-Parts Forms, поэтому я не обсуждаю, как программно получить делитель '--0015174c1274ee7ca60495ca69d5--'
.