读取某个IMAP邮箱的邮件正文



我正试图找到一种方法来读取电子邮件中的文本。不幸的是,在Memo1中仍然有关于附件的信息以及关于电子邮件结构的所有信息。

if ( IdIMAP1->UIDRetrieve( UID, IdMessage1 ) )
{
IdMessage1->MessageParts->CountParts();
if( IdMessage1->MessageParts->TextPartCount )
{
String b;
IdIMAP1->UIDRetrieveText(UID, b);
Memo1->Lines->Add( UTF8Decode(b) );
}
}

我试图使用TIdText函数,但结果Str是空的。

TStrings* Str = new TStringList;
TIdText( IdMessage1->MessageParts, Str );

消息的ContentTypemultipart类型,但部分消息也包含text/plain类型。

IdIMAP1->UIDRetrieveHeader(UID, IdMessage1);
IdMessage1->ContentType;

我试着把电子邮件的文本部分分离出来,但也没用。

TIdMessagePart *Part;
for( int j = 0; j < IdMessage1->MessageParts->Count; ++j )
{
Part = IdMessage1->MessageParts->Items[j];

if( IsHeaderMediaType(Part->ContentType, "text/plain")
{
String b;
IdIMAP1->UIDRetrieveText(UID, b);
}
}

你知道吗?

使用结构可以吗

?
TIdMessagePart *Part;
IdIMAP1->UIDRetrieveHeader(UID, IdMessage1);
IdIMAP1->UIDRetrieveStructure( UID, IdMessage1 );
for( int j = 0; j < IdMessage1->MessageParts->Count; ++j )
{
Part = IdMessage1->MessageParts->Items[j];

if( IsHeaderMediaType(Part->ContentType, "text/plain")
{
String b;
IdIMAP1->UIDRetrieveText(UID, b);
}
else { }
}

语句TIdText( IdMessage1->MessageParts, Str );并不像您想象的那样。它MessageParts添加一个新的TIdText对象,用指定的TStrings文本初始化该对象的Body文本。这不是你现在想要的。而且,由于必须通过new在堆上创建delphi风格的对象(从TObject派生),因此该语句甚至不应该编译,从而产生E2459错误。

由于您正在通过UIDRetrieve()下载电子邮件的完整内容,因此之后没有理由通过UIDRetrieveText()下载单个文本块。你可以只扫描TIdMessage内容,你已经有你想要的文本部分。在第二个示例中,替换为:

String b;
IdIMAP1->UIDRetrieveText(UID, b);

与这个:

String b = static_cast<TIdText*>(Part)->Body->Text;

否则,您应该采取不同的方法。IMAP是一个非常复杂和灵活的协议。它的一个功能是允许你下载电子邮件的结构首先(通过UIDRetrieveStructure()),根据需要分析这些标头以发现您想要的特定部分的PartNumber,然后您可以只下载这些部分(通过UIDRetrievePart())。