使用 Delphi 读取 EML 文件

问题描述 投票:0回答:1

我想读取 eml 文件并提取纯文本。

到目前为止,我已经找到了

TIdMessage
,我可以用它迭代
TIdMessage.MessageParts
并检查它们的
PartType
是否是
mptText
。所有这些都效果很好。

我的问题是正确阅读消息,如果

TIdMessage.Encoding = TIdMessageEncoding.meMIME
我无法理解该格式的逻辑。我想从 EML 文件中获取没有标签的完整文本。邮件中总是有
text/plain
-部分吗?

到目前为止,我得到了以下两个函数,它们返回消息的 html 内容。

function GetMultiPartAlternative(aMsg: TIdMessage; aParentIndex, aLastIndex: Integer): String;
var
  Part: TIdMessagePart;
  i: Integer;
begin
  Result := '';

  for i := aLastIndex - 1 downto aParentIndex + 1 do
  begin
    Part := aMsg.MessageParts.Items[i];
    if { (Part.ParentPart = aParentIndex) and } (Part is TIdText) then
    begin
      if Part.ContentType.StartsWith('text/html') then
      begin
        Result := (Part as TIdText).Body.Text;
        Exit;
      end
      else if Part.ContentType.StartsWith('text/plain') then
      begin
        Result := (Part as TIdText).Body.Text;
        Exit;
      end;
    end;
  end;
end;

function GetMultiPartMixed(aMsg: TIdMessage; aParentIndex, aLastIndex: Integer): String;
var
  Part: TIdMessagePart;
  i: Integer;
begin
  Result := '';

  for i := aLastIndex - 1 downto aParentIndex + 1 do
  begin
    Part := aMsg.MessageParts.Items[i];

    if { (Part.ParentPart = aParentIndex) and } (Part is TIdText) then
    begin
      if Part.ContentType.StartsWith('multipart/alternative') then
      begin
        Result := GetMultiPartAlternative(aMsg, aParentIndex, aLastIndex);
        Exit;
      end
      else if Part.ContentType.StartsWith('text/html') then
      begin
        Result := (Part as TIdText).Body.Text;
        Exit;
      end
      else if Part.ContentType.StartsWith('text/plain') then
      begin
        Result := (Part as TIdText).Body.Text;
        Exit;
      end;
      aLastIndex := i;
    end;
  end;
end;
email delphi indy mime eml
1个回答
0
投票

TIdMessage
使用
MessageParts
集合来表示
MIME
电子邮件。您的代码可以很好地访问各个 MIME 部分(并且 +1 可以按“正确”顺序迭代这些部分!)。如果您只对纯文本部分感兴趣,只需忽略 HTML 部分即可。

邮件中总是有
text/plain

部分吗?


不幸的是,没有。这取决于发件人决定包含哪些格式。

请阅读 Indy 博客上的这篇文章:

HTML Messages

(它旨在发送,但它确实描述了常见场景的 TIdMessage 布局)。

有 HTML 

没有

纯文本是您必须考虑的真正可能性。

© www.soinside.com 2019 - 2024. All rights reserved.