我正试图找到一种方法来读取电子邮件中的文本。不幸的是,在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 );
消息的ContentType
为multipart
类型,但部分消息也包含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()
)。