if ( IdIMAP1->SelectMailBox( "SENT" ) )
{
TIdIMAP4SearchRec sr[1];
sr[0].SearchKey = skAll;
IdIMAP1->UIDSearchMailBox( EXISTINGARRAY(sr) );
int ile = IdIMAP1->MailBox->SearchResult.Length;
}
错误:
第一次机会例外 $757BF192.异常类 EIdReadLnMaxLineLengthExceeded,消息"超出最大行长度"。
它尝试从 SENT 文件夹读取邮件,程序抛出错误。从另一个 SENT 子文件夹接收时没有错误。
在我看来,问题在于指定SearchKey
何时将值设置为skAll
,但尽管没有错误,但没有其他设置读取电子邮件。此错误是什么意思,我该如何解决?
顺便说一下,我有一个关于SearchKey
设置的问题。例如,是否可以在此处给出一个特定的日期,该日期仅过滤今天的电子邮件?
错误:
第一次机会例外 $757BF192.异常类 EIdReadLnMaxLineLengthExceeded,消息"超出最大行长度"。
。此错误是什么意思,我该如何解决?
这意味着TIdIMAP4
调用IOHandler.ReadLn()
方法,并接收了超过16K的数据,其中没有换行符。IOHandler.MaxLineLength
属性的默认值为16384
,IOHandler.MaxLineAction
的默认值为maException
。
要解决此错误,您可以尝试增加MaxLineLength
的值(例如,增加到MaxInt
)。但是,正确的解决方法是首先防止接收如此大量的未分隔数据。
UIDSearchMailBox()
的响应是一行,其中包含由空格分隔的电子邮件序列号列表,因此如果搜索产生大量序列号(例如,数千个序列号,这在搜索仅skAll
在大型邮箱上时有意义),则可能会在此处收到EIdReadLnMaxLineLengthExceeded
错误。
您真的不应该一开始就只搜索skAll
本身。 如果要访问邮箱中的所有电子邮件,只需改为迭代邮箱。SelectMailBox()
返回成功后,TIdIMAP4.MailBox.TotalMsgs
将包含邮箱中当前的电子邮件数。然后,您可以根据需要运行循环,使用1..TotalMsgs
(含)范围内的序列号检索单个电子邮件。
否则,请更好地筛选搜索条件以生成更少的结果。
顺便说一下,我有一个关于
SearchKey
设置的问题。例如,是否可以在此处给出一个特定的日期,该日期仅过滤今天的电子邮件?
是的,当然。 查看TIdIMAP4SearchKey
枚举,它列出了您可以搜索的所有不同键,例如:
skOn, //Messages whose internal date is within the specified date.
skSentOn, //Messages whose [RFC-822] Date: header is within the specified date.
skSentSince, //Messages whose [RFC-822] Date: header is within or later than the specified date.
skSince, //Messages whose internal date is within or later than the specified date.
在这种情况下,其中任何一个都应该有效,具体取决于您是要搜索电子邮件的内部服务器时间戳还是它们的Date
标头,例如:
if ( IdIMAP1->SelectMailBox( "SENT" ) )
{
TIdIMAP4SearchRec sr[1];
sr[0].SearchKey = skSince;
sr[0].Date = Sysutils::Date(); // or Dateutils::Today()
IdIMAP1->UIDSearchMailBox( EXISTINGARRAY(sr) );
int ile = IdIMAP1->MailBox->SearchResult.Length;
}
<小时 />更新
这个例子指的是"晚于指定日期"的表达式,但我可以看到可以使用"内"。如何设置数据范围?在
SearchKey
设置中可以吗?
IMAP 中没有"内部"搜索关键字。如果您指的是 IMAP 协议的 RFC 5032:INSIDE 搜索扩展(OLDER
和YOUNGER
搜索键),则TIdIMAP4
目前不实现此扩展。我已经打开了一个票证以将其添加到未来的版本中:
#420:更新 TIdIMAP4 以支持 RFC 5032:"IMAP 协议的 INSIDE 搜索扩展">
同时,您可以组合多个搜索关键字,它们将在逻辑上AND
在一起,例如:
if ( IdIMAP1->SelectMailBox( "SENT" ) )
{
TDateTime dtNow = Sysutils::Now();
TIdIMAP4SearchRec sr[2];
sr[0].SearchKey = skSince;
sr[0].Date = Dateutils::StartOfTheDay(Dateutils::IncDay(dtNow, -6));
sr[1].SearchKey = skBefore;
sr[1].Date = dtNow;
IdIMAP1->UIDSearchMailBox( EXISTINGARRAY(sr) );
int ile = IdIMAP1->MailBox->SearchResult.Length;
}
我建议您阅读 RFC 3501 第 6.4.4 节,了解SEARCH
命令的工作原理以及标准搜索键是什么。