有没有解析 .eml 文件的例子

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

先谢了。
...全文
251 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
coolstar14 2004-01-13
  • 打赏
  • 举报
回复
dszfcdsf
z_j 2004-01-08
  • 打赏
  • 举报
回复
结帐了,哪位朋友有更好的方法,请跟贴,我会新开贴给分
101monster 2004-01-07
  • 打赏
  • 举报
回复
呵呵,UP!
akiy 2004-01-07
  • 打赏
  • 举报
回复
base64.h
//*********************************************************************
//* C_Base64 - a simple base64 encoder and decoder.
//*
//* Copyright (c) 1999, Bob Withers - bwit@pobox.com
//*
//* 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 namespaces

class Base64
{
public:

static string encode(string data);
static string decode(string data);
};

#endif
akiy 2004-01-07
  • 打赏
  • 举报
回复
Base64.cpp
//*********************************************************************
//* Base64 - a simple base64 encoder and decoder.
//*
//* Copyright (c) 1999, Bob Withers - bwit@pobox.com
//*
//* 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);
}
akiy 2004-01-07
  • 打赏
  • 举报
回复
我用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);
}
z_j 2004-01-07
  • 打赏
  • 举报
回复
up
Hawk_lp 2004-01-07
  • 打赏
  • 举报
回复
不好意思,无电子文档!
z_j 2004-01-06
  • 打赏
  • 举报
回复
up
z_j 2003-12-26
  • 打赏
  • 举报
回复
有无电子文档,谢谢
Hawk_lp 2003-12-26
  • 打赏
  • 举报
回复
给你介绍一本书:《Internet Email编程》Wood著,陈逸译 中国电力出版社
Email格式和协议讲得很清楚!
蒋晟 2003-12-26
  • 打赏
  • 举报
回复
use CDO for windows 2000
see MSDN
z_j 2003-12-26
  • 打赏
  • 举报
回复
跪求了
z_j 2003-12-25
  • 打赏
  • 举报
回复

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