Indy SaveToFile vs SaveToStream and BCC



我知道Indy开发人员在使用SaveToStream时选择剥离消息的BCC标头,因为流可以基于套接字。但是,如果我想将消息实际保存到流中以供进一步处理,该怎么办?此外,如果我想剥离 CRLF 怎么办。CRLF在结束之后添加?这方面的示例是将消息保存到 MBOX 类型的文件。这当然不能直接完成。

所以我现在的方法真的很混乱:

// Writing to MBOX
// Save to temp file
IdMsg->SaveToFile("filenamewrite.tmp",false);
// Make file shorter by 5 trailing bytes
boost::scoped_ptr<TFileStream> fs(new TFileStream("filenamewrite.tmp", fmOpenWrite | fmShareDenyWrite));
fs->Size = fs->Size-5;
FlushFileBuffers(reinterpret_cast<void *>(fs->Handle));
// Now this file can be copied to another stream with "mbox"-like file.

对于装载:

// Reading from MBOX
boost::scoped_ptr<TFileStream> fs(new TFileStream("mboxfile", fmOpenRead | fmShareDenyWrite));
AnsiString Data;
Data.SetLength(12345);
fs->Read(const_cast<void *>(Data.data()), Data.Length());
boost::scoped_ptr<TStringList> sl(new TStringList);
sl->Text = Data;
sl->SaveToFile("filenameread.tmp");
IdMsg->LoadFromFile("filenameread.tmp");

当然,这是非常低效的方式,完全没有必要。如果可以直接保存到流中,那将是 2 行代码而不是上面的混乱。

有没有更好的方法?如何添加重载SaveToStream以允许删除 CRLF。CRLF 并在印地中保存密件抄送标头?当消息从 MBOX 加载时,LoadFromStream类似,因此可以直接从流加载它,而无需添加尾随 CRLF。华润。

TIdMessage仅在调用TIdMessage.SaveToFile()时写入BCC标头。 没有办法在不更改 Indy 的源代码或使用 hack 类的情况下TIdMessage.SaveToStream()编写 BCC 标头。 但是,您可以手动将BCC数据存储在 TIdMessage.ExtraHeaders 属性中,以便SaveToStream()随后可以写入它。

至于处理额外的点之类的,那是因为加载/写入实际上是由TIdMessageClient完成的,它没有流的概念,也没有除 POP3/SMTP 之外的任何源/目的地的任何概念。 这是 Indy 当前架构中的一个硬编码限制,将在 Indy 11 中解决。 同时,有一些使用 TIdIOHandlerStreamMsg 类的解决方法。

试试这个:

IdMsg->ExtraHeaders->Values["Bcc"] = EncodeAddress(IdMsg->BCCList, 'B', "utf-8");
boost::scoped_ptr<TIdMessageClient> msgClient(new TIdMessageClient(NULL));
boost::scoped_ptr<TIdIOHandlerStreamMsg> io(new TIdIOHandlerStreamMsg(NULL, NULL, Target Stream Goes Here);
io->UnescapeLines = true; // <-- this is the key step!
io->FreeStreams = false;
msgClient->IOHandler = io.get();
msgClient->SendMsg(IdMsg, false);

IdMsg->Clear();
boost::scoped_ptr<TIdMessageClient> msgClient(new TIdMessageClient(NULL));
boost::scoped_ptr<TIdIOHandlerStreamMsg> io(new TIdIOHandlerStreamMsg(NULL, Source Stream Goes Here, NULL);
io->EscapeLines = true; // <-- this is the key step!
io->FreeStreams = false;
msgClient->IOHandler = io.get();
io->Open();
msgClient->ProcessMessage(IdMsg, false);

UnescapeLines=true会导致TIdIOHandlerStreamMsg以静默方式撤消TIdMessageClient在保存TIdMessage时写入的额外数据。

EscapeLines=true会导致TIdIOHandlerStreamMsg添加TIdMessageClient在加载TIdMessage时期望解析的额外数据。

相关内容

  • 没有找到相关文章

最新更新