【问题标题】:How can I read email with HTML format in a Delphi application?如何在 Delphi 应用程序中阅读 HTML 格式的电子邮件?
【发布时间】:2011-02-22 10:00:21
【问题描述】:

我创建了一个可以从 Exchange 2007 读取电子邮件的程序。但是,它只能读取纯文本格式的电子邮件正文。当我尝试以 HTML 格式检索电子邮件时,我的软件无法读取正文并且它总是空白。我正在使用 Delphi 2007 和 IMAP 9。

更新:

这是我的代码:

procedure TForm1.tmrCekTimer(Sender: TObject);
var
  TheFlags: TIdMessageFlagsSet;
  TheUID: string;
  TheMsg: TIdMessage;
  MailBoxName: string;
  MyClass: TComponent;
begin
  MailBoxName := 'INBOX';
  if TheImap.SelectMailBox(MailBoxName) = False then
  begin
    Screen.Cursor := crDefault;
    ShowMessage('Error selecting '+MailBoxName);
    Exit;
  end;
  TheMsg := TIdMessage.Create(nil);
  nCount := TheImap.MailBox.TotalMsgs;
  TheMsg.ContentType := 'multipart/alternative';
  TheMsg.Encoding := meMime;
  if nCount = 0 then begin
    StringGrid1.RowCount := 2;
    StringGrid1.Cells[0, 1] := '';
    StringGrid1.Cells[1, 1] := '';
    StringGrid1.Cells[2, 1] := '';
    StringGrid1.Cells[3, 1] := '';
    ShowMessage('There are no messages in '+MailBoxName);
  end else begin
    StringGrid1.RowCount := nCount + 1;
    for i := 0 to nCount-1 do begin
      TheImap.GetUID(i+1, TheUID);
      TheImap.UIDRetrieveFlags(TheUID, TheFlags);
      TheImap.UIDRetrieve(TheUID, TheMsg);
      //TheImap.UIDRetrieveHeader(TheUID, TheMsg);
      StringGrid1.Cells[0, i+1] := IntToStr(i+1);
      StringGrid1.Cells[1, i+1] := TheMsg.From.Address;
      //StringGrid1.Cells[1, i+1] := TheUID;
      if mfSeen in TheFlags then
        StringGrid1.Cells[2, i+1] := 'Yes'
      else begin
        StringGrid1.Cells[2, i+1] := 'No';
      end;
    end;
 end;

【问题讨论】:

  • 你现在怎么读?可以发代码吗?也许你的方法全错了,但也可能只有一点点错误。
  • 你调用了什么函数?你给这个函数传递了什么?出现了什么错误?
  • IMAP 9?有问题。目前的技术只支持 IMAP 4。你必须回到你的时间机器中,等到世界赶上来。

标签: delphi imap delphi-2007 html-email indy10


【解决方案1】:

MIME 编码电子邮件的内容,例如 HTML 电子邮件(如果还存在纯文本和/或附件)存储在 TIdMessage.MessageParts 属性中,而不是在 TIdMessage.Body 属性中。您需要查看电子邮件的实际 ContentType 属性以了解 TIdMessage 将电子邮件解析为哪个属性。

【讨论】:

    【解决方案2】:

    使用 MAPI,我通常尝试将PR_BODY_HTML 属性作为字符串获取;如果为空,我将检索 PR_HTML 属性。

      const
        PR_HTML = $10130102;
        PR_BODY_HTML = $1013001E;
    

    这通常对我有用。当然,也许您完全使用了不同的技术,但您并没有给我们太多的合作机会......

    【讨论】:

    • @Robin:啊,印地!您能否编辑您的问题以包含此信息,例如“...可以读取来自 Exchange 的电子邮件。我正在使用 Indy 10.1.5 中的 TIdIMAP 控件。”。还有... 哪里 你的代码在哪里? (当您想在 SO 上显示代码时,不要忘记使用 [{}] 按钮)。
    猜你喜欢
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    • 2017-07-17
    • 2014-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多