⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mail.cpp

📁 有关win32应用程序编程和wince应用程序编程的很全面
💻 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 + -