0

我创建了一个可以从 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;
4

2 回答 2

3

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

于 2011-03-16T23:21:51.023 回答
0

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

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

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

于 2011-02-22T11:11:16.953 回答