代码之家  ›  专栏  ›  技术社区  ›  Jamie

以HTML格式发送电子邮件

  •  2
  • Jamie  · 技术社区  · 17 年前

    目前,我们正在使用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 回复  |  直到 17 年前
        1
  •  4
  •   Marshall Fryman    17 年前

    MAPI不支持HTML格式的邮件。从…起 Microsoft “扩展消息应用程序编程接口(MAPI)不应该用来生成HTML格式的消息。作为替代,考虑使用微软Outlook对象模型、CDONTS、CDOSIS、CDOEX或第三方SMTP控件。”

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

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

        2
  •  3
  •   Andreas Wieland    17 年前

    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;
    
        3
  •  2
  •   skamradt    17 年前

    这也可以使用 Synapse 图书馆“howto”页面提供了一个具体示例,标题为 About MIME and its MIME Parts

    不幸的是,这在MAPI上不起作用,您需要获取用户的SMTP或IMAP信息,并自己处理该通信(Synapse库有一些例程来完成这项工作)。

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

        4
  •  2
  •   André van Schoubroeck    17 年前


    http://groups.yahoo.com/group/sakemail/
    如果您使用的是高于7的delphi版本,
    您应该将版本定义添加到.inc文件中。
    这是SakEmail提供的,否则它将返回到
    Delphi4兼容模式。在修补了inc文件之后
    德尔福2005很好。

    此外,似乎HTML over MAPI在Thunderbird中也能工作,但没有其他客户端。

        5
  •  1
  •   Ian Boyd    10 年前

    有一个未记录的功能 MAPISendMail 要包含HTML正文,请执行以下操作:

    • 设置 lpszNoteText 到 nil (或指向 空字符串 )
    • 添加HTML附件

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

        6
  •  0
  •   Ondrej Kelle    17 年前

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

        7
  •  0
  •   Caleb Hattingh    16 年前

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

    通过这种方式,您可以完全定制与发送邮件相关的每个细节(MHTML就是这样的一个例子),包括缓存所有邮件并在单独的线程中发送,或者在不同的时间发送,等等。而且,这种方法甚至比MAPI更不依赖于客户端;例如,即使用户正在使用基于web的电子邮件(如Gmail),这仍然有效。