天天看点

smtp 邮件服务器编程

鍒氬紑濮嬪仛閭欢鏈嶅姟鍣ㄥ紑鍙戯紝涓€鍒囬兘鏄尗鐒剁殑銆傚湪涔︿笂缃戜笂閮藉緢闅炬壘鍒颁竴濂楀畬鏁寸殑閭欢鏈嶅姟鍣ㄥ紑鍙戞暀绋嬨€傚湪涓汉鐨勬懜绱腑纰板埌浜嗗緢澶氳泲鐤煎緱闂銆傜幇缁堜簬瀹屾垚浜嗭紝灏嗘垜鐨勫紑鍙戠粡楠屽垎浜粰澶у銆?

寮€鍙戠幆澧冿細vs2012 mfc

娉ㄦ剰浜嬮」锛?

1銆伮犵綉缁滅幆澧冿細

浣滀负閭欢鏈嶅姟鍣紝瑕佹帴鏀舵潵鑷簰鑱旂綉鐨勯偖浠讹紝灏卞緱鏈夎兘鏄犲皠鍒板缃戠殑鏈嶅姟鍣ㄣ€傝嚦灏戞槧灏?5锛圫MTP锛夌鍙o紙pop3閮芥殏鏃朵笉閲嶈锛夈€傚浜庢病鏈夊缃戞潯浠剁殑鐨勫皬浼欎即锛屾帹鑽愪互涓嬪嚑绉嶆柟娉曡皟璇曪細

A銆佸鏋滀綘浣跨敤model涓婄綉锛屾煡鐪嬩綘鐨勭數鑴戠殑澶栫綉IP銆傜湅鐪嬫槸鍚﹀拰model鐨勪竴鑷淬€備竴鑷村垯璇存槑浣犳湁涓€涓叕缃慖P銆傚鏋滄病鏈夛紝灏辫嚧鐢电綉缁滆繍钀ュ晢锛屽彨浠栫粰浣犳崲鍥炲叕缃慖P锛岃姘斾竴瀹氳寮虹‖銆傛湁浜嗗叕缃慖P锛屼綘灏辫兘鎶妔mtp鐨勭鍙f槧灏勫嚭鍘汇€傚叿浣撴柟娉曡鎼滅储銆?

B銆佸浜庝竴浜涙牎鍥綉鎴栧ぇ鍨嬪眬鍩熺綉鐨勭敤鎴凤紝閭e氨鏈夌偣鎮插墽浜嗭紝鍩烘湰鏃犳硶鐩存帴灏嗙鍙f槧灏勫嚭鍘汇€備絾鍙互鍙傝€僀鏂规硶銆?

C銆佸厛鍦ㄧ殑缃戜笂鐨勭綉缁滅┛閫忛兘鍋氱殑姣旇緝濂斤紝鐢氳嚦鑳藉缇庡叕缃慽p鐨勭洿鎺ユ槧灏勩€傚幓缃戜笂涓嬭浇涓€浜涚┛閫忚蒋浠讹細鑺辩敓澹充箣绫荤殑銆傞兘鏈夋彁渚涘唴缃戠┛閫忋€傜粰澶у鎺ㄨ崘涓厤璐圭殑缃戠粶绌块€忚蒋浠讹細nat123 銆傝繖杞欢寰堝ソ鏈夛紝up涓讳笉缁忔剰鐨勫彂鐜版湁澶ч噺鐨勫皬瀛︾敓鐢ㄥ畠鍦ㄥ紑MC鐨勬湇鍔″櫒銆?

D銆佸鏋滀綘鏆備笉闇€瑕佷娇鐢ㄥ閮ㄧ殑閭欢鏈嶅姟鍣ㄦ潵娴嬭瘯浣犵殑鏈嶅姟鍣紝閭e氨鍦ㄥ唴缃戠敤鍏朵粬鐨勯偖浠舵湇鍔″櫒鍙戦€佽嚦浣犵殑閭杩涜娴嬭瘯锛岃娉ㄦ剰绔彛鍐茬獊銆?

2銆伮犵紪鍐檚mtp閭欢鏈嶅姟鍣細

瀵逛簬鎷ユ湁澶栫綉鏄犲皠鐨勶紝鍙互鍏堢紪鍐檚mtp 鐨勬帴鏀舵湇鍔″櫒銆傝繖鏍风殑濂藉鏄紝鑳芥帴鏀惰瘑鍒畠鍩熺殑涓嶅悓绫诲瀷鏍煎紡鐨勯偖浠讹紝鍒拌嚜宸卞彂閫侀偖浠剁殑鏃跺€欙紝瀵归偖浠舵牸寮忚兘鏈変竴涓緢濂界殑缁勭粐銆?鑰屽浜庡彧鑳戒娇鐢ㄥ唴缃戠殑鐢ㄦ埛锛屽缓璁厛缂栧啓鍙戦€佺銆傛垚鍔熻繘琛屽鍚勪釜閭欢鏈嶅姟鍣ㄧ殑鍙戦€佸悗锛堣繖閲屾瘮杈冭泲鐤硷紝鍚庨潰浼氫粙缁嶅埌锛夛紝灏卞彲浠ュ湪缂栧啓閭欢鎺ユ敹绔殑鏃跺€欑敤鏉ユ祴璇曘€?

