Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 为什么印第不能找回我的一些邮件_Delphi_Email_Indy_Pop3 - Fatal编程技术网

Delphi 为什么印第不能找回我的一些邮件

Delphi 为什么印第不能找回我的一些邮件,delphi,email,indy,pop3,Delphi,Email,Indy,Pop3,我使用以下代码从POP3帐户检索邮件。 它大部分时间都工作得很好,但有时会有一些邮件无法取回尸体。 如果我测试IdMessage.MessageParts.Count,它会显示为0-如果我使用另一个mailclient检索邮件,则没有问题。 我在表单上有一个TIdPOP3和一个TIdMessage组件。 连接正常,因为可能有一些邮件显示正常 我想不出哪种系统中的邮件显示不正确,哪种不正确。但可能有一个。 我使用Delphi XE3,Indy的版本是10.5.9.0 procedure TfrmJ

我使用以下代码从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;
过程TfrmJsMailCollect.lstMailsClick(发送方:TObject);
变量
邮件体:字符串;
intIndex:整数;
开始
如果(lstMails.Items.Count=0)或(lstMails.SelCount=0),则
出口
邮件正文:='';
尝试
开始
主体。清晰;
lstMails.Selected.SubItems.Strings[0];
lstMails.Selected.ImageIndex:=4;
conPOP3.Retrieve(lstMails.Selected.Index+1,IdMessage);
对于intIndex:=0到Pred(IdMessage.MessageParts.Count)do
开始
如果(IdMessage.MessageParts.Items[intIndex]为TIdAttachmentFile),则
开始//跳过附件
结束
其他的
开始//正文
如果Pos('text/plain',IdMessage.MessageParts.Items[intIndex].ContentType)为0,则
开始
如果是TIdText(IdMessage.MessageParts.Items[intIndex]).Body.Text“”,则
开始
MailBody:=MailBody+TIdText(IdMessage.MessageParts.Items[intIndex]).Body.Text;
mmoBody.Lines.Add(邮件体);
备忘录验证;
结束;
结束;
结束;
结束;
结束;
mmoBody.CaretPos.SetLocation(0,0);
Application.ProcessMessages;
除了
Logfile.Error('F_JsMailCollect.lstMailsClick-'+cxGetResourceString(@slangop3errorreading));
结束;
结束;
在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;
过程TfrmJsMailCollect.lstMailsClick(发送方:TObject);
变量
邮件体:字符串;
i:整数;
ContentType:字符串;
开始
如果(lstMails.Items.Count=0)或(lstMails.SelCount=0),则
出口
尝试
邮件正文:='';
主体。清晰;
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)
0:开始{multipart/mixed}
对于i:=0到Pred(IdMessage.MessageParts.Count)do
开始
如果是TIdText(IdMessage.MessageParts.Items[i]).Body.Text“”,则
开始
MailBody:=MailBody+TIdText(IdMessage.MessageParts.Items[i]).Body.Text;
mmoBody.Lines.Add(邮件体);
备忘录验证;
结束;
结束;
结束;
1:开始{multipart/alternative}
对于i:=0到Pred(IdMessage.MessageParts.Count)do
开始
如果是TIdText(IdMessage.MessageParts.Items[i]).Body.Text“”,则
开始
MailBody:=MailBody+TIdText(IdMessage.MessageParts.Items[i]).Body.Text;
mmoBody.Lines.Add(邮件体);
备忘录验证;
结束;
结束;
结束;
2:开始{text/html}
mmoBody.line:=IdMessage.Body;
备忘录验证;
结束;
3:开始{text/plain}
mmoBody.line:=IdMessage.Body;
备忘录验证;
结束;
其他的
//不支持显示任何内容。。。
结束;
mmoBody.CaretPos.SetLocation(0,0);
Application.ProcessMessages;
除了
Logfile.Error('F_JsMailCollect.lstMailsClick-'+cxGetResourceString(@slangop3errorreading));
结束;
结束;

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

确定-我将尝试在那里查看是否可以找到缺少的部分。