Как встроить изображения с помощью Perl Email :: Mime? - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь отправить HTML-письмо со встроенными изображениями.Мне придется использовать нативные вещи Unix и Email::Mime, так как это единственные вещи, которые я нашел установленными в коробке, с которой я застрял.Я создаю Email::Mime сообщение и отправляю его на sendmail.Я использую cid для встраивания изображения, но по какой-то причине я продолжаю получать изображение в качестве вложения.

Может кто-нибудь помочь мне, фрагмент кода ниже.

sub send_mail(){

use MIME::QuotedPrint;
use HTML::Entities;
use IO::All;
use Email::MIME;

$boundary = "====" . time() . "====";

$text = "HTML mail demo\n\n"
      . "This is the message text\n"
      . "Voilà du texte qui sera encodé\n";

$plain = encode_qp $text;

$html = encode_entities($text);
$html =~ s/\n\n/\n\n<p>/g;
$html =~ s/\n/<br>\n/g;
$html = "<p><strong>" . $html . "</strong></p>";
$html .= '<p><img src="cid:123.png" class = "mail" alt="img-mail" /></p>';

# multipart message
    my @parts = (
        Email::MIME->create(
            attributes => {
                content_type => "text/html",
                encoding     => "quoted-printable",
                charset      => "US-ASCII",
            },
            body_str => "<html> $html </html>",
        ),
        Email::MIME->create(
            attributes => {
                content_type => "image/png",
                name => "pie.png",
                disposition  => "Inline",
                charset      => "US-ASCII",
                encoding     => "base64",
                filename => "pie.png",
                "Content-ID" => "<123.png>",
                path => "/local_vol1_nobackup/user/ramondal/gfxip_gfx10p2_main_tree03/src/verif/ge/tb",
            },
            body => io("pie.png")->binary->all,
        ),
    );

     my $email = Email::MIME->create(
         header_str => [
             To => 'abc@xyz.com',
             Subject => "Test Email",
         ],
         parts      => [@parts],
     );


    # die $email->as_string;

    open(MAIL, "|/usr/sbin/sendmail -t") or die $!;

    print MAIL $email->as_string;

    close (MAIL);

    }

1 Ответ

0 голосов
/ 03 декабря 2018

Есть две проблемы с вашим кодом.

Во-первых, это должен быть заголовок Content-Id: <123.png> MIME, но вместо этого ваш код создает параметр content-id=<123.png> для заголовка Content-Type.Чтобы это исправить, не добавляйте Content-Id к attributes, а вместо этого header_str:

...
Email::MIME->create(
    header_str => [
        "Content-ID" => "123.png",
    ],
    attributes => {
        content_type => "image/png",
...

Во-вторых, код создает тип содержимого multipart/mixed для почты.Но изображение и HTML связаны, поэтому это должен быть multipart/related тип контента:

...
my $email = Email::MIME->create(
    header_str => [
        To => 'abc@xyz.com',
        Subject => "Test Email",
    ],
    attributes => {
        content_type => 'multipart/related'
    },
    parts      => [@parts],
);
...
...