【问题标题】:Send an e-mail with rtf text in delphi在delphi中发送带有rtf文本的电子邮件
【发布时间】:2010-07-22 13:17:50
【问题描述】:

我想执行以下任务:将 TRichEdit 内容(一个 rtf 文本)转换为非纯文本电子邮件正文。

MAPI 不支持 rtf,但有没有办法用 Indy 来做到这一点?

问题在于 rtf 是 rtf 而电子邮件是纯文本或 HTML。

有人可以建议一个技巧吗?是否可以使用 TWebBrowser 将 rtf 转换为文本?

基本上场景是:
1) 用户以 delphi 形式编写电子邮件,
2) 然后使用 MAPI 将电子邮件发送到默认邮件客户端(因此会生成一个新的电子邮件窗口,并且消息正文与我在 delphi 形式中的相同)
3) 用户从邮件客户端发送邮件

无论如何,MAPI 只接受纯文本。

更新:

尝试使用 Indy 我写了这个,但它仍然不起作用,当我将它发送到我的 gmail 帐户时,我收到了一条带有空正文和 NONAME 假附件的消息。

uses IdMessageBuilder;


procedure SendMail;
var
  MBuilder: TIdMessageBuilderRtf;
  MyMemoryStream: TMemoryStream;
begin
  try
    MBuilder := TIdMessageBuilderRtf.Create;
    MyMemoryStream := TMemoryStream.Create;
    MBuilder.RtfType := idMsgBldrRtfRichtext;
    // RichEdit1 has PlainText set to False
    // at design time I pasted some formatted text onto it
    RichEdit1.Lines.SaveToStream(MyMemoryStream);
    MBuilder.Rtf.LoadFromStream(MyMemoryStream);
    MBuilder.FillMessage(IdMessage1);
    IdSMTP1.Connect;
    IdSMTP1.Send(IdMessage1);
    IdSMTP1.Disconnect;
  finally
    MyMemoryStream.Free;
    MBuilder.Free;
  end;
end;

【问题讨论】:

    标签: delphi rtf sendmail indy mapi


    【解决方案1】:

    Indy 支持发送 RTF 电子邮件。发送电子邮件的方式与发送 HTML 电子邮件相同,只需使用“text/rtf”、“text/enriched”或“text/richtext”上下文类型,然后发送由 TRichEdit 生成的原始 RTF 代码它的 PlainText 属性设置为 false。此外,如果您使用的是 Indy 10,请查看其 TIdMessageBuilderRtf 类以正确设置 TIdMessage 结构。

    【讨论】:

    • 是否有示例说明如何操作?我试过了,但收到一条错误消息:procedure SendMailRtf; var MBuilder: TIdMessageBuilderRtf;开始 MBuilder := TIdMessageBuilderRtf.Create; MBuilder.RtfType := idMsgBldrRtfRichtext; MBuilder.Rtf := RichEdit1.Lines; // 从 reichedit 获取 rtf MBuilder.FillMessage(IdMessage1); MBuilder.免费; IdSMTP1.连接; IdSMTP1.Send(IdMessage1); IdSMTP1.断开连接;结束;
    • 试图为你找到一个例子。没有得到,但确实得到了一种解决方法,给正在寻找相同解决方案的人。看看nldelphi.com/forum/showthread.php?t=15822。 (荷兰语:谷歌翻译可能是你的朋友)。他们还提到了 jvRichEditToHTML。
    • TRichEdit.Lines 属性不提供对 RTF 电子邮件所需的 RTF 代码的访问。将 TRichEdit.PlainText 属性设置为 False 并改为调用 TRichEdit.SaveToStream() 方法,然后将生成的 TStream 传递给 TIdMessageBuilderRtf.RTF.LoadFromStream() 方法。
    • 我按照您对 TStream Idea 的建议进行了尝试,但没有成功。你能告诉我我的代码有什么问题吗? (我更新了添加代码的问题)。顺便说一句,我使用 TRichEdit.Lines.SaveToStream 而不是 TRichEdit.SaveToStream (不存在)。
    • @user193655:在调用 SaveToStream() 后,您没有将流的 Position 属性设置回 0,因此 LoadFromStream() 没有任何内容可以加载。
    【解决方案2】:

    显然(我自己在 Google 上搜索过,因为我从 Delphi 邮寄了一些,但在这种情况下不是),(扩展的)MAPI 的 PR_RTF_COMPRESSED 选项可能会在这里为您提供帮助。另请查看this

    【讨论】:

    • 我想停止使用 MAPI,我更愿意直接通过 idSMTP 发送电子邮件
    【解决方案3】:

    是否可以使用 TWebBrowser 将 rtf 转换为文本?

    您可以使用 TRichEdit 将 RTF 转换为文本 - 但显然这会丢失所有格式:

    Using TRichEdit at runtime without defining a parent

    2:您可以在线找到许多 RTF 到 HTML 转换器 - 有些是免费的,有些不是。像这些:

    http://wiki.delphi-jedi.org/wiki/JVCL_Help:TJvRichEditToHtml https://www.habarisoft.com/scroogexhtml_delphi.html http://www.easybyte.com/products/rtf2html.html

    http://www.sautinsoft.com/products/rtf-to-html/index.php

    3:您可以将noname 附件重命名为NONAME.MHT,然后它应该可以使用 Internet Explorer 打开。

    但是您可能需要考虑使用 HTML 编辑控件,而不是 TRichEdit。那么你就不用担心转换了。像这样的问题:-

    WYSIWYG HTML Editor Component for Delphi

    【讨论】:

    • @user193655 - 啊,是的 :) 我认为你的问题是 gmail(和许多其他客户端)不支持电子邮件中的 RTF,所以转换为 HTML 是 only 方式。你看过那些 RTF 到 HTML 的转换器吗?
    • 很高兴了解gmail和rtf,因此rtf是一种丢弃方式。你 linekd 的转换器是 .net 的,我更喜欢 VCL 组件或 win32 库。可能 rtf to html 是我唯一的解决方案。
    猜你喜欢
    • 2014-04-24
    • 2012-06-15
    • 1970-01-01
    • 2015-03-31
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    相关资源
    最近更新 更多