📄 mail.cpp
字号:
// Mail.cpp: implementation of the CMail class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Mail.h"
#include "Segment.h"
#include "Base64.h"
#include "QP.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CMail::CMail()
{
m_segmentnum = 0;
m_maxsize = 0;
segment_ptr = NULL;
m_mainseg = NULL;
}
CMail::~CMail()
{
if(segment_ptr != NULL)
delete[] segment_ptr;
segment_ptr = NULL;
if(m_mainseg != NULL)
delete m_mainseg;
}
bool CMail::ParseSubject()
{
char* buf = m_Body;
char* p = strstr(buf, "Subject:");
if ( p == NULL )
return false;
p = p + 8;
while(true)
{
if(*p == ' ' || *p == '\r' || *p == '\n')
p++;
else
break;
}
if(CheckParse(p))
return true;
for (int i = 0; i < 128; i++) {
if ( p[i] == '\r' || p[i] == '\n' ) {
this->m_Subject[i] = '\0';
break;
}
this->m_Subject[i] = p[i];
}
this->FormatSubject();
return true;
}
bool CMail::ParseFrom()
{
char* buf = m_Body;
char* p = strstr(buf, "From: ");
if ( p == NULL )
return false;
p = p + 6;
for (int i = 0; i < 128; i++) {
if ( p[i] == '\r' || p[i] == '\n' ) {
this->m_From[i] = '\0';
break;
}
this->m_From[i] = p[i];
}
return true;
}
bool CMail::ParseTo()
{
char* buf = m_Body;
char* p = strstr(buf, "To: ");
if ( p == NULL )
return false;
p = p + 4;
for (int i = 0; i < 128; i++) {
if ( p[i] == '\r' || p[i] == '\n' ) {
this->m_To[i] = '\0';
break;
}
this->m_To[i] = p[i];
}
return true;
}
bool CMail::ParseDate()
{
char* buf = m_Body;
char* p = strstr(buf, "Date: ");
if ( p == NULL )
return false;
p = p + 6;
for (int i = 0; i < 128; i++) {
if ( p[i] == '\r' || p[i] == '\n' ) {
this->m_Date[i] = '\0';
break;
}
this->m_Date[i] = p[i];
}
return true;
}
bool CMail::ParseContentType()
{
char* buf = m_Body;
char* p = strstr(buf, "Content-Type: ");
if ( p == NULL )
return false;
p = p + 14;
for (int i = 0; i < 128; i++) {
if ( p[i] == '\r' || p[i] == '\n' || p[i] == ';') {
this->m_ContentType[i] = '\0';
break;
}
this->m_ContentType[i] = p[i];
}
return true;
}
bool CMail::ParseBoundary()
{
char* buf = m_Body;
char* p = strstr(buf, "boundary");
if ( p == NULL )
return false;
p = p + 10;
for (int i = 0; i < 128; i++) {
if ( p[i] == '\r' || p[i] == '\n' || p[i] == '"' ) {
this->m_Boundary[i] = '\0';
break;
}
this->m_Boundary[i] = p[i];
}
return true;
}
void CMail::Parse(Segment* segment)
{
/////////pass segment header
segment->ParseContentType();
segment->ParseContent();
char* content_type = segment->m_ContentType;
if(strncmp(content_type,"Multipart",9) == 0 || strncmp(content_type,"multipart",9) == 0)
{
segment->ParseBoundary();
segment->ParseEnd();
segment->ParseSegmentAccount();
segment->ParseSubSegmentStart();
segment->ParseSubSegment();
for(int i = 0;i < segment->m_subsegmentsaccount;i++)
{
Parse(segment->subsegment_ptr[i]);
}
}
else
{
segment->ParseTransferEncode();
AddSegment(segment);
}
}
bool CMail::ParseEnd()
{
char* p = strstr(m_Body,"\r\n.\r\n");
if(p == NULL)
{
return false;
}
else
{
*p = '\0';
return true;
}
return true;
}
bool CMail::AddSegment(Segment* segment)
{
if(m_segmentnum == 0)
{
m_maxsize = 1;
m_segmentnum = 1;
segment_ptr = new Segment*[m_maxsize];
segment_ptr[m_segmentnum - 1] = segment;
return true;
}
m_segmentnum++;
if(m_segmentnum > m_maxsize)
{
m_maxsize = m_maxsize * 2;
Segment** temp_ptr = new Segment*[m_maxsize];
for(int i = 0;i<(m_segmentnum - 1);i++)
{
temp_ptr[i] = segment_ptr[i];
}
delete []segment_ptr;
segment_ptr = temp_ptr;
temp_ptr = NULL;
}
segment_ptr[m_segmentnum - 1] = segment;
return true;
}
BOOL CMail::GetMailDate(SYSTEMTIME &date)
{
const char* Weeks[7] = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
const char* Months[12] = {"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
char* current = m_Date;
char* next = m_Date;
char DayOfWeek[4]; DayOfWeek[3] = '\0';
char Day[3]; Day[2] = '\0';
char Year[5]; Year[4] = '\0';
char Month[4]; Month[3] = '\0';
char Hour[3]; Hour[2] = '\0';
char Minute[3]; Minute[2] = '\0';
char Second[3]; Second[2] = '\0';
int wDayOfWeek;
int wDay;
int wYear;
int wMonth;
int wHour;
int wMinute;
int wSecond;
strncpy(DayOfWeek,current,3);
for(int i = 0;i<7;i++)
{
if(strncmp(DayOfWeek,Weeks[i],3) == 0)
{
wDayOfWeek = i;
break;
}
}
current = current + 3;
if(*current == ',')
current++;
if(*current == ' ')
current++;
wDay = atoi(current);
current = strstr(current," ") + 1;
strncpy(Month,current,3);
for(i = 0;i<12;i++)
{
if(!strncmp(Month,Months[i],3))
{
wMonth = i+1;
break;
}
}
current = strstr(current," ") + 1;
strncpy(Year,current,4);
wYear = atoi(Year);
current = strstr(current," ") + 1;
char daytime[8];
strncpy(daytime,current,8);
strncpy(Hour,daytime,2);
wHour = atoi(Hour);
strncpy(Minute,daytime+3,2);
wMinute = atoi(Minute);
strncpy(Second,daytime+6,2);
wSecond = atoi(Second);
date.wYear = wYear;
date.wMonth = wMonth;
date.wDayOfWeek =wDayOfWeek;
date.wDay = wDay;
date.wHour = wHour;
date.wMinute = wMinute;
date.wSecond = wSecond;
return true;
}
bool CMail::ParseMailHead()
{
if(!this->ParseFrom())
return false;
if(!this->ParseTo())
return false;
if(!this->ParseDate())
{
GetLocalTime(&m_date);
}else
{
this->GetMailDate(m_date);
}
this->FormatMailAddress();
if(!this->ParseSubject())
return false;
return true;
}
BOOL CMail::FormatSubject()
{
if(strstr(m_Subject,"gb2312") != NULL || strstr(m_Subject,"GB2312") != NULL)
{
char* subject_start = NULL;
if(strstr(m_Subject,"gb2312") != NULL)
subject_start = strstr(m_Subject,"gb2312") + 9;
else if(strstr(m_Subject,"GB2312") != NULL)
subject_start = strstr(m_Subject,"GB2312") + 9;
char* subject_end = strstr(subject_start,"?=");
char transfer = *(subject_start - 2);
*subject_end = '\0';
strcpy(m_Subject,subject_start);
if(transfer == 'b' || transfer == 'B')
{
Base64 base64;
base64.DeCode(this->m_Subject);
base64.GetRes(this->m_Subject,strlen(this->m_Subject));
}
if(transfer == 'q' || transfer == 'Q')
{
QP qp;
qp.QPDeCode(this->m_Subject);
qp.GetRes(this->m_Subject,strlen(this->m_Subject));
}
}
return TRUE;
}
BOOL CMail::FormatMailAddress()
{
char* start = strstr(m_From,"<");
if(start != NULL)
{
char* middle = strstr(start,"@");
if(middle != NULL)
{
char* end = strstr(start,">");
if(end != NULL)
{
*end = '\0';
strcpy(m_From , start + 1);
}
}
}
start = strstr(m_To,"<");
if(start != NULL)
{
char* middle = strstr(start,"@");
if(middle != NULL)
{
char* end = strstr(start,">");
if(end != NULL)
{
*end = '\0';
strcpy(m_To ,start + 1);
}
}
}
return TRUE;
}
BOOL CMail::GetTextPlain()
{
m_textplain[0] = 0;
for(int i = 0;i< m_segmentnum;i++)
{
Segment* segment = segment_ptr[i];
char* content_type = segment->m_ContentType;
if(strncmp(content_type,"text/plain",10) == 0 || strncmp(content_type,"TEXT/PLAIN",10) == 0 ||strncmp(content_type,"Text/Plain",10) == 0 )
{
if(strcmp(segment->m_ContentTransferEncoding,"base64") == 0||strcmp(segment->m_ContentTransferEncoding,"BASE64") == 0||strcmp(segment->m_ContentTransferEncoding,"Base64") == 0)
{
char* buf = (char*)LocalAlloc (LPTR, 4 * 1024);
if (!buf) {
MessageBox (NULL, TEXT ("Not enough memory"),
TEXT ("Error"), MB_OK|MB_ICONERROR);
}
char* linestart = segment->m_Content;
char* lineend = NULL;
int ilen = 0;
while(true)
{
lineend = strstr(linestart,"\r\n");
if(lineend != NULL)
{
ilen = lineend - linestart;
strncat(buf,linestart,ilen);
linestart = strstr(linestart,"\r\n") + 2;
if(linestart == NULL)
break;
}
else
{
strcat(buf,linestart);
break;
}
}
Base64 base64;
base64.DeCode(buf);
base64.GetRes(buf,strlen(buf));
strcat(m_textplain,buf);
LocalFree(buf);
}
else
{
int l = strlen(segment->m_Content);
int p = strlen(m_textplain);
strcat(m_textplain,segment->m_Content);
}
}
}
return TRUE;
}
BOOL CMail::CheckParse(char *p)
{
if(strncmp(p,"Content-Type:",13) == 0)
return TRUE;
if(strncmp(p,"From:",5) == 0)
return TRUE;
if(strncmp(p,"To:",3) == 0)
return TRUE;
if(strncmp(p,"Date:",5) == 0)
return TRUE;
if(strncmp(p,"X-Priority:",11) == 0)
return TRUE;
if(strncmp(p,"X-Originating-IP:",17) == 0)
return TRUE;
if(strncmp(p,"X-Mailer:",9) == 0)
return TRUE;
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -