Perl utf8 не совсем работает с моим скриптом - PullRequest
1 голос
/ 16 февраля 2011

У меня проблема с поддержкой utf-8 для сценария perl, который я пишу. Скрипт предназначен для отправки html-сообщений электронной почты. HTML-сообщения сохраняются в формате UTF-8 в базе данных PostgreSQL. Кажется, все работает, но иногда я получаю коррупцию, когда получаю письмо от сценария - « ».

В начале скрипта у меня есть:

#!/usr/bin/perl -w
use utf8;
use Encode;
use MIME::Base64;
use MIME::Lite;  

my $connection = DBI->connect('dbi:Pg:dbname='.$db_name.';host='.$db_host.'', $db_user,$db_pass, { AutoCommit=>1, PrintError => 1, pg_enable_utf8 => 1 });

my $fetchHtml = $connection->prepare('SELECT * FROM emails ORDER BY n_id DESC LIMIT 1');
$fetchHtml->execute();

my $message = $fetchHtml->fetchrow_hashref();

my $sendMsg = MIME::Lite->build(
    Encoding    => 'quoted-printable',
    Type        => 'multipart',
    To          => '<atesting@address.com>',
    From        => '<destination@address.com>',
    Subject     => encode("MIME-B", $message->{'title'}),
    Data        => decode_entities($message->{'html'})
);

$sendMsg->attr("Content-Type" => "text/html; charset=utf-8;");

$sendMsg->send_by_smtp('127.0.0.1', Timeout =>30, Debug => 0, SkipBad => 1);

Мне интересно, что я делаю неправильно, и почему я продолжаю получать крутой знак " "? :)

Другое дело, что я получаю это исключение при выполнении скрипта:

Uncaught exception from user code:
    Wide character in subroutine entry at /usr/lib/perl5/site_perl/5.10.0/MIME/Lite.pm line 2259.
at /usr/lib/perl5/site_perl/5.10.0/MIME/Lite.pm line 2259
    MIME::Lite::print_simple_body('MIME::Lite=HASH(0xa51b9c8)', 'MIME::Lite::SMTP=GLOB(0xa5b8888)', 1) called at /usr/lib/perl5/site_perl/5.10.0/MIME/Lite.pm line 2191
    MIME::Lite::print_body('MIME::Lite=HASH(0xa51b9c8)', 'MIME::Lite::SMTP=GLOB(0xa5b8888)', 1) called at /usr/lib/perl5/site_perl/5.10.0/MIME/Lite.pm line 2126
    MIME::Lite::print_for_smtp('MIME::Lite=HASH(0xa51b9c8)', 'MIME::Lite::SMTP=GLOB(0xa5b8888)') called at /usr/lib/perl5/site_perl/5.10.0/MIME/Lite.pm line 2897
    MIME::Lite::send_by_smtp('MIME::Lite=HASH(0xa51b9c8)', 'bla.example.com', 'Timeout', 30, 'Debug', 0, 'SkipBad', 1) called at ./advanced-daemon.pl line 354
    main::send_mail('Subject Title' <webmaster@testing>', 'spam@spam.com', 'HASH(0xa518630)') called at ./advanced-daemon.pl line 225
    main::sendEmailsToSubscribers('DBI::db=HASH(0xa517f40)', 24, 'HASH(0xa518630)') called at ./advanced-daemon.pl line 136

Я не могу понять, в чем именно проблема, но я думаю, что это связано с utf8 .. Любая помощь будет очень признательна ..:)

1 Ответ

1 голос
/ 16 февраля 2011

Сначала вам нужно use utf8, только если у вас есть код Unicode в quellcode.Тогда decode_entities($message->{'html'}) также неправильно.Используйте только $message->{'html'}.База данных должна быть utf8 по умолчанию.Затем добавьте Encoding => '8bit'.Это хорошо работает для меня.

Ваш MIME :: Lite имеет значение false: хороший пример приведен на http://www.perlmonks.org/?node_id=105262

...