3銆伮犻偖浠舵湇鍔″櫒鍩熷悕锛圡X锛夌殑鑾峰彇锛?

鏈€寮€濮嬬敤telnet娴嬭瘯163鐨剆mtp銆傜綉涓婃悳绱㈠悇澶ч偖浠舵湇鍔″櫒鐨剆tmp鏈嶅姟鍣紝褰撳垵鎼滅储鍑烘潵鐨勭粨鏋滄妸鎴戠潃瀹炶瀵间簡濂戒竴闃靛瓙銆備妇涓緥瀛愭妸锛屽氨甯哥敤鐨勪紒楣呴偖绠憋紝鎼滅储鍑烘潵鐨勭粨鏋滄槸锛歴mtp.qq.com 聽25 銆?

smtp 邮件服务器编程

浜庢槸鍌诲偦鍦皌elnet涓婂幓helo浠栵紝浠栧憡璇夋垜浠栨槸ehlo鏈嶅姟鍣紝瑕佺櫥闄嗛獙璇侀亣鍒拌繖绉嶉棶棰樼湡鏄兂鍝紝鎴戜竴涓彂閭欢鐨勬垜缁欎綘鐧婚檰浠€涔堝晩锛屽叾浠杝mtp.jbjb.com閭涔熸槸杩欐牱锛熶笌鏄兂浜嗗悇绉嶅钁╃殑鎯呭喌涓庢柟娉曟氮璐逛簡寰堝鏃堕棿銆傛渶鍚庤嚜宸卞幓鎶撲簡涓€涓偖浠舵湇鍔″櫒鐨勫悜浼侀箙閭鍙戦€佺殑鍖咃紝棣栧厛鏄嚑涓猟ns鐨勫寘銆傜湅鍒版湁鍑犱釜dns鍖咃紝鑷繁蹇冪悊椤挎椂鎯冲埌浜唖mtp鍓嶇紑鐨勫煙鍚嶄笉鏄帴鏀跺鍩熼偖浠剁殑鍩熷悕锛岀湅浜嗕笅dns鍒扮殑鍦板潃锛歮x1.qq.com mx2.qq.com... 鍘熸潵杩欐墠鏄帴鏀堕偖浠剁殑鏈嶅姟鍣ㄥ煙鍚嶃€傝繖鏃跺€欐墠鏄庣櫧鑷繁浠ュ墠鎸傜殑鍩熷悕鏃朵篃閰嶇疆鏈塎X鍦板潃銆?鎬讳箣锛屾垜浠彂閭欢涓€瀹氳鍏堣幏鍙栭偖浠舵帴鏀舵湇鍔″櫒鐨勫煙鍚嶃€?

4銆伮犻槻姝㈠弽鍨冨溇閭欢锛?

鎶婇偖浠跺彂寰€鍏朵粬閭欢鏈嶅姟鍣紝寰堝鏄撹璇嗗埆涓哄瀮鍦炬枃浠躲€傛柊娴偖绠辨渶璁ㄥ帉锛岀洿鎺ヤ笉淇′换鎴戠殑鍩熷悕鍜孖P鍦板潃銆傛渶鍒濋偖浠舵牸寮忎笉瀹屽杽锛屼篃琚紒楣呮柇鏂画缁皝浜嗗嚑澶┿€傚氨163鏈€鍖呭锛屾垜鐨勯偖浠堕兘鎱锋叏鍦版帴鏀朵簡銆?

鐜板湪鍙戦偖浠讹紝闄や簡鍩烘湰鐨勬牸寮忥紝涓嶇敤MINE鏍规湰涓嶈锛屽挨鍏舵槸褰撻渶瑕佸浘鐗囨垨鑰呴檮浠剁殑閭欢銆?

5銆伮犲姞瀵嗭細

涓€鑸彲鐢╞ase64瀵归偖浠舵爣棰樺拰鍐呭杩涜鍔犲瘑銆?

6銆伮犻偖浠跺瓨鍌細

寤鸿鍌ㄥ瓨涓篹ml鏍煎紡鐨勯偖浠舵枃浠讹紝涓嶄粎鍒╀簬杞彂鎴栧叾浠栧簲鐢ㄦ煡鐪嬶紝涔熶究浜庝箣鍚庣殑pop3鏈嶅姟鍣ㄤ娇鐢ㄣ€?

7銆伮爓eb绔痗ms

