使用内嵌图像和MIME :: LITE向gmail发送电子邮件

时间:2012-10-23 15:46:10

标签: perl gmail email-attachments

我需要向gmail发送一封包含内嵌图片的电子邮件。

我使用perl和MIME:LITE,但Gmail会将我的图片显示为附件,而不是内联。

有什么问题?

这是我的代码,

use MIME::Lite;

my $texto = '<html><body>hola <img src="cid:image" /> adios </body></html>';

#
my $msg = MIME::Lite->new(
    Date            => "Xxx, 22 Oct 2012 17:45:00 CET",
    From            => "pruebachunga@aqui.com",
    To              => 'chimpun@forum.chimpun',
    Subject         => "En un lugar de la mancha",
    'Message-ID'    => '123456789012345656789@8888888888888ldkf',
    Type            =>'multipart/related'
);

$msg->attach(
    Type => 'text/html',
    Data => $texto,
    Encoding => 'quoted-printable'
);

$msg->attach(
    Encoding => 'base64',
    Type => 'image/png',
    Path     => "image.png",
    Id => "image"
);

$msg->scrub(['x-mailer', 'Content-Disposition']);

print $msg->as_string;

结果是这封电子邮件(我剥离图像部分)

Content-Transfer-Encoding: binary
Content-Type: multipart/related; boundary="_----------=_135100636840600"
MIME-Version: 1.0
Date: Xxx, 22 Oct 2012 17:45:00 CET
From: pruebachunga.com
To: chimpun@forum.chimpun
Subject: En un lugar de la mancha
Message-Id: 123456789012345656789@8888888888888ldkf

This is a multi-part message in MIME format.

--_----------=_135100636840600
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html

<html><body>hola <img src=3D"cid:image" /> adios </body></html>=

--_----------=_135100636840600
Content-Id: <image>
Content-Transfer-Encoding: base64
Content-Type: image/png; name="image.png"

iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAMAAAEwO1XwAAAAB3RJTUUH1gYE
...
kmqg1wGgkx35p/KStnLuw2BGhXwIZqT+D8sxTLVK0VpuAAAAAElFTkSuQmCC

--_----------=_135100636840600--

修改

在网上阅读后,我认为该图片是附件,并且存在称为“图像屏蔽”的问题:http://www.campaignmonitor.com/resources/will-it-work/image-blocking/

我坚持我的问​​题,因为人们可能会发现这个问题很有趣。现在,我认为这段代码是正确的,并且使用其他消息,其他ID,其他发件人......此代码可以正常运行。

3 个答案:

答案 0 :(得分:1)

在网上阅读后,我认为该图片是附件,并且存在称为“图像屏蔽”的问题:http://www.campaignmonitor.com/resources/will-it-work/image-blocking/

我坚持我的问​​题,因为人们可能会发现这个问题很有趣。现在,我认为这段代码是正确的,并且使用其他消息,其他ID,其他发件人......此代码可以正常运行。

答案 1 :(得分:0)

你不应该擦洗'Content-Disposition'字段 - 这很重要!

MIME :: Lite默认使用内联内容处理, 但你也可以明确地设置它

$msg->attach(
    Encoding => 'base64',
    Type     => 'image/png',
    Path     => 'image.png',
    Id       => 'image',
    Disposition => 'inline',
);

它应该都可以。

答案 2 :(得分:0)

我使用 exter nal变体。

my $mailHTML = new MIME::Lite::HTML
    From    => $i_from,
    To      => $i_to,
    Subject => $i_subj,
    IncludeType => 'extern',
    HTMLCharset => 'utf-8';

在这种情况下,您需要在HTML中指定

<img src="http://external_url/to_image">

http或https!