我想读取 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;
TIdMessage
使用 MessageParts
集合来表示 MIME
电子邮件。您的代码可以很好地访问各个 MIME 部分(并且 +1 可以按“正确”顺序迭代这些部分!)。如果您只对纯文本部分感兴趣,只需忽略 HTML 部分即可。
邮件中总是有text/plain
部分吗?
不幸的是,没有。这取决于发件人决定包含哪些格式。
请阅读 Indy 博客上的这篇文章:
HTML Messages(它旨在发送,但它确实描述了常见场景的 TIdMessage
布局)。
纯文本是您必须考虑的真正可能性。