Including an embedded image in an Outlook HTML email via Perl

杀马特。学长 韩版系。学妹 提交于 2019-12-11 15:09:17

问题


I need to generate an HTML email with a banner image embedded. It must go through an Outlook2007 mail client. I tried to base64encode the image and put it inline (it looked good) but Outlook would not send the email. I have culled through many different articles (in various programming languages) that have gotten me to this point but it is still not working. This code creates the email and attaches the image but the image is not displayed.

use Win32::OLE;
use Win32::OLE::Const 'Microsoft Outlook';

my $oMailer = new Win32::OLE('Outlook.Application') or
  die "Unable to start an Outlook instance: $!\n";
my $oEmail = $oMailer->CreateItem(0) or
  die "Unable to create mail item: $!\n";

$oEmail->{'To'} = 'me@here.org';
$oEmail->{'Subject'} = "Embedded image test";
$oEmail->{'BodyFormat'} = olFormatHTML;
$oEmail->{'HTMLBody'}   = "<html><body><img src=\"cid:banner.jpg\"></body></html>";

my $attachments = $oEmail->Attachments();
my $bannerAttachment = $attachments->Add('C:/test/banner.jpg', olEmbeddeditem);
$bannerAttachment->PropertyAccessor->SetProperty(
    "http://schemas.microsoft.com/mapi/proptag/0x3712001E", "banner.jpg");

$oEmail->save();

(BTW, I removed all the Win32::OLE->LastError() checks before posting because none of them failed anyway.)

When adding the attachment, it does not set the attachment Type to olEmbeddeditem (5); Don't know if this is relevant to the problem.

The SetProperty does not set the value either. That is supposed to set the Content ID (cid) that is referenced in the img src in the HTML. I used the below code to GetProperty and it returns an empty string.

my $CIDvalue = $bannerAttachment->PropertyAccessor->GetProperty(
    "http://schemas.microsoft.com/mapi/proptag/0x3712001E");
print ">>>CIDvalue = $CIDvalue\n";

So close I can taste it!


回答1:


Careful reading in the Perl docs for WIN32::OLE revealed a SetProperty method that was apparently being called instead of the M$ one I thought I was calling. Changing the code to:

$bannerAttachment->PropertyAccessor->Invoke('SetProperty', "http://schemas.microsoft.com/mapi/proptag/0x3712001E", "banner.jpg");

made it work and there was great rejoicing :)



来源:https://stackoverflow.com/questions/14246345/including-an-embedded-image-in-an-outlook-html-email-via-perl

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!