瓒呴夯鐑︾殑涓滆タ锛屾壘涓ā鏉挎敼鏀瑰惂銆?

鍏堢矖鐣ヨ璁睸MTP鍗忚鍙戦€侀偖浠剁殑杩囩▼锛?

鐩存帴涓句釜渚嬪瓙锛?

R: 220 mx.jb.com MX JB Mail Sever

S: helo wchrt.vicp.cc

R: 250 OK

S: mail from: <[email聽protected]>

R: 250 OK

S: rcpt to: <[email聽protected]>

R: 250 OK

S: data

R: 354 End data with<CR><LF>.<CR><LF>

S: mail from: [email聽protected]

S: rcpt to: [email聽protected]

S: subject: 浣犲ソ

S: 绾︿笉绾︼紵

S: <CR><LF>.<CR><LF>

R: 250 OK in queue

S: QUIT

R: 221 close

璇ユ瀵硅瘽涓鍏堟垜浠摼鎺ユ湇鍔″櫒鍚庢湇鍔″櫒缁欐垜浠繑鍥炰簡220 鍜屾湇鍔″櫒鐨勫煙鍚嶄俊鎭紝琛ㄧず璇ラ偖浠舵湇鍔″櫒姝e父宸ヤ綔锛屽彲浠ユ彁渚涙湇鍔°€?

鐒跺悗鎴戜滑鍙戦€乭elo杩囧幓鏍囩ず鑷繁鏈嶅姟鍣ㄧ殑鍩熷悕銆?

鏈嶅姟鏀跺埌鍚?50璇存槑鍜宧elo鎴愬姛

涔嬪悗鏄痬ailfrom 璇存槑鍙戜欢浜虹殑email鍦板潃

250 ok鍚庡啀rcptto 璇存槑鍙戦€佺洰鏍囩殑Email鍦板潃

鎴愬姛鍚庯紝灏卞彲浠ュ彂閫乨ata鍛戒护鍙戦€侀偖浠跺唴瀹逛簡銆?

Data杩斿洖鐨勫€艰鏄庨偖浠朵互<CR><LF>.<CR><LF>涓虹粨鏉熸爣璁般€?lt;CR><LF>杩欎釜鏍囩ず绗︾敤鎹㈣绗r\n鍗冲彲銆?

鏈€鍚庤繑鍥?50 鏍囩ず閭欢鎺ユ敹鎴愬姛銆俀UIT閫€鍑恒€?

浠ヤ笅鏄湇鍔″櫒杩斿洖鐨勪竴浜涚紪鍙凤細

501 鍙傛暟鏍煎紡閿欒

502 鍛戒护涓嶅彲瀹炵幇

503閿欒鐨勫懡浠ゅ簭鍒?

504 鍛戒护鍙傛暟涓嶅彲瀹炵幇

211绯荤粺鐘舵€佹垨绯荤粺甯姪鍝嶅簲

214甯姪淇℃伅

220 <domain>鏈嶅姟灏辩华

221 <domain>鏈嶅姟鍏抽棴浼犺緭淇¢亾

421 <domain>鏈嶅姟鏈氨缁紝鍏抽棴浼犺緭淇¢亾锛堝綋蹇呴』鍏抽棴鏃讹紝姝ゅ簲绛斿彲浠ヤ綔涓哄浠讳綍鍛戒护鐨勫搷搴旓級

250瑕佹眰鐨勯偖浠舵搷浣滃畬鎴?

251鐢ㄦ埛闈炴湰鍦帮紝灏嗚浆鍙戝悜<forward-path>聽

450瑕佹眰鐨勯偖浠舵搷浣滄湭瀹屾垚锛岄偖绠变笉鍙敤锛堜緥濡傦紝閭蹇欙級

550瑕佹眰鐨勯偖浠舵搷浣滄湭瀹屾垚锛岄偖绠变笉鍙敤锛堜緥濡傦紝閭鏈壘鍒帮紝鎴栦笉鍙闂級

451鏀惧純瑕佹眰鐨勬搷浣滐紱澶勭悊杩囩▼涓嚭閿?

551鐢ㄦ埛闈炴湰鍦帮紝璇峰皾璇?lt;forward-path>聽

452 绯荤粺瀛樺偍涓嶈冻锛岃姹傜殑鎿嶄綔鏈墽琛?

552 杩囬噺鐨勫瓨鍌ㄥ垎閰嶏紝瑕佹眰鐨勬搷浣滄湭鎵ц

553 閭鍚嶄笉鍙敤锛岃姹傜殑鎿嶄綔鏈墽琛岋紙渚嬪閭鏍煎紡閿欒锛?

354 寮€濮嬮偖浠惰緭鍏ワ紝浠?lt;CRLF>.<CRLF>缁撴潫

554 鎿嶄綔澶辫触

