收到的 eml 文件保存为 .eml 格式的文件,是个文本文件,可以通过文本分析得到收件人,发件人等信息,有没有完整的,解析.eml 文件的例子,读出每一个部分,最好是封装成一个类。先谢了。

解决方案 »

  1.   

    use CDO for windows 2000
    see MSDN
      

  2.   

    给你介绍一本书:《Internet Email编程》Wood著,陈逸译 中国电力出版社
    Email格式和协议讲得很清楚!
      

  3.   

    我用ue打开,对着格式强行解析过一次
    #define TITLE_FROM 0
    #define TITLE_TO   1
    #define TITLE_SUBJECT 2
    #define TITLE_DATE  3
    #define TITLE_MIME_V 4
    #define TITLE_CONTTYPE 5
    #define TITLE_COTREN   6
    #define TITLE_MIMEOLE  7
    typedef struct tagEmail
    {
    char czFrom[1024];
    char czTo[1024];
    char czSubject[1024];
    char czDate[1024];
    char czMime_V[1024];
    char czConType[1024];
    char czCotrEn[1024];
    char czX_MimeOle[1024];
    char* pData;
    char DealWitchBuffer[1024];
    }EMLFILE;
    EMLFILE my_eml;int GetTitle(char *p);
    bool prasDecode(char *pSour);
    void praseDate(char *pSour);
    void PraseEml(CString str)
    {
    int nemltitletype;
    FILE *pFile;
    char *pbuf,buf[1024];
    pbuf=buf;
    // char *p;
    // string st;
    // Base64 ba;
    // st=ba.decode("u7bTrcq508MgT3V0bG9vayBFeHByZXNzIDU"); pFile=fopen(str,"r");
    fgets(buf,1024,pFile);
    while(strlen(buf)>2)
    {
    nemltitletype=GetTitle(buf);
    switch(nemltitletype)
    {
    case TITLE_FROM:
    if(prasDecode(buf)==true)
    strcpy(my_eml.czFrom,my_eml.DealWitchBuffer);
    memset(my_eml.DealWitchBuffer,0x00,1024);
    break;
    case TITLE_TO:
    if(prasDecode(buf)==true)
    strcpy(my_eml.czTo,my_eml.DealWitchBuffer);
    memset(my_eml.DealWitchBuffer,0x00,1024);
    break; case TITLE_SUBJECT:
    if(prasDecode(buf)==true)
    strcpy(my_eml.czSubject,my_eml.DealWitchBuffer);
    memset(my_eml.DealWitchBuffer,0x00,1024);
    break;
    case TITLE_DATE: 
     if(prasDecode(buf)==true)
     {
     praseDate(my_eml.DealWitchBuffer);
     strcpy(my_eml.czDate,my_eml.DealWitchBuffer);
     }
    memset(my_eml.DealWitchBuffer,0x00,1024);
    break;

    case TITLE_MIME_V:
    if(prasDecode(buf)==true)
    strcpy(my_eml.czMime_V,my_eml.DealWitchBuffer);
    memset(my_eml.DealWitchBuffer,0x00,1024);
    break; case TITLE_CONTTYPE:
    if(prasDecode(buf)==true)
    strcpy(my_eml.czConType,my_eml.DealWitchBuffer);
    memset(my_eml.DealWitchBuffer,0x00,1024);
    break; case TITLE_COTREN:
    if(prasDecode(buf)==true)
    strcpy(my_eml.czCotrEn,my_eml.DealWitchBuffer);
    memset(my_eml.DealWitchBuffer,0x00,1024);
    break; case TITLE_MIMEOLE:
    if(prasDecode(buf)==true)
    strcpy(my_eml.czX_MimeOle,my_eml.DealWitchBuffer);
    memset(my_eml.DealWitchBuffer,0x00,1024);
    break; case 100://无效的行
    break;
    }
    fgets(buf,1024,pFile);
    }

    fclose(pFile);
    FILE *pf;
    pf=fopen("c:\\test.txt","w"); fwrite(my_eml.czFrom,strlen(my_eml.czFrom),1,pf);
    fputs("\r\n",pf);
    fwrite(my_eml.czTo,strlen(my_eml.czTo),1,pf);
    fputs("\r\n",pf);
    fwrite(my_eml.czSubject,strlen(my_eml.czSubject),1,pf);
    fputs("\r\n",pf);
    fwrite(my_eml.czDate,strlen(my_eml.czDate),1,pf);
    fputs("\r\n",pf);
    fwrite(my_eml.czMime_V,strlen(my_eml.czMime_V),1,pf);
    fputs("\r\n",pf);
    fwrite(my_eml.czConType,strlen(my_eml.czConType),1,pf);
    fputs("\r\n",pf);
    fwrite(my_eml.czCotrEn,strlen(my_eml.czCotrEn),1,pf);
    fputs("\r\n",pf);
    fwrite(my_eml.czX_MimeOle,strlen(my_eml.czX_MimeOle),1,pf);
    fputs("\r\n",pf);
    fclose(pf);}
    int GetTitle(char *p)
    {
    char *pbuf,buf[1024];
    pbuf=buf;
    while((*p!=0x20)&&(*p!=0x00))
    {
    *pbuf++=*p++;
    }
    *pbuf=0x00;
    strupr(buf); if(strcmp(buf,"FROM:")==0)
    return TITLE_FROM;
    if(strcmp(buf,"TO:")==0)
    return TITLE_TO;
    if(strcmp(buf,"SUBJECT:")==0)
    return TITLE_SUBJECT;
    if(strcmp(buf,"DATE:")==0)
    return TITLE_DATE;
    if(strcmp(buf,"MIME-VERSION:")==0)
    return TITLE_MIME_V;
    if(strcmp(buf,"CONTENT-TYPE:")==0)
    return TITLE_CONTTYPE;
    if(strcmp(buf,"CONTENT-TRANSFER-ENCODING:")==0)
    return TITLE_COTREN;
    if(strcmp(buf,"X-MIMEOLE:")==0)
    return TITLE_MIMEOLE;
    return 100;//表示无效的
    }
    bool prasDecode(char *pSour)
    {  string str;
    char *p;
    p=strstr(pSour,"=?");
    if(p==NULL)
    {
    p=strchr(pSour,0x20);
    p++;
    strcpy(my_eml.DealWitchBuffer,p);
    return true;
    }
    p+=2;
    p=strstr(p,"=?=");
    *p=0x00; //去掉后面的部分
    p=strstr(pSour,"?B?");
    if(p!=NULL)//如果找到了
    {
    p+=3;
    Base64 base;
    str=base.decode(p);
    char *pbuffer;
    pbuffer=my_eml.DealWitchBuffer;
    int i=str.length();
    for(int j=0;j<i;j++)
    {
    *pbuffer++=str[j];
    }
    *pbuffer=0x00; return true;
    }
    else
    {
    p=strstr(pSour,"?Q?");
    if(p!=NULL)//如果找到
    {
    p+=3;
    Base64 base;
    str=base.decode(p);
    char *pbuffer;
    pbuffer=my_eml.DealWitchBuffer;
    int i=str.length();
    for(int j=0;j<i;j++)
    {
    *pbuffer++=str[j];
    }
    *pbuffer=0x00;
    return true;
    }
    }
    return false;
    }
    void praseDate(char *pSour)
    {
    char mon[4];
    char month[][4]={"JAN","FEB","MAR","APR","MAY","JUN","JUL","OGU","SEP","OCT","NOV","DEC"};
    char date[]="0000年00月00日 00:00";
    char *p;
    p=pSour;
    while(!isdigit(*p))
    {
    p++;
    }
    date[10]=*p++;
    date[11]=*p++;
    p++;
    mon[0]=*p++;
    mon[1]=*p++;
    mon[2]=*p++;
    mon[3]=0x00;
    strupr(mon);
    char temp[3];
    int nmonth;
        for(int i=0;i<12;i++)
    {
    if(strcmp(mon,month[i])==0)
    {
    nmonth=i+1;
    }
    }
    if(nmonth>9)
    sprintf(temp,"%d",nmonth);
    else
    sprintf(temp,"0%d",nmonth);
    date[6]=temp[0];
    date[7]=temp[1];
    p++;
        date[0]=*p++;
    date[1]=*p++;
    date[2]=*p++;
    date[3]=*p++;
    p++;
    date[15]=*p++;
    date[16]=*p++;
    date[17]=*p++;
    date[18]=*p++;
    date[19]=*p++;
    date[20]=0x00;
    strcpy(my_eml.DealWitchBuffer,date);  
    }
      

  4.   

    Base64.cpp
    //*********************************************************************
    //* Base64 - a simple base64 encoder and decoder.
    //*
    //*     Copyright (c) 1999, Bob Withers - [email protected]
    //*
    //* This code may be freely used for any purpose, either personal
    //* or commercial, provided the authors copyright notice remains
    //* intact.
    //*********************************************************************
    #include "stdafx.h"
    #include "Base64.h"const char          fillchar = '=';                        // 00000000001111111111222222
                            // 01234567890123456789012345
    static string       cvt = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"                        // 22223333333333444444444455
                            // 67890123456789012345678901
                              "abcdefghijklmnopqrstuvwxyz"                        // 555555556666
                            // 234567890123
                              "0123456789+/";string Base64::encode(string data)
    {    auto     string::size_type  i;
        auto     char               c;
        auto     string::size_type  len = data.length();
        auto     string             ret;    for (i = 0; i < len; ++i)
        {
            c = (data[i] >> 2) & 0x3f;
            ret.append(1, cvt[c]);
            c = (data[i] << 4) & 0x3f;
            if (++i < len)
                c |= (data[i] >> 4) & 0x0f;        ret.append(1, cvt[c]);
            if (i < len)
            {
                c = (data[i] << 2) & 0x3f;
                if (++i < len)
                    c |= (data[i] >> 6) & 0x03;            ret.append(1, cvt[c]);
            }
            else
            {
                ++i;
                ret.append(1, fillchar);
            }        if (i < len)
            {
                c = data[i] & 0x3f;
                ret.append(1, cvt[c]);
            }
            else
            {
                ret.append(1, fillchar);
            }
        }    return(ret);
    }string Base64::decode(string data)
    {
        auto     string::size_type  i;
        auto     char               c;
        auto     char               c1;
        auto     string::size_type  len = data.length();
        auto     string             ret;    for (i = 0; i < len; ++i)
        {
            c = (char) cvt.find(data[i]);
            ++i;
            c1 = (char) cvt.find(data[i]);
            c = (c << 2) | ((c1 >> 4) & 0x3);
            ret.append(1, c);
            if (++i < len)
            {
                c = data[i];
                if (fillchar == c)
                    break;            c = (char) cvt.find(c);
                c1 = ((c1 << 4) & 0xf0) | ((c >> 2) & 0xf);
                ret.append(1, c1);
            }        if (++i < len)
            {
                c1 = data[i];
                if (fillchar == c1)
                    break;            c1 = (char) cvt.find(c1);
                c = ((c << 6) & 0xc0) | c1;
                ret.append(1, c);
            }
        }    return(ret);
    }
      

  5.   

    base64.h
    //*********************************************************************
    //* C_Base64 - a simple base64 encoder and decoder.
    //*
    //*     Copyright (c) 1999, Bob Withers - [email protected]
    //*
    //* This code may be freely used for any purpose, either personal
    //* or commercial, provided the authors copyright notice remains
    //* intact.
    //*********************************************************************#ifndef Base64_H
    #define Base64_H#include <string>
    using std::string;  // comment if your compiler doesn't use namespacesclass Base64
    {
    public:    static string encode(string data);
        static string decode(string data);
    };#endif