首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >印第SaveToFile对SaveToStream和BCC

印第SaveToFile对SaveToStream和BCC
EN

Stack Overflow用户
提问于 2013-10-28 01:01:03
回答 1查看 834关注 0票数 0

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

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

代码语言:javascript
复制
// 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.

至于装载:

代码语言:javascript
复制
// 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以允许在Indy中删除CRLF.CRLF并保存BCC头如何?与LoadFromStream类似,当消息从MBOX加载时,可以直接从流加载消息,而无需添加尾随CRLF.CRLF。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-28 23:09:29

TIdMessage只在调用BCC头时才写入TIdMessage.SaveToFile()头。如果不修改Indy的源代码或使用hack类,就无法让TIdMessage.SaveToStream()编写BCC头。但是,您可以手动将BCC数据存储在TIdMessage.ExtraHeaders属性中,这样SaveToStream()就可以编写它。

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

试试这个:

代码语言:javascript
复制
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);

代码语言:javascript
复制
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时希望解析的额外数据。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19625704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档