随笔-3  评论-13  文章-10  trackbacks-0

这是本人在Windows mobile上开发邮件系统时,封装出来的邮件内容解析的类,供大家参考

目前可以解析大部分的邮件,测试邮件基本上是常用的邮件客户端或一些Webmail系统上发出。

如果任何问题请留言告之,谢谢...

以下代码是邮件解析核心代码部分

BOOL CXNParseMailMsg::ParseBody()
{
    
char  szTmp[ 512 =   "" ;
    GetHeaderItem(szTmp, MAIL_MESSAGE_CONTENT_TYPE, strlen(MAIL_MESSAGE_CONTENT_TYPE));
    
char   * p1  =  strstr(szTmp, MAIL_MESSAGE_CONTENT_TYPE_BOUNDARY);
    
if  (p1)
    
{
        
int  nPos  =  p1  -  szTmp  +  strlen(MAIL_MESSAGE_CONTENT_TYPE_BOUNDARY)  +   1 ;
        
char   * p2  =  strstr(szTmp + nPos,  " \ "" );
         if  (p2)
        
{
            
int  nSize  =  p2  -  p1  -  strlen(MAIL_MESSAGE_CONTENT_TYPE_BOUNDARY)  -   1 ;
            
char   * pBoundary  =   new   char  [ 2   +  nSize  +   1 ];
            
if  ( ! pBoundary)
                
return  FALSE;

            memset(pBoundary, 
0x00 2 + nSize + 1 );
            memcpy(pBoundary, 
" -- " 2 );
            memcpy(pBoundary
+ 2 , p1 + strlen(MAIL_MESSAGE_CONTENT_TYPE_BOUNDARY) + 1 , nSize);

            ParseMsgBody(pBoundary, nSize);

            FREE_Memory(pBoundary);
        }

    }

    
return  TRUE;
}


BOOL CXNParseMailMsg::ParseMsgBody(
const   char   * pBoudary,  int  nLength)
{
    
if  (m_pBody  ==  NULL)
        
return  FALSE;

    BOOL bRet 
=  TRUE;

    
char   * pTmpBoudary  =   new   char  [nLength  +   1 ];
    
if  ( ! pTmpBoudary)
        
return  FALSE;

    
while  (strlen(m_pBody)  >   0 )
    
{
        
char   * =  strstr(m_pBody, pBoudary)  +  strlen(pBoudary);
        m_pBody 
=  p;
        
if  (  0   ==  memcmp(m_pBody  +   2 , MAIL_MESSAGE_CONTENT_TYPE, strlen(MAIL_MESSAGE_CONTENT_TYPE)) )
        
{
            memset(pTmpBoudary, 
0x00 , nLength  +   1 );
            
int  nTmp  =  GetBoudary(pTmpBoudary, m_pBody);
            
if  (nTmp  >   0 )
            
{
                m_pBody 
+=  nTmp;
                ParseMsgBody(pTmpBoudary, nLength);
            }

            
else  
            
{
                
//  TO DO: read data
                p  =  strstr(m_pBody + 1 , pBoudary);
                
if  ( ! p)
                
{
                    bRet 
=  FALSE;
                    
break ;
                }

                m_pBody 
+=   2 ;                             // 去掉最前面的 "\r\n"

                
int  nSize  =  p  -  m_pBody  +   2 ;
                
char  szTmpPlain[ 128 =   "" ;
                
char  szTmpHtml[ 128 =   "" ;
                sprintf(szTmpPlain, 
" %s: %s; " , MAIL_MESSAGE_CONTENT_TYPE, MAIL_TEXT_PLAIN);
                sprintf(szTmpHtml, 
" %s: %s; " , MAIL_MESSAGE_CONTENT_TYPE, MAIL_TEXT_HTML);

                
if  ( 0   ==  memcmp(m_pBody, szTmpPlain, strlen(szTmpPlain)))
                
{     //  text/plain
                    FREE_Memory(m_pBodyText);
                    m_pBodyText 
=   new   char  [nSize  +   1 ];
                    
if  ( ! m_pBodyText)
                        
return  FALSE;

                    memset(m_pBodyText, 
0x00 , nSize  +   1 );
                    memcpy(m_pBodyText, m_pBody 
-   2 , nSize);
                    TransferPart(m_pBodyText, nSize);
                }

                
else   if  ( 0   ==  memcmp(m_pBody, szTmpHtml, strlen(szTmpHtml)))
                
{     //  text/html
                    FREE_Memory(m_pBodyHtml);
                    m_pBodyHtml 
=   new   char  [nSize  +   1 ];
                    
if  ( ! m_pBodyHtml)
                        
return  FALSE;

                    memset(m_pBodyHtml, 
0x00 , nSize  +   1 );
                    memcpy(m_pBodyHtml, m_pBody 
-   2 , nSize);
                    TransferPart(m_pBodyHtml, nSize);
                }

                
else  
                
{     //  others
                    ParseFiles(nSize);
                    m_nFileCount
++ ;
                }

                p 
+=  strlen(pBoudary);
                
if  ( 0   ==  memcmp(p,  " -- " 2 ))
                
{
                    m_pBody 
=  p  +   4 ;
                    
break ;
                }

            }

        }

    }

    FREE_Memory(pTmpBoudary);

    
return  TRUE;
}

posted on 2006-05-12 15:03 双鱼座的程序员 阅读(1604) 评论(10)  编辑 收藏 引用

评论:
# re: 标准邮件解析类C++[未登录] 2008-09-01 20:24 | snow
如果有多个Boudary应该如何处理?  回复  更多评论
  
# re: 标准邮件解析类C++ 2009-05-05 17:30 | 高绪龙
老兄,我最近也在做邮件的一个接收程序,但是不知道收到的内容如何解析,看了你的代码段,感觉应该很有帮助,能把您封装的邮件内容解析的类源码发给我看看吗?
不胜感激!

bblove007@hotmail.com  回复  更多评论
  
# re: 标准邮件解析类C++ 2009-10-14 08:30 | 孤单的翅膀
能不能把封装的邮件内容解析的类源码发我看看,我也在做邮件解析
pengyin_cc@hotmail.com  回复  更多评论
  
# re: 标准邮件解析类C++ 2009-12-26 21:56 | ly
你好 能不能把你的程序代码给我发一份 谢谢。
510756141@qq.com  回复  更多评论
  
# re: 标准邮件解析类C++[未登录] 2010-04-06 14:31 | gary
很有帮助,特此感谢
  回复  更多评论
  
# re: 标准邮件解析类C++ 2011-05-08 11:49 | 阿汤
麻烦您给我一份完整源码给我发一份,灰常谢谢!  回复  更多评论
  
# re: 标准邮件解析类C++ 2011-05-08 11:50 | 阿汤
tyuttjx163.com  回复  更多评论
  
# re: 标准邮件解析类C++[未登录] 2011-07-19 16:41 | andy
你好,可以把封装的邮件内容解析的类源码发我看看吗,我也在做邮件解析
我的邮箱是:24135303@QQ.163.com  回复  更多评论
  
# re: 标准邮件解析类C++ 2011-08-30 10:38 | xupablo
我最近也在做邮件的内容解析,能把您封装的邮件内容解析的类源码发给我看看吗?非常感谢,xupablo@163.com  回复  更多评论
  
# re: 标准邮件解析类C++ 2013-01-21 15:42 |
能否发一下完整代码或者购买方式,qq 360339207  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理