Perl - декодирование PDF-файла, прикрепленного к электронному письму в MIMO Base64, приводит к пустому PDF-файлу - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь сделать следующее:

  1. Войдите в систему моего провайдера электронной почты.
  2. Загрузите последнее письмо с вложением в формате PDF.
  3. Расшифруйте файл PDF и сохраните его в файл.

Моя проблема : Когда я открываю PDF (Adobe Reader, IE, Foxit Reader ...), он открывается как пустойлист.

Если я открою файл в текстовом редакторе и сравню его с тем же файлом, который я скачал вручную с помощью веб-клиента, единственная разница - это новая строка в середине файла.Missing line

Даже если я удалю эту новую строку, я все равно стану пустым листом.И оба файла имеют одинаковое содержимое, и оба открываются как ANSI в текстовом редакторе.

Это код, который я использовал до сих пор:

use strict;
use warnings;
#use utf8;
#use open ':std', ':encoding(UTF-8)';
#binmode(STDOUT, ":utf8");

use Mail::IMAPClient;
use MIME::Base64;

my $imap = Mail::IMAPClient->new(
    Server   => 'myprovider',
    User     => 'myuser',
    Password => 'mypassword',
    Port     => '993',
    Ssl      => 1,
    Uid      => 1,
) or die "Cannot connect: $@";


# Select folder
$imap->select( 'INBOX' ) or die "Select folder error: ", $imap->LastError, "\n";

# Get all messages
my $messages = $imap->messages;

# Read whole message
my $message = $imap->message_string(@$messages[-1]);
print "\n\n\n\nWhole message: \n\n\n$message\n";

# Read message
my $part_body = $imap->bodypart_string(
    @$messages[-1],
    '1.1',
) or die "Could not get bodypart string: ", $imap->LastError;
print "Email content:\n$part_body\n";

# Read attachment
my $pdf_attachment = $imap->bodypart_string(
    @$messages[-1],
    '2.1',
) or die "Could not get bodypart string: ", $imap->LastError;
$pdf_attachment =~ s/-/+/g;
$pdf_attachment =~ s/_/\//g;
my $decoded_attachment = decode_base64($pdf_attachment);


# Logout
$imap->logout or die "Logout error: ", $imap->LastError, "\n";

# Save attachment
open(my $fh, '>', 'mypdf.pdf');
print $fh $decoded_attachment;
close $fh;
print "done\n";

# Save email
open($fh, '>', 'email.txt');
print $fh $message;
close $fh;
print "done\n";

PD: исходный код электронной почтывыглядит так:

--=_4e399e1756412414214821321834

Content-Type: application/octet-stream

Content-Transfer-Encoding: base64

Content-Disposition: attachment; filename="my_file-2018-06-08.pdf"



JVBERi0xLjQKJeLjz9MKMyAwIG9iago8PC9UeXBlIC9QYWdlCi9QYXJlbnQgMSAwIFIKL01lZGlh

Qm94IFEuODkwXQovVHJpbUJveCBbMCDAgNTk1LjI4MCA4ND4wMDAgMC4wMDAgNTk1LjI4MCA4

...

1 Ответ

0 голосов
/ 08 июня 2018

Я только что нашел проблему, мне нужно было использовать binmode для сохранения файла:

open(OUTFILE,">>mypdf.pdf"); 
binmode OUTFILE;
print OUTFILE $decoded_attachment;
close(OUTFILE);
...