使用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部分的正确方法吗? 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; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |