以HTML格式发送电子邮件

时间:2009-03-23 14:12:38

标签: delphi email

目前我们正在使用MAPI从我们的应用程序发送纯文本电子邮件。当用户调用此函数时,我们指定对话框标志,以便电子邮件将显示在他们的电子邮件客户端中,然后他们可以修改并发送它。

我们想要修改电子邮件并以HTML格式发送 根据此链接,MSDN链接MAPI不适用于此http://support.microsoft.com/kb/268440

我在ExpertsExchange上看过一篇文章,说你可以使用MAPI来做这件事,但是我无法得到使用Outlook的例子(还没有尝试过任何其他客户端)

procedure ShowMailDlg(ToName,Address,HTMLMessage: string);
var
    li: integer;
    lMessage: TMapiMessage;
    lRecipArray: array of TMapiRecipDesc;
    lREs: DWord;
begin
    SetLength(lRecipArray,1);
    lRecipArray[0].ulRecipClass:=MAPI_TO;
    lRecipArray[0].lpszName:=pChar(ToName);
    lRecipArray[0].lpszAddress:=pChar(Address);
    lMessage.ulReserved:=0;
    lMessage.lpszSubject:=nil;
    lMessage.lpszNoteText:=pChar(HTMLMessage);
    lMessage.lpszMessageType:= nil;//pChar('HTML');
    lMessage.lpszDateReceived:=nil;
    lMessage.lpszConversationID:=nil;
    lMessage.flFlags:=0;
    lMessage.lpOriginator:=nil;
    lMessage.nRecipCount:=length(lRecipArray);
    lMessage.lpRecips:=PMapiRecipDesc(lRecipArray);
    lMessage.nFileCount:=0;
    lMessage.lpFiles:=PMapiFileDesc(nil);
    lRes:=MapiSendMail(0, 0 , lMessage,MAPI_DIALOG, 0);
end;

任何人都有任何想法,我怎么能这样做。我可以自动化Outlook但我想保持它与电子邮件客户端(因此MAPI)相当独立

由于

更新:感谢大家的建议。该功能的问题并非使用频繁,因此要求用户配置SMTP详细信息并不是一个真正的选择。我想我们会坚持使用纯文本电子邮件。

由于

7 个答案:

答案 0 :(得分:4)

MAPI不支持HTML格式的邮件。从Microsoft:“扩展消息应用程序编程接口(MAPI)不应用于生成HTML格式的消息。作为替代方案,请考虑使用Microsoft Outlook对象模型,CDONTS,CDOSYS,CDOEX或第三方SMTP控制。“

我会回应有关通过Indy发送的评论。我发布了一个单元,用于发送非常简单的here与Indy的HTML消息,或者随意编写自己的单元。如果您真的想要使消息可编辑,请尝试WPTools和Indy的组合。 WPTools对HTML标记有很好的支持,然后你可以通过Indy发送结果消息。

我对Synapse没有任何经验,所以我不能说这个项目有多容易/多难。

答案 1 :(得分:3)

如果您只需要为Outlook客户端提供服务,则可以尝试通过OLE访问Outlook:

procedure SendMail(const aRecipient, aSubject, aNote, aFile: string; Silent, HTML: boolean);
const
  olMailItem = 0;
var
  ii: integer;
  MyOutlook, MyMail: variant;
begin
  //*** Send something via OLE/Outlook...

  //*** Outlook- und Mail-Objekt erstellen...
  MyOutlook := CreateOLEObject('Outlook.Application');
  MyMail    := MyOutlook.CreateItem(olMailItem);

  //*** create a mail message...
  MyMail.To       := aRecipient;
  MyMail.Subject  := aSubject;

  if aNote <> '' then begin
    if HTML then
      MyMail.HTMLBody := aNote
    else begin
      MyMail.Body     := aNote;
    end;
  end;

  //*** Add Attachment...  
  if aFile <> '' then begin
    MyMail.Attachments.Add(aFile);
  end;

  if Silent then
    MyMail.Send
  else
    MyMail.Display;

  MyOutlook := UnAssigned;
end;

答案 2 :(得分:2)

使用Synapse库也可以。标题为“About MIME and its MIME Parts”的howto页面提供了一个具体示例。我个人在几个程序中使用这种技术来发送HTML电子邮件。

不幸的是,这不适用于MAPI,您需要获取用户SMTP或IMAP信息并自行处理该通信(Synapse库具有执行此操作的例程)。

如果您决定下载Synapse,我强烈建议您从subversion存储库获取最新版本。其中的更新包括对Delphi 2009的支持。

答案 3 :(得分:2)

对于Delphi的电子邮件,我会推荐SakEmail
http://groups.yahoo.com/group/sakemail/
如果您使用的是高于7的delphi版本,则 您应该将版本定义添加到.inc文件中 这是随SakEmail提供的,否则它将回归到 Delphi4兼容模式。修补inc文件后,似乎是 Delphi 2005很好。

此外,似乎MAP over MAP在Thunderbird中运行,但没有其他客户端。

答案 4 :(得分:0)

您可以将SMTP与Indy一起使用:
HTML Messages
New HTML Message Builder class(Indy 10)

答案 5 :(得分:0)

您应该考虑使用SMTP组件,例如Indy,并将发送的用户添加到邮件的CC或BCC字段。这在很大程度上满足了将此类已发送消息显示在用户自己的邮件客户端中的需要,这是MAPI的主要优势。用户甚至可以设置专门用于接收此类副本的单独帐户。

这样做可以让您完全自定义与发送邮件相关的每个细节(MHTML就是这样一个例子),包括缓存所有邮件并在单独的线程中或在不同的时间进行发送,等等。此外,这种方法比MAPI更加客户端无关;例如,即使用户使用的是基于网络的电子邮件,这仍然有效。

答案 6 :(得分:0)

MAPISendMail 有一个未记录的功能,用于包含HTML正文:

  • lpszNoteText设置为nil(或指向空字符串的指针
  • 添加HTML附件

MAPI将使用html附件作为电子邮件的正文(而不包括附件)。