五分排列3软件园:请安心下载,绿色无病毒!

软件提交最近更新热门排行
您现在的位置:首页››软件教程››编程开发››编程其它

邮件解析(源码)

2006-03-28 11:23作者:佚名来源:本站整理浏览:1264 评论:0

存储邮件信息的结构:

struct ContentHeader{
\t\t        int\t nType;//=(1)0 text/plain, =(1)1 text/html, =(1)2 maybe attach
\t\t        AnsiString  strTransferEncoding;
\t\t        AnsiString  strContent;
\t\t        AnsiString  strFileName;//for attachment
\t\t    };

处理每一行的函数,处理完成存入结构体ContehtHeader,并存入链表CHList( TList* )

void __fastcall TRecvMailThread::DealLine(char* line, int len)
{
       int pos;
   AnsiString strLine( line );
   AnsiString strTemp( line );
   strLine = strLine.LowerCase();
   switch( nItemKind )
   {
   case 0 :
       if( strLine == "" && nItems >= 1 )//第一部分结束
       {
\t    nItemKind = 1;//进入下一部分
\t    break;
       }
       if( ( pos = strLine.AnsiPos( "from:" ) ) == 1 )
       {
\t    if( strFrom == "" )
\t    {
\t        strFrom = strTemp.SubString( pos + 5, len - pos - 4 );
\t        if( strFrom[ 1 ] == 0x20 )
\t\t    strFrom = strFrom.SubString( 2, strFrom.Length() - 1 );
\t        nItems ++;
\t    }
       }
       else if( ( pos = strLine.AnsiPos( "to:" ) ) == 1 )
       {
\t    if( strTo  == "" )
\t    {
\t        strTo = strTemp.SubString( pos + 3, len - pos - 2 );
\t        if( strTo[ 1 ] == 0x20 )
\t\t    strTo = strTo.SubString( 2, strTo.Length() - 1 );
\t        nItems ++;
\t    }
       }
       else if( ( pos = strLine.AnsiPos( "subject:" ) ) == 1 )
       {
\t    if( strSubject == "" )
\t    {
\t        strSubject = strTemp.SubString( pos + 8, len - pos - 7 );
\t        if( strSubject[ 1 ] == 0x20 )
\t\t    strSubject = strSubject.SubString( 2, strSubject.Length() - 1 );
\t        nItems ++;
\t    }
       }
       else if( ( pos = strLine.AnsiPos( "content-type: multipart" ) ) != 0 )
       {
\t    if( ( pos = strLine.AnsiPos( "boundary=" ) ) != 0 )
\t    {
\t        strNormalBoundary = strTemp.SubString( pos + 9, len - pos - 8 );
\t        if( strNormalBoundary[ 1 ] == '"' )
\t\t    strNormalBoundary = strNormalBoundary.SubString( 2, strNormalBoundary.Length() - 2 );
\t        bBoundary = true;
\t    }
       }
       else if( ( pos = strLine.AnsiPos( "boundary=" ) ) != 0 )
       {
\t    strNormalBoundary = strTemp.SubString( pos + 9, len - pos - 8 );
\t    if( strNormalBoundary[ 1 ] == '"' )
\t        strNormalBoundary = strNormalBoundary.SubString( 2, strNormalBoundary.Length() - 2 );
\t    bBoundary = true;
       }
       else if( ( pos = strLine.AnsiPos( "content-type: text/plain" ) ) != 0 )
       {
\t    nTextKind = 0;
\t    pCH->nType = 0;
       }
       else if( ( pos = strLine.AnsiPos( "content-type: text/html" ) ) != 0 )
       {
\t    nTextKind = 1;
\t    pCH->nType = 1;
       }
       else if( ( pos = strLine.AnsiPos( "content-transfer-encoding: " ) ) != 0 )
       {
\t    strTempEncode = strLine.SubString( pos + 27, len - pos - 26 );
\t    pCH->strTransferEncoding = strTempEncode;
       }
   break;
   case 1 :
       if( bBoundary )
       {
\t    if( strTemp.AnsiPos( strNormalBoundary ) != 0 )
\t    {
\t        file://找到边界,
\t        nItemKind = 2;
\t        nItems = 0;
\t        bBoundary = false;
\t    }
       }
       else
       {
\t    file://没有边界,以下为邮件正文部分,至 "." 结束
\t    pCH->strContent = strTemp;
\t    nItemKind = 111;
       }
   break;
   case 111 :
       if( strLine != "." )
       {
\t    pCH->strContent += strTemp;
\t    pCH->strContent += "";
       }
       else
       {
\t    CHList->Add( pCH );
\t    nItemKind = ALL_READY;
       }
   break;
   case 2 :
       file://在此查找Content-Type, Content-Transfer-Encoding, boundary, Content-Disposition等
       //.........
       if( strLine == "" && nItems >= 1 )
       {
\t    file://进入下一部分
\t    nItemKind = 3;
\t    nItems = 0;
\t    break;
       }
       if( ( pos = strLine.AnsiPos( "content-type:" ) ) != 0 )
       {
\t    nItems ++;
\t    if( strLine.AnsiPos( "multipart/" ) != 0 )
\t    {
\t        if( ( pos = strLine.AnsiPos( "boundary=" ) ) != 0 )
\t        {
\t\t    strExpandBoundary = strTemp.SubString( pos + 9, len - pos - 8 );
\t\t    if( strExpandBoundary[ 1 ] == '"' )
\t\t        strExpandBoundary = strExpandBoundary.SubString( 2, strExpandBoundary.Length() - 2 );
\t\t    bBoundary = true;
\t        }
\t        nItemKind = 222;
\t        break;
\t    }
\t    if( strLine.AnsiPos( "text/plain" ) != 0 )
\t        nTextKind = 0;
\t    else if( strLine.AnsiPos( "text/html" ) != 0 )
\t        nTextKind = 1;
\t    else
\t        nTextKind = 2;
\t    pCH->nType = nTextKind;
       }
       else if( ( pos = strLine.AnsiPos( "content-transfer-encoding:" ) ) != 0 )
       {
\t    nItems ++;
\t    pCH->strTransferEncoding = strLine.SubString( pos + 27, len - pos - 26 );
       }
       else if( strLine.AnsiPos( "content-disposition:" ) != 0 )
       {
\t    if( ( pos = strLine.AnsiPos( "filename="" ) ) != 0 )
\t    {
\t        nItems ++;
\t        pCH->strFileName = strTemp.SubString( pos + 10, len - pos - 10 );
\t        bAttach = true;
\t    }
       }
       else if( ( pos = strLine.AnsiPos( "filename="" ) ) != 0 )
       {
\t    nItems ++;
\t    pCH->strFileName = strTemp.SubString( pos + 10, len - pos - 10 );
\t    bAttach = true;
       }
   break;
   case 3 :
       file://接收内容to pCH->strContent
       if( strTemp == "." )
       {
\t    CHList->Add( pCH );
\t    nItemKind = ALL_READY;
\t    break;
       }
       if( strTemp.AnsiPos( strNormalBoundary ) != 0 )
       {
\t    CHList->Add( pCH );
\t    if( strTemp.AnsiPos ( strNormalBoundary + "--" ) == 0 )//未到最后
\t    {
\t        nItemKind = 2;
\t        pCH = new ContentHeader;
\t    }
\t    else
\t    {
\t        nItemKind = ALL_READY;
\t        break;
\t    }
       }
       else
       {
\t    pCH->strContent += strTemp;
\t    pCH->strContent += "";
       }
   break;
   case 222 :
       file://Microsoft Outlook Express
       if( bBoundary )
       {
\t    nItemKind = 333;
       }
       else if( ( pos = strLine.AnsiPos( "boundary=" ) ) != 0 )
       {
\t    strExpandBoundary = strTemp.SubString( pos + 9, len - pos - 8 );
\t    if( strExpandBoundary[ 1 ] == '"' )
\t        strExpandBoundary = strExpandBoundary.SubString( 2, strExpandBoundary.Length() - 2 );
\t    nItemKind = 333;
       }
   break;
   case 333 :
       if( ( pos = strTemp.AnsiPos( strExpandBoundary ) ) != 0 )
       {
\t    nItemKind = 444;
\t    nItems = 0;
       }
   break;
   case 444 :
       file://在此查找Content-Type, Content-Transfer-Encoding, boundary, Content-Disposition等
       //.........
       if( strLine == "" && nItems >= 1 )
       {
\t    file://进入下一部分
\t    nItemKind = 555;
\t    nItems = 0;
\t    break;
       }
       if( ( pos = strLine.AnsiPos( "content-type:" ) ) != 0 )
       {
\t    nItems ++;
\t    strLine = strLine.SubString( pos + 13, len - pos - 12 );
\t    if( strLine.AnsiPos( "text/plain" ) != 0 )
\t        nTextKind = 10;
\t    else if( strLine.AnsiPos( "text/html" ) != 0 )
\t        nTextKind = 11;
\t    else
\t        nTextKind = 12;
\t    pCH->nType = nTextKind;
       }
       else if( ( pos = strLine.AnsiPos( "content-transfer-encoding:" ) ) != 0 )
       {
\t    nItems ++;
\t    pCH->strTransferEncoding = strLine.SubString( pos + 27, len - pos - 26 );
       }
       else if( strLine.AnsiPos( "content-disposition:" ) != 0 )
       {
\t    if( ( pos = strLine.AnsiPos( "filename="" ) ) != 0 )
\t    {
\t        nItems ++;
\t        pCH->strFileName = strTemp.SubString( pos + 10, len - pos - 10 );
\t    }
       }
       else if( ( pos = strLine.AnsiPos( "filename="" ) ) != 0 )
       {
\t    nItems ++;
\t    pCH->strFileName = strTemp.SubString( pos + 10, len - pos - 10 );
       }
   break;
   case 555 :
       file://接收内容to pCH->strContent
       if( strTemp == "." )
       {
\t    CHList->Add( pCH );
\t    nItemKind = ALL_READY;
\t    break;
       }
       if( strTemp.AnsiPos( strExpandBoundary ) != 0 )
       {
\t    CHList->Add( pCH );
\t    pCH = new ContentHeader;
\t    if( strTemp.AnsiPos ( strExpandBoundary + "--" ) == 0 )//未到最后
\t    {
\t        nItemKind = 444;
\t        nItems = 0;
\t    }
\t    else
\t    {
\t        nItemKind = 1;
\t        bBoundary = true;
\t        break;
\t    }
       }
       else
       {
\t    pCH->strContent += strTemp;
\t    pCH->strContent += "";
       }
   break;
   }
}

将收取的邮件原文分行处理

mail为TMemoryStream*, 存放的是邮件原文。

int __fastcall TRecvMailThread::DealMailInfo()
{
   int len = mail->Size;
   int rval, i = 0;
   mail->Position = 0;
   char line[ 1024 ];
   nItems = 0;
   nItemKind = 0;
   nTextKind = 0;//default
   bAttach = false;
   bBoundary = false;
   strFrom = "";
   strTo = "";
   strSubject = "";
   strTempEncode = "";
   pCH = new ContentHeader;//初始生成一ContentHeader结构
   while( mail->Position < len )
   {
       if( i >= 1022 )//一行长度超出1024
       {
\t    line[ i ] = 0;
\t    DealLine( line, i );
\t    if( nItems == ALL_READY )
\t    {
\t        return 1;//完成
\t    }
\t    i = 0;
       }
       mail->ReadBuffer( line + i, 1 );
       if( line[ i ] == '')
       {
\t    i ++;
\t    mail->ReadBuffer( line + i, 1 );
\t    if( line[ i ] == '')
\t    {
\t        line[ i - 1 ] = 0;
\t        DealLine( line, i - 1 );
\t        if( nItemKind == ALL_READY )
\t        {
\t\t    return 1;//完成
\t        }
\t        i = -1;
\t    }
\t    else
\t    {
\t        mail->Position -= 1;
\t        i -= 1;
\t    }
       }
       i ++;
   }
   return 1;
}


Tags:责任编辑:cvery
顶一下(61)
92.42%

文章评论 五分排列3下载QQ群:① 7551827使用手机微信搜索 微信号:xinyunshouyou 关注我们 有更多惊喜!!

请自觉遵守互联网相关政策法规,评论内容只代表网友观点,与本站立场无关!
  验证码:     登录   注册
网友评论