Delphi 为什么印第不能找回我的一些邮件
我使用以下代码从POP3帐户检索邮件。 它大部分时间都工作得很好,但有时会有一些邮件无法取回尸体。 如果我测试IdMessage.MessageParts.Count,它会显示为0-如果我使用另一个mailclient检索邮件,则没有问题。 我在表单上有一个TIdPOP3和一个TIdMessage组件。 连接正常,因为可能有一些邮件显示正常 我想不出哪种系统中的邮件显示不正确,哪种不正确。但可能有一个。 我使用Delphi XE3,Indy的版本是10.5.9.0Delphi 为什么印第不能找回我的一些邮件,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
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
确定-我将尝试在那里查看是否可以找到缺少的部分。