如何使用 Perl Email::Mime 嵌入图像?
How to inline images with Perl Email::Mime?
我正在尝试发送 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);
}
你的代码有两个问题。
首先,它应该是 Content-Id: <123.png>
MIME header,但您的代码却为 Content-Type
header 生成了 content-id=<123.png>
参数。要解决此问题,请不要将 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],
);
...
我正在尝试发送 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);
}
你的代码有两个问题。
首先,它应该是 Content-Id: <123.png>
MIME header,但您的代码却为 Content-Type
header 生成了 content-id=<123.png>
参数。要解决此问题,请不要将 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],
);
...