鍏蜂綋鐨勫唴瀹硅鑷鎼滅储smtp鍗忚

澶ц嚧娓呮鍗忚鍚庡氨鍙互寮€濮嬮偖浠舵帴鏀剁鐨勭紪绋嬶紝鍗忚鐨勭粏鑺傜殑鍦ㄨ皟璇曡繃鎴愬姛浼氭參鎱㈡竻妤氱殑銆?

鏈嶅姟鍣ㄦ帴鏀剁浠g爜锛?

UINT mailsever::listenthread(LPVOID Param)
{
	int ret;
	SOCKET listensock;//鎺ユ敹閭欢璇锋眰鐨勫鎺ュ瓧
	listensock=socket(AF_INET,SOCK_STREAM,0);
	TRACE("listensock: %d\n",listensock);

	sockaddr_in saddr;
	saddr.sin_family=AF_INET;
	saddr.sin_port=htons(25);//25 smtp绔彛
	saddr.sin_addr.S_un.S_addr=INADDR_ANY;

	ret=bind(listensock,(sockaddr *)&saddr,sizeof(sockaddr_in));

	ret=listen(listensock,20);//涓€涓皬鏈嶅姟鍣紝鏆傛椂灏卞彧璁剧疆20鐨勯摼鎺ヤ笂闄?
	that->isseverstart=true;
	CString str;
	that->GetDlgItemTextA(IDC_LOG,str);
	str+="鏀朵俊鏈嶅姟寮€鍚痋r\n";;
	that->SetDlgItemTextA(IDC_LOG,str);

	sockaddr_in newaddr;
	int newlen;
	while(1)
	{
		SOCKET newsock=accept(listensock,(sockaddr *)&newaddr,&newlen);//鑾峰彇鍒版柊閭欢璇锋眰鐨勫鎺ュ瓧
		if(newsock!=SOCKET_ERROR)
		{
			AfxBeginThread(dealthread,&newsock);//寮€鍚柊绾跨▼鎺ユ敹閭欢
		}
	}
	that->isseverstart=false;
	return 0;
}

static bool strcom(const char *s1,const char *s2)
{
	int len=strlen(s2);
	if(strlen(s1)<len)
	{
		return false;
	}
	int py=0;
	for(int i=0;i<len;i++)
	{
		if(s1[i]>='A'&&s1[i]<='Z')
		{
			py=32;
		}
		else
		{
			py=0;
		}
		if(s1[i]+py!=s2[i])
		{
			return false;
		}
	}

	return true;
}

static bool isdataend(const char *ss)
{
	int len=strlen(ss);
	for(int i=0;i<len-2;i++)
	{
		if(ss[i]=='\n'&&ss[i+1]=='.'&&ss[i+2]=='\r')
		{
			return true;
		}
	}
	return false;
}



