从 SENT 文件夹接收邮件时出现问题


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属性的默认值为16384IOHandler.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 搜索扩展(OLDERYOUNGER搜索键),则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命令的工作原理以及标准搜索键是什么。

最新更新