Որոնելու համար ճիշտ 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
DisplayPlainText(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/html') then
begin
DisplayHTML(TIdText(Part).Body);
Exit;
end;
if IsHeaderMediaType(Part.ContentType, 'text/plain') then
begin
DisplayPlainText(TIdText(Part).Body);
Exit;
end;
aLastIndex := i;
end;
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, -1, 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;
03.02.2013