UINT mailsever::dealthread(LPVOID Param)//閭欢鎺ユ敹绾跨▼
{

	SOCKET sock=*(SOCKET *)Param;
	CString sdata;
	char rdata[2048];
	int rlen;
	
	sdata.Format("220 wchrt.vicp.cc smtp WC Mail Server\r\n");
	send(sock,LPCTSTR(sdata),sdata.GetLength(),0);//鍥炵瓟鏈湇鍔″櫒鐘舵€?
	maildata rmail;//鍌ㄥ瓨閭欢鐨刴aildata绫?
	bool ishelo=false;
	bool ismail=false;
	bool isrcpt=false;
	bool isdata=false;
	bool isenddata=false;
	bool istitle=false;
	bool isend=false;
	while(!isend)
	{
		rlen=recv(sock,rdata,2047,0);
		if(rlen==0&&isenddata)
		{
			break;
		}
		if(rlen>2048||rlen<0)
		{
			continue;
		}
		rdata[rlen]='\0';
		CString str;
		CString ss;

		
		if(strcom(rdata,"helo")||strcom(rdata,"ehlo"))//澶勭悊helo璇锋眰
		{
			sdata.Format("250-wchrt.vicp.cc\r\n250 OK\r\n");
			ishelo=true;
		}
		else if(strcom(rdata,"mail from"))//澶勭悊閭欢鏉ユ簮淇℃伅
		{
			int i=0;
			while(i<rlen&&rdata[i]!=':')
			{
				i++;
			}
			if(i<rlen)
			{
				rmail.from.Format("%s",rdata+i);
			}
			ismail=true;
			sdata.Format("250 OK\r\n");
		}
		else if(strcom(rdata,"rcpt to"))//澶勭悊閭欢鐩殑鍦颁俊鎭紙鏈湴鏆傛湭鎸夐偖浠剁敤鎴峰尯鍒嗭紝缁熶竴鎺ユ敹鍦ㄤ竴璧凤級
		{
			int i=0;
			while(i<rlen&&rdata[i]!=':')
			{
				i++;
			}
			if(i<rlen)
			{
				rmail.to.Format("%s",rdata+i);
			}
			isrcpt=true;
			sdata.Format("250 OK\r\n");
		}
		else if(strcom(rdata,"data"))//澶勭悊data璇锋眰
		{
			if(!ismail||!isrcpt)
			{
				sdata.Format("503 is not mail or rcpt\r\n");
			}
			else
			{
				sdata.Format("354 end with <CRLF>.<CRLF>\r\n");
				isdata=true;
			}
		}
		else if(strcom(rdata,"quit"))//澶勭悊閫€鍑烘湇鍔¤姹?		{
			isend=true;
			break;
		}
		else
		{
			if(isdata)//鎺ユ敹閭欢鍐呭
			{
				rmail.alldata+=rdata;
				if(isdataend(rdata))
				{
					rmail.alldata.Replace("\r\n.\r\n","\r\n");
					isdata=false;
					sdata.Format("250 OK\r\n");
					isenddata=true;
				}
				else
				{
					continue;
				}
			}
			else
			{
				sdata.Format("250 OK\r\n");
			}
		}
		send(sock,(LPCTSTR)sdata,sdata.GetLength(),0);//杩斿洖搴旂瓟
	}

	// 寮€濮嬪鐞嗗苟鍌ㄥ瓨鎺ユ敹鍒扮殑閭欢锛屽鐞嗚繃绋嬭瑙乵aildata.cpp
	//maildata::getmailinfo(rmail);
	CString mid;
	mid.Format("%d",that->mailid+1);
	if(maildata::saveeml("all",mid,rmail))
	{
		that->mailid++;
		that->mailnum++;
		CFile file;
		if(!file.Open("mail\\info",CFile::modeReadWrite))
		{
			if(!file.Open("mail\\info",CFile::modeCreate|CFile::modeReadWrite))
			{
				AfxMessageBox("makeinfo error");
				return false;
			}
		}
		CString str;
		str.Format("%d\r\n%d",that->mailid,that->mailnum);
		file.Write(str.GetString(),str.GetLength());
		file.Close();

		that->GetDlgItemTextA(IDC_LOG,str);
		str+="new mail\r\n";
		that->SetDlgItemTextA(IDC_LOG,str);
	}
	return 0;
}
           

閭欢鍙戦€佺锛?

涓句釜渚嬪瓙锛屾垜浠寰€閭锛歔email聽protected] 鍙戦€佷竴涓偖浠躲€傚簲閬靛惊浠ヤ笅姝ラ锛?

1銆佹彁鍙栧嚭鍩熷悕鍚庣紑锛歲q.com銆?

2銆丏NS鏌ヨ璇ュ煙鍚嶇殑MX璁板綍銆?

3銆佹牴鎹煡璇㈠埌鐨凪X鍩熷悕鎴朓P鍦板潃閾炬帴璇ラ偖浠舵湇鍔″櫒

4銆佷娇鐢╯mtp鍗忚鍙戦€侀偖浠?

鍥犱负瑕佽繘琛孌NS鏌ヨ锛宮fc娌℃湁鎻愪緵鍏充簬dns鏌ヨ鐨勭被銆傚彧濂借嚜宸辨墜鍔ㄩ摼鎺ns鏈嶅姟鍣ㄦ牴鎹甦ns鍗忚鏌ヨmx璁板綍銆傛垨鑰呮槸璋冪敤windows鑷甫鐨刵slookup鏉ユ煡璇ns銆?

涓轰簡闃叉澶у涓€浜涙帴瑙﹀お澶氫笢瑗匡紝杩欓噷灏辩粰澶у璁蹭竴涓嬬畝鍗曞疄鐢╪slookup鏌ヨmx璁板綍鐨勬柟娉曘€傜瓑鏈夌簿鍔涘啀鍘诲涔燿ns鍗忚銆?

cmd杈撳叆锛歯slookup

灏嗘煡璇㈣缃负mx锛歴et q=mx

寮€濮嬫煡璇細qq.com

瑙佹埅鍥撅細

smtp 邮件服务器编程

涓烘柟渚胯捣瑙侊紝鎴戜滑灏变笉鍋氭湇鍔″櫒鐨勮繛閫氭祴璇曪紝鐩存帴浣跨敤绗竴涓狹X鍦板潃鍙戦€侀偖浠躲€?

浠ヤ笅鏄彂閫侀偖浠剁殑浠g爜锛?

