gpt4 book ai didi

delphi - 为什么 Indy 无法检索我的一些邮件地址

转载 作者:行者123 更新时间:2023-12-03 15:52:16 26 4
gpt4 key购买 nike

我有以下代码用于从 POP3 帐户检索邮件。它在大多数情况下都运行良好,但有时会出现一些无法检索正文的邮件。如果我测试 IdMessage.MessageParts.Count 它说它是 0 - 如果我使用另一个邮件客户端来检索邮件则没有问题。我的表单上有一个 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;

最佳答案

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

关于delphi - 为什么 Indy 无法检索我的一些邮件地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23132583/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com