我知道,你的关键问题是 MessageParts 的保存,现在我们看看这个类的结构:
它是一个 TMessagePart 的列表,于是问题转化为 TMessagePart 的结构:
通过观察其 Assign 方法知,关键在于其三个 Published 属性:
ContentTransfer,ContentType,ExtraHeaders
其中,前两者为字符串类型,很容易解决,关键是后者,再看看:
它是一个 TIdHeaderList 类型的,而这个类型又继承自 TStringList
呵呵,又一个熟悉的类型,但是,它还新增了几个属性:
FNameValueSeparator: string;
FCaseSensitive: Boolean;
FUnfoldLines: Boolean;
FFoldLines: Boolean;
FFoldLinesLength: Integer;
可以看到,现在所有的属性都是已知的简单类型了,问题基本上理顺了。
写出代码如下:(主要是体力活[
])我选择了用 TMemoryStream 类型
procedure SaveMessageParts(mp: TMessageParts; Stream: TMemoryStream);
procedure WriteString(Str: string);
var
Size: Integer;
begin
Size := SizeOf(Str);
// 写入字符串长度,便于读取
Stream.Write(Size, SizeOf(Size));
// 写入字符串
Stream.Write(Str[1], Size);
end;
procedure WriteInteger(Int: Integer);
begin
Stream.Write(Int, SizeOf(Int));
end;
var
i: Integer;
begin
// 由于 TMessageParts 是一个列表,循环保存其中每一个 TMessagePart
for i := 0 to mp.Count - 1 do
begin
// 保存 TMessagePart 的前两个 Published 属性,字符串
WriteString(mp
.ContentTransfer);
WriteString(mp.ContentType);
// 保存 TMessagePart 的最后一个 Published 属性 ExtraHeaders
// 首先保存其 StringList,将整个 StringList 作为一个 Text 字符串
WriteString(mp.ExtraHeaders.Text);
// 接着保存 ExtraHeaders 中剩下的几个新增属性
WriteString(mp.ExtraHeaders.FNameValueSeparator);
WriteInteger(Ord(mp.ExtraHeaders.FCaseSensitive)); // 将布尔型看作整型
WriteInteger(Ord(mp.ExtraHeaders.FUnfoldLines)); // 将布尔型看作整型
WriteInteger(Ord(mp.ExtraHeaders.FFoldLines)); // 将布尔型看作整型
WriteInteger(FFoldLinesLength);
end;
Stream.Position := 0;
end;
基本上就是这个样子了,看明白了吗?读出部分你自己试一试吧,要是不行我再帮你写
记住要以相同的顺序读出来。读字符串的话,要先读出其长度(我就是这样写的)。