加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

使用Indy 10和DELPHI评估电子邮件

发布时间:2020-12-15 09:20:27 所属栏目:大数据 来源:网络整理
导读:我使用以下代码来评估msg.使用INDY 10组件收到的E Mail消息的内容(正文/行) function LinesFromMsg(aMsg: TIdMessage): TStrings; var i: Integer; begin for i := 0 to aMsg.MessageParts.AttachmentCount-1 do begin if (amsg.MessageParts.Items[i].Conte
我使用以下代码来评估msg.使用INDY 10组件收到的E Mail消息的内容(正文/行)

function LinesFromMsg(aMsg: TIdMessage): TStrings; 
var
  i: Integer; 
begin
  for i := 0 to aMsg.MessageParts.AttachmentCount-1 do
  begin
    if (amsg.MessageParts.Items[i].ContentType ='HTML') then
    begin
      if (amsg.MessageParts.Items[i] is Tidtext) then
        Result := TidText(amsg.MessageParts.Items[i]).body;
    end;
  end; 
end;

关于这段代码我有两个问题:

a)这是在仲裁邮件中找到Tlines部分的正确方法吗?
(考虑INDY 10 EMAIL MSG PARTS所示的建议)

b)我在哪里可以找到所有不同Contenttype字符串值的教程?

解决方法

要查找的正确ContentType值是text / html.使用Indy的IsHeaderMediaType()函数进行检查,因为ContentType值可能具有与您的比较需要忽略的关联的其他属性.

您还需要考虑TIdMessage.ContentType,因为HTML电子邮件可能不是MIME编码的,因此根本不使用TIdMessage.MessageParts`集合.

最后,循环需要使用MessageParts.Count属性而不是MessageParts.AttachmentsCount属性.

试试这个:

function HTMLFromMsg(aMsg: TIdMessage): TStrings; 
var
  i: Integer; 
  Part: TIdMessagePart;
begin
  Result := nil;
  if IsHeaderMediaType(aMsg.ContentType,'text/html') then
  begin
    Result := aMsg.Body;
    Exit;
  end;
  for i := 0 to aMsg.MessageParts.Count-1 do
  begin
    Part := aMsg.MessageParts.Items[i];
    if (Part is TIdText) and IsHeaderMediaType(Part.ContentType,'text/html') then
    begin
      Result := TIdText(Part).Body;
      Exit;
    end;
  end; 
end;

话虽如此,从技术上讲,这不是处理MIME的正确方法.正式地说,符合标准的读者应该通过MIME部分向后循环,因为它们从最简单的形式向下排序到最复杂的形式.因此,您需要向后循环,将MIME嵌套考虑在内,寻找您支持的最复杂的表单.更像这样的东西(未经测试):

procedure DisplayPlainText(Body: TStrings);
begin
  // display plain text as needed...
end;

procedure DisplayHTML(Body: TStrings);
begin
  // display html as needed...
end;

procedure DisplayMultiPartAlternative(aMsg: TIdMessage; aParentIndex,aLastIndex: Integer);
var
  Part: TIdMessagePart;
  i: Integer:
begin
  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 IsHeaderMediaType(Part.ContentType,'text/html') then
      begin
        DisplayHTML(TIdText(Part).Body);
        Exit;
      end;
      if IsHeaderMediaType(Part.ContentType,'text/plain') then
      begin
        DisplayPlain(TIdText(Part).Body);
        Exit;
      end;
    end;
  end;
  // nothing supported to display...
end;

procedure DisplayMultiPartMixed(aMsg: TIdMessage; aParentIndex,aLastIndex: Integer);
var
  Part: TIdMessagePart;
  i: Integer;
begin
  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 IsHeaderMediaType(Part.ContentType,'multipart/alternative') then
      begin
        DisplayMultiPartAlternative(aMsg,ParentPart.Index,aLastIndex);
        Exit;
      end;
      if IsHeaderMediaType(ParentPart.ContentType,'text/plain') then
      begin
        DisplayHTML(TIdText(Part).Body);
        Exit;
      end;
      aLastIndex := i;
    end;
    // nothing supported to display...
  end;


procedure DisplayMsg(aMsg: TIdMessage); 
var
  ContentType: string;
begin
  ContentType := ExtractHeaderMediaType(aMsg.ContentType);
  case PosInStrArray(ContentType,['multipart/mixed','multipart/alternative','text/html','text/plain'],False) of
    0: begin
      DisplayMultiPartAlternative(aMsg,-1,aMsg.MessageParts.Count);
      Exit;
    end;
    1: begin
      DisplayMultiPartMixed(aMsg,aMsg.MessageParts.Count);
      Exit;
    end;
    2: begin
      DisplayHTML(aMsg.Body);
      Exit;
    end;
    3: begin
      DisplayPlainText(aMsg.Body);
      Exit;
    end;
  else
    // nothing supported to display...
  end;
end;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读