如何使用 Perl Email::Mime 内联图像?

Posted

技术标签:

【中文标题】如何使用 Perl Email::Mime 内联图像?【英文标题】:How to inline images with Perl Email::Mime? 【发布时间】:2019-05-05 03:55:34 【问题描述】:

我正在尝试发送带有内嵌图像的 html 电子邮件。我将不得不使用本机 unix 的东西和Email::Mime,因为这些是我发现安装在我坚持使用的盒子中的唯一东西。我正在创建一个Email::Mime 消息并将其发送到sendmail。我正在使用cid 内嵌图像,但由于某种原因,我一直将图像作为附件获取。

谁能帮帮我,下面是代码sn-p。

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"  /></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);

    

【问题讨论】:

也许可以试试embedding 图片? 根据***.com/questions/4018709/…你可以试试&lt;123.png@mymail&gt;? 【参考方案1】:

您的代码有两个问题。

首先,它应该是一个Content-Id: &lt;123.png&gt; MIME 标头,但您的代码会为Content-Type 标头生成一个content-id=&lt;123.png&gt; 参数。要解决此问题,请不要将Content-Id 添加到attributes,而是添加为header_str

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

其次,代码为邮件创建multipart/mixed 内容类型。但是图片和html是相关的,所以应该是multipart/related content-type:

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

【讨论】:

谢谢...我永远无法从文档中弄清楚

以上是关于如何使用 Perl Email::Mime 内联图像?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Email::MIME 和 multipart/signed 解析电子邮件

在 perl 中使用电子邮件 :: MIME 发送多个文件?

使用 Email::MIME 和 multipart/mixed with subparts 解析电子邮件

在 Perl 中发送 SMTP 电子邮件的更快方法?

如何使用Email :: Mime与sendmail

如何使用 Email::MIME 更改一个部分的正文?或者:body_set 对谁起作用?