static bool getres(SOCKET sock,const char *s,const char *s2=NULL)
{
	char *rdata=new char [2048];
	int rlen;
	CString rr,str;

	rlen=recv(sock,rdata,2047,0);
	rdata[rlen]='\0';
	
	rr.Format("%s",rdata);
	that->GetDlgItemTextA(IDC_LOG,str);
	str+=rr+"\r\n";;
	that->SetDlgItemTextA(IDC_LOG,str);
	
	/*TRACE("%s\n",rdata);
	CString ss=rdata;
	AfxMessageBox(ss);*/

	if(!strcom(rdata,s))
	{
		if(s2!=NULL)
		{
			if(!strcom(rdata,s2))
			{
				return false;
			}
		}
		else
		{
			return false;
		}
	}
	return true;
}
UINT mailsever::sendthread(LPVOID Param)
{
	CString mpath;
	mpath.Format("%s",Param);
	//AfxMessageBox(mpath);
	CFile file;
	if(!file.Open(mpath,CFile::modeRead))
	{
		return -1;
	}

	maildata rmail;
	char s[20480];
	memset(s,'\0',sizeof(s));
	file.Read(s,min(file.GetLength(),20470));
	rmail.alldata.Format(s);

	maildata::getmailinfo(rmail);

	rmail.gettoaddress();

	//AfxMessageBox(rmail.toaddress);
	
	
	//dns鑾峰彇鍩熷悕mx璁板綍
	char *szDomainName= (char *)rmail.toaddress.GetString();
    std::vector<ULONG> veculIPList;
    std::vector<std::string> vecstrIPList;
    std::vector<std::string> vecMXList;
    ULONG ulTimeSpent = 0;
    CDNSLookup dnslookup;
	//浣跨敤114.114.114.144 dns鏈嶅姟
    BOOL bRet = dnslookup.DNSLookup(inet_addr("114.114.114.114"), szDomainName, &vecstrIPList, &vecMXList, 1000, &ulTimeSpent);
	if(!bRet)
	{
		return -1;
	}
	vecMXList[0].c_str();
	CString ss;
	ss.Format("%s",vecMXList[0].c_str());//鑾峰彇绗竴鏉¤褰?	
	//AfxMessageBox(ss);

	SOCKET sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
	sockaddr_in saddr;
	saddr.sin_family =AF_INET;
	saddr.sin_port=htons(25);
	saddr.sin_addr.S_un.S_addr=*(u_long *)gethostbyname(vecMXList[0].c_str())->h_addr_list[0];

	/*CString sd=inet_ntoa(saddr.sin_addr);

	AfxMessageBox(sd);*/

	if(SOCKET_ERROR==connect(sock,(sockaddr*)&saddr,sizeof(saddr)))
	{
		return -1;
	}

	

	CString sdata;
	

	if(!getres(sock,"220"))
	{
		return -1;
	}


	sdata.Format("HELO wchrt.vicp.cc\r\n");
	send(sock,sdata.GetString(),sdata.GetLength(),0);
	if(!getres(sock,"250"))
	{
		return -1;
	}


	sdata.Format("MAIL FROM: <%s>\r\n",rmail.from.GetString());
	send(sock,sdata.GetString(),sdata.GetLength(),0);
	if(!getres(sock,"250"))
	{
		return -1;
	}


	sdata.Format("RCPT TO: <%s>\r\n",rmail.to.GetString());
	send(sock,sdata.GetString(),sdata.GetLength(),0);
	if(!getres(sock,"250"))
	{
		return -1;
	}



	sdata.Format("DATA\r\n");
	send(sock,sdata.GetString(),sdata.GetLength(),0);
	if(!getres(sock,"2","3"))
	{
		return -1;
	}

	
	sdata=rmail.alldata;

	


	for(int i=0;i<sdata.GetLength();i+=1024)
	{
		/*TRACE("%d %d \n",i,sdata.GetLength());
		char bb[1025];
		int  j;
		for(j=0;j<min(strlen(sdata.GetString()+i),1024);j++)
		{
			bb[j]=(sdata.GetString()+i)[j];
		}bb[j]='\0';
		TRACE("%s",bb);
		CString ss=bb;
		AfxMessageBox(ss);*/

		send(sock,sdata.GetString()+i,min(strlen(sdata.GetString()+i),1024),0);
	}
	sdata.Format("\r\n\r\n.\r\n");
	send(sock,sdata.GetString(),sdata.GetLength(),0);
	if(!getres(sock,"2"))
	{
		return -1;
	}


	sdata.Format("QUIT\r\n");
	send(sock,sdata.GetString(),sdata.GetLength(),0);
	if(!getres(sock,"2"))
	{
		return -1;
	}
	AfxMessageBox("ok");
}
           

maildata绫伙細

maildata.h

#pragma once
#define MAIL_TYPE_RECV           1
#define MAIL_TYPE_SEND           2
#define MAIL_TYPE_USEND          3

class maildata:public CObject
{
public:
	maildata(void);
	
	~maildata(void);

	USHORT type;
	CString alldata;

	CString date;
	CString from;
	CString to;
	CString subject;
	CString content;
	CString contenttype;

	CString toaddress;

	//void operator = (const maildata &);
	void Serialize(CArchive &);
	DECLARE_SERIAL(maildata);


