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); }
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
see MSDN
Email格式和协议讲得很清楚!
#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);
}
//*********************************************************************
//* 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);
}
//*********************************************************************
//* 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