You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Delphi读取EML文件并提取纯文本的技术疑问

提取EML纯文本的问题与现有实现

我需要读取EML文件并提取其中无标签的完整纯文本。目前用TIdMessage组件遍历TIdMessage.MessageParts,通过判断PartType是否为mptText来处理,这部分运行正常,但当TIdMessage.Encoding为TIdMessageEncoding.meMIME时,无法正确解析该格式的邮件内容。另外想确认:所有邮件中是否一定存在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;

内容的提问来源于stack exchange,提问作者Max

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 10:37:03