	static void getmailbaseinfo(maildata &);
	static void getmailinfo(maildata &);
	static bool setmailforsend(maildata &);

	static bool openeml(const CString,const CString,maildata &);
	static bool saveeml(const CString,const CString,maildata &);
	bool gettoaddress();
};

           
maildata.cpp

#include "stdafx.h"
#include "maildata.h"

#include "include/atlrx.h"
#include "base64.h"

IMPLEMENT_SERIAL(maildata,CObject,VERSIONABLE_SCHEMA|2);
#ifdef _DEBUG
#define new DEBUG_NEW
#endif

maildata::maildata(void)
{
}


maildata::~maildata(void)
{
}


/*void maildata::operator = (const maildata &m)
{
}*/


void maildata::Serialize(CArchive &ar)
{
	if(ar.IsStoring())
	{
		ar<<alldata;
	}
	else if(ar.IsLoading())
	{
		ar>>alldata;
	}
}


static bool strcom(const char *s1,const char *s2)
{
	int len=strlen(s2);
	if(strlen(s1)<len)
	{
		return false;
	}
	int py=0;
	for(int i=0;i<len;i++)
	{
		if(s1[i]>='A'&&s1[i]<='Z')
		{
			py=32;
		}
		else
		{
			py=0;
		}
		if(s1[i]+py!=s2[i])
		{
			return false;
		}
	}

	return true;
}
static CString* strmake(const char *st,const char *ed)
{
	if(ed<=st)
	{
		CString *str=new CString;
		*str="";
		return str;
	}
	char *data=new char[ed-st+1];
	int i=0;
	while(st+i<ed)
	{
		data[i]=st[i];
		i++;
	}
	data[i]='\0';
	CString *str;
	str=new CString(data);
	return str;
}
static void getcontent(CString getstr,CString &content,CString &data)//姝e垯琛ㄨ揪寮忚幏鍙栧唴瀹?{
	CAtlRegExp<> reurl;
	REParseError statu=reurl.Parse(getstr);
	if(REPARSE_ERROR_OK!=statu)
	{
		return;
	}
	CAtlREMatchContext<> mcurl;
	if(!reurl.Match(content,&mcurl))
	{
		return;
	}
	const CAtlREMatchContext<>::RECHAR *szstart=0;
	const CAtlREMatchContext<>::RECHAR *szend=0;
	if(mcurl.m_uNumGroups<=0)
	{
		return;
	}
	mcurl.GetMatch(0,&szstart,&szend);
	data=*strmake(szstart,szend);
}

static void dealsbstr(CString &str)//瑙g爜鍗曡鐨???= base64缂栫爜瀛楃涓?{
	char *s=str.GetBuffer();
	int len=str.GetLength();
	s[len]='\0';
	int i=0;
	while(i<len)
	{
		if(s[i]=='='&&s[i+1]=='?')
		{
			char rep[64];
			int rlen=0;
			rep[rlen++]=s[i++];
			rep[rlen++]=s[i++];
			while(i<len&&s[i]!='?')
			{
				rep[rlen++]=s[i++];
			}
			rep[rlen++]=s[i++];
			if(s[i]=='B')
			{
				rep[rlen++]=s[i++];
				rep[rlen++]=s[i++];
				int j=0;
				char ss[64];
				while(i<len&&(s[i]!='?'||s[i+1]!='='))
				{
					ss[j]=s[i];
					rep[rlen++]=s[i++];
					j++;
				}
				ss[j]='\0';

				std::string jb=base64_decode(ss);
				//str.Format("%s",jb.c_str());
				
				rep[rlen++]=s[i++];
				rep[rlen++]=s[i++];
				rep[rlen]='\0';
				str.Replace(rep,jb.c_str());
			}
		}
		i++;
	}
}

void maildata::getmailbaseinfo(maildata &rmail)
{
	getcontent("Date: {.*?}\r\n",rmail.alldata,rmail.date);
	getcontent("From: {.*?}\r\n",rmail.alldata,rmail.from);
	getcontent("To: {.*?}\r\n",rmail.alldata,rmail.to);
	getcontent("Subject: {.*?}\r\n",rmail.alldata,rmail.subject);
	dealsbstr(rmail.from);
	dealsbstr(rmail.to);
	dealsbstr(rmail.subject);
}
void maildata::getmailinfo(maildata &rmail)
{
	getmailbaseinfo(rmail);
	getcontent("Content-Type: text/plain;.*?Content-Transfer-Encoding: {.*?}\r\n",rmail.alldata,rmail.contenttype);
	getcontent("Content-Type: text/plain;.*?\r\n\r\n{.*?}--",rmail.alldata,rmail.content);
	//AfxMessageBox(rmail.titletype+"\r\n"+rmail.title);
	rmail.content.Replace("\r\n","");
	if(strcom(rmail.contenttype.GetString(),"base64"))
	{
		std::string ss=rmail.content.GetString();
		ss=base64_decode(ss);
		rmail.content=ss.c_str();
		
	}
}

