为什么Indy没有检索我的一些邮件

时间:2014-04-17 12:01:27

标签: delphi email indy pop3

我使用以下代码从POP3帐户检索邮件。 它大部分时间都很好用,但有时会有一些邮件无法取回身体。 如果我测试IdMessage.MessageParts.Count它表示它是0 - 如果我使用另一个mailclient来检索邮件则没有问题。 我在表单上有一个TIdPOP3和一个TIdMessage组件。 连接正常,因为可能有一些邮件显示正常。

我无法找出任何未正确显示邮件但未显示邮件的系统。但可能有一个。 我使用Delphi XE3,Indy是10.5.9.0版本

procedure TfrmJsMailCollect.lstMailsClick(Sender: TObject);
var
  MailBody: string;
  intIndex: integer;
begin
  if (lstMails.Items.Count = 0) or (lstMails.SelCount = 0) then
    Exit;
  MailBody := '';
  try
    begin
      mmoBody.Clear;
      lstMails.Selected.SubItems.Strings[0];
      lstMails.Selected.ImageIndex := 4;
      conPOP3.Retrieve(lstMails.Selected.Index + 1, IdMessage);

      for intIndex := 0 To Pred(IdMessage.MessageParts.Count) do
        begin
          if (IdMessage.MessageParts.Items[intIndex] is TIdAttachmentFile) then
            begin // Attachments are skipped
            end
          else
            begin // body text
              if Pos('text/plain', IdMessage.MessageParts.Items[intIndex].ContentType) <> 0 then
                begin
                  if TIdText(IdMessage.MessageParts.Items[intIndex]).Body.Text <> '' then
                    begin
                      MailBody := MailBody + TIdText(IdMessage.MessageParts.Items[intIndex]).Body.Text;
                      mmoBody.Lines.Add(MailBody);
                      MemoValidate;
                    end;
                end;
            end;
        end;
    end;
    mmoBody.CaretPos.SetLocation(0, 0);
    Application.ProcessMessages;
  except
    Logfile.Error('F_JsMailCollect.lstMailsClick - ' + cxGetResourceString(@sLangPop3ErrorReading));
  end;
end;

根据Remy Lebeau的建议并在网上搜索,我最终得到了以下代码。这就是现在的诀窍,但是我想改进它,以便我的表单上的备忘录只显示一个对每个人都可读的好消息 - 但这可能会在以后发生。

procedure TfrmJsMailCollect.lstMailsClick(Sender: TObject);
var
  MailBody: string;
  i: integer;
  ContentType: string;
begin
  if (lstMails.Items.Count = 0) or (lstMails.SelCount = 0) then
    Exit;
  try
    MailBody := '';
    mmoBody.Clear;
    lstMails.Selected.SubItems.Strings[0];
    lstMails.Selected.ImageIndex := 4;
    conPOP3.Retrieve(lstMails.Selected.Index + 1, IdMessage);

    ContentType := IdMessage.ContentType;
    case PosInStrArray(ContentType, ['multipart/mixed', 'multipart/alternative', 'text/html', 'text/plain'], False) of
      0:  begin   { multipart/mixed }
            for i := 0 To Pred(IdMessage.MessageParts.Count) do
              begin
                if TIdText(IdMessage.MessageParts.Items[i]).Body.Text <> '' then
                  begin
                    MailBody := MailBody + TIdText(IdMessage.MessageParts.Items[i]).Body.Text;
                    mmoBody.Lines.Add(MailBody);
                    MemoValidate;
                  end;
              end;
          end;
      1:  begin   { multipart/alternative }
            for i := 0 To Pred(IdMessage.MessageParts.Count) do
              begin
                if TIdText(IdMessage.MessageParts.Items[i]).Body.Text <> '' then
                  begin
                    MailBody := MailBody + TIdText(IdMessage.MessageParts.Items[i]).Body.Text;
                    mmoBody.Lines.Add(MailBody);
                    MemoValidate;
                  end;
              end;
          end;
      2:  begin   { text/html }
            mmoBody.Lines := IdMessage.Body;
            MemoValidate;
          end;
      3:  begin   { text/plain }
            mmoBody.Lines := IdMessage.Body;
            MemoValidate;
          end;
    else
      // nothing supported to display...
    end;
    mmoBody.CaretPos.SetLocation(0, 0);
    Application.ProcessMessages;
  except
    Logfile.Error('F_JsMailCollect.lstMailsClick - ' + cxGetResourceString(@sLangPop3ErrorReading));
  end;
end;

1 个答案:

答案 0 :(得分:4)

并非所有电子邮件内容都已解析为TIdMessage.MessageParts集合。 MIME部分和附件是,但其他内容被解析为TIdMessage.Body,而你完全忽略了。在决定从哪里提取内容时,您需要查看TIdMessage.ContentType。附件将始终位于TIdMessage.MessageParts,但文字可能会也可能不会,具体取决于TIdMessage.ContentType