Почему PDF-файл становится поврежденным / нечитаемым после отправки по электронной почте через SMTP с помощью Email :: MIME? - PullRequest
2 голосов
/ 05 апреля 2011

Я следовал примерам Email :: Sender и Email :: MIME , и это выглядит хорошо, пока вы не попытаетесь открыть PDF. Тогда понятно, что он меньше по размеру, чем оригинал и как-то коррумпирован. Мой сценарий является более или менее шаблонной копией примеров, приведенных для целей тестирования, но я боюсь, что материал MIME на самом деле здесь не работает.

use strict;
use warnings;

use Data::Dumper;
use IO::All ;

use Email::Simple;
use Email::Simple::Creator;

use Email::MIME;

use Email::Sender::Simple qw(sendmail);
use Email::Sender::Transport::SMTP;

# assemble the parts
my @parts = (
    Email::MIME->create(
        attributes => {
            filename     => "report.pdf",
            content_type => "application/pdf",
            encoding     => "quoted-printable",
            name         => "report.pdf",
        },
        body => io("report.pdf")->all
    ),
    Email::MIME->create(
        attributes => {
            content_type => "text/plain",
            disposition  => "attachment",
            charset      => "US-ASCII",
        },
        body => "Hello there!",
    ),
);

# assemble parts into email
my $email = Email::MIME->create(
    header => [
        To      => 'me@you.com',
        From    => 'me@you..com',
        Subject => "Thanks for all the fish ...",
    ],
    parts => [@parts],
);

# standard modifications
$email->header_set( 'X-PoweredBy' => 'RT v3.0' );

# more advanced
# $_->encoding_set('base64') for $email->parts;

# send the email
my $transport = Email::Sender::Transport::SMTP->new({
    host => 'mail.whatever.com',
    # port => 2525,
    sasl_username => 'webuser',
    sasl_password => 's3cr3t',
    timeout       => 20,
});
sendmail( $email, { transport => $transport } );

Я использую Windows и Perl 5.12.1.0. Кажется, это не модуль IO :: All , но я думаю, что проблема где-то здесь. Кто-нибудь знает достаточно об этом материале, чтобы помочь мне исправить это?

Я пробовал двоичный режим, разные SMTP-серверы, разные PDF-файлы, и я не могу заставить эту чертову штуку работать вообще.

1 Ответ

4 голосов
/ 05 апреля 2011

Вам необходимо закодировать ваши двоичные вложения перед отправкой электронного письма.

$_->encoding_set( 'base64' ) for $email->parts;

Я не знаю Email :: MIME. Я использую MIME :: Lite , и у меня никогда не было проблем, потому что кодирование выполняется автоматически.

### Start with a simple text message:
$msg = MIME::Lite->new(
     From    =>'me@myhost.com',
     To      =>'you@yourhost.com',
     Cc      =>'some@other.com, some@more.com',
     Subject =>'A message with 2 parts...',
     Type    =>'TEXT',
     Data    =>"Here's the GIF file you wanted"
);

### Attach a part... the make the message a multipart automatically:
$msg->attach(Type     =>'image/gif',
     Path     =>'aaa000123.gif',
     Filename =>'logo.gif'
);

MIME::Lite->send('smtp', "smtp.myisp.net", AuthUser=>"YourName", AuthPass=>"YourPass");
$msg->send;
...