bool maildata::setmailforsend(maildata &rmail)//鐢熸垚鍙敤浜庡彂閫佺殑閭欢鍐呭
{
	if(rmail.from.GetLength()<1||rmail.to.GetLength()<1||rmail.subject.GetLength()<1)
	{
		return false;
	}

	rmail.type=MAIL_TYPE_USEND;
	rmail.alldata.Format("");
	
	CString str;

	/*str.Format("Date: Tue, 9 Dec 2014 11:20:55 +0800\r\n",
		rmail.from
		);
	rmail.alldata+=str;*/

	//鏍煎紡鍖栧熀鏈俊鎭?
	str.Format("From: %s\r\n",
		rmail.from
		);
	rmail.alldata+=str;

	str.Format("To: %s\r\n",
		rmail.to
		);
	rmail.alldata+=str;


	str.Format("Subject: =?GBK?B?%s?=\r\n",
		base64_encode((unsigned char *)rmail.subject.GetString(),rmail.subject.GetLength()).c_str()
		);
	rmail.alldata+=str;

	/*str.Format("X-Priority: 3\r\n");
	rmail.alldata+=str;
	str.Format("X-Mailer: wchrt's pro mail sever 1.0.0\r\n");
	rmail.alldata+=str;
	str.Format("X-Client-IP: 118.112.48.107\r\n");
	rmail.alldata+=str;*/

	//鍔犲叆MIME鏍煎紡鐨勯偖浠跺唴瀹?
	str.Format("Content-Type: multipart/alternative;\r\n boundary=\"--=_Part=\"\r\n");
	rmail.alldata+=str;
	str.Format("MIME-Version: 1.0\r\n");
	rmail.alldata+=str;
	str.Format("\r\nThis is a multi-part message in MIME format.\r\n\r\n----=_Part=\r\n");
	rmail.alldata+=str;

	if(rmail.content.GetLength()>0)
	{
		str.Format("Content-Type: text/plain; charset=GBK\r\nContent-Transfer-Encoding: base64\r\n\r\n%s\r\n----=_Part=--\r\n",
			base64_encode((unsigned char *)rmail.content.GetString(),rmail.content.GetLength()).c_str()
			);
		rmail.alldata+=str;
	}

	//闇€瑕佸彂閫侀檮浠剁殑璇濆皢鏂囦欢璇诲叆鍚庢坊鍔燤IME閮ㄥ垎鍗冲彲

	AfxMessageBox(rmail.alldata);
}


bool maildata::openeml(const CString uname,const CString mid,maildata &rmail)//鎵撳紑閭欢
{
	CString mpath="mail";
	mpath+="\\";
	mpath+=uname;
	mpath+="\\";
	mpath+=mid+".eml";
	CFile file;
	if(!file.Open(mpath,CFile::modeRead))
	{
		return false;
	}
	char temp[40960];
	UINT len=file.Read(temp,40900);
	temp[len]='\0';
	rmail.alldata.Format(temp);
	//AfxMessageBox(rmail.alldata);
	return true;
}

bool maildata::saveeml(const CString uname,const CString mid,maildata &rmail)//閭欢鍌ㄥ瓨
{
	CString mpath="mail";
	if(!PathIsDirectory(mpath))
	{
		if(!CreateDirectory(mpath,NULL))
		{
			return false;
		}
	}
	mpath+="\\";
	mpath+=uname;
	if(!PathIsDirectory(mpath))
	{
		if(!CreateDirectory(mpath,NULL))
		{
			return false;
		}
	}
	mpath+="\\";
	mpath+=mid+".eml";

	CFile file;
	if(!file.Open(mpath,CFile::modeWrite))
	{
		if(!file.Open(mpath,CFile::modeCreate|CFile::modeWrite))
		{
			return false;
		}
	}
	file.Write(rmail.alldata.GetString(),rmail.alldata.GetLength());
	file.Close();
	return true;
}

bool maildata::gettoaddress()//鑾峰彇鍚庣紑鍦板潃
{
	getcontent("@{.*}",to,toaddress);
	if(toaddress.GetLength()<1)
	{
		return false;
	}
	toaddress.Replace(" ","");
	return true;
}
           

鍩烘湰鐨剆mtp閭欢鏈嶅姟鍣ㄥ氨鍛婁竴娈佃惤浜嗐€傚墿涓嬬殑灏辨槸鍦╯mtp鏈嶅姟鍣ㄥ熀纭€涓婂埗浣減op3鏈嶅姟鍣ㄤ互鍙妛eb銆傚墿涓嬬殑鍐呭浠ュ悗鍐嶈ˉ鍏呫€?