WinInet进阶:发送邮件

上一篇文章http://blog.csdn.net/wangjiannuaa/article/details/6949368阐述了winInet基本使用方法。登录邮箱后干啥?当然是发邮件了~搞了半天终于把程序调通了。

首先还是分析真实的环境,邮件是怎么发送出去的,所谓分析,在这里就是抓包看数据了。

如下图所示,上一篇文章基础,也就是登录邮箱后,动作分解为三步骤:1.进入基本版-2.点击写信-3.点击发送。至于为什么是基本版,前文已有论述,是为了避免繁文缛节,把数据包尽可能得简化。


对应的文本如下

第一步,进入基本版:

GET http://m1.mail.sina.com.cn/basic/ HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Referer: http://m1.mail.sina.com.cn/basic/listmail.php?fid=new
Accept-Language: zh-CN
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; MAAU)
Accept-Encoding: gzip, deflate
Host: m1.mail.sina.com.cn
Connection: Keep-Alive
Cookie: freeName=jimmy_cmd@sina.com; SINAMAIL-WEBFACE-SESSID=4810c7c33fc1e1c6682bceab4ddef2c6; UOR=,,; U_TRS1=000000b4.2d6a4a30.4dbeccdf.f7085a45; vjuids=-8a3c2a43b.12f673b30db.0.8ab6cd7a91ca3; vjlast=1304434711; SINAGLOBAL=00000049.c6df3442.4e8ecea8.c10d0d3d; ULV=1320821256248:19:9:9:00000042.71d45d8d.4eba2208.9827aebf:1320816503894; ALLYESID4=00110503104143503706036; SGUP=0; mvsign=v%3D%2Atz%3Cc5uhs4CE5F_%24Uf5%3E; loginType=freemail; SHOW_TIP_BOX=1; _s_upa=7; ULOGIN_IMG=13208272802654; Apache=00000042.71d45d8d.4eba2208.9827aebf; SID=BdimHsH8SQooBHNNxsHHNHgo4oBBrWWBBoWHN8nirxHHNoWBgxW8yoW; SPRIAL=d38fb34629f58bca2d47db89f8bcc1f5; SINA_USER=j; U_TRS2=000000a2.1e3514bd.4eba226c.e1f9f60b; SUE=es%3D08613ec0baa20bc5de1c64800beebcd4%26ev%3Dv1%26es2%3Db3819624e7f5c93ed6e9ffd2f7667ccb%26rs0%3DegQRXaekdBX0Cv4RZLVGeN%252BJov2MOCrllf%252BT5K%252FHgqxOfu7Z3F8xlJHKpglceCpId1YzV%252FFh91g5tZvk86raopv99gWgxx%252FfAaEFoC6DeskUGWkmwKVO9yAspaUSOo4SPSzMlZX0Gy%252BkHtU%252BsOx7rVIVjNy6Zezg5oyexRYLOPk%253D%26rv%3D0; SUP=cv%3D1%26bt%3D1320827324%26et%3D1320913724%26lt%3D1%26uid%3D2521991044%26user%3Djimmy_cmd.%252A%252A%26ag%3D9%26name%3Djimmy_cmd%2540sina.com%26nick%3Djimmy_cmd%26sex%3D%26ps%3D0%26email%3Djimmy_cmd%2540sina.com%26dob%3D%26ln%3Djimmy_cmd%2540sina.com%26os%3D%26fmp%3D%26lcp%3D%26us%3D; SWEBAPPSESSID=ff951a6cf52f9a9cdfb8dfd7b67d0b8b; SWMHA=SWMHA137; WTP_VISSTATUS=TRUE; WTP_VISTAB=address

第二步,点击写信:

GET http://m1.mail.sina.com.cn/basic/writemail.php HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Referer: http://m1.mail.sina.com.cn/basic/
Accept-Language: zh-CN
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; MAAU)
Accept-Encoding: gzip, deflate
Host: m1.mail.sina.com.cn
Connection: Keep-Alive
Cookie: freeName=jimmy_cmd@sina.com; SINAMAIL-WEBFACE-SESSID=4810c7c33fc1e1c6682bceab4ddef2c6; UOR=,,; U_TRS1=000000b4.2d6a4a30.4dbeccdf.f7085a45; vjuids=-8a3c2a43b.12f673b30db.0.8ab6cd7a91ca3; vjlast=1304434711; SINAGLOBAL=00000049.c6df3442.4e8ecea8.c10d0d3d; ULV=1320821256248:19:9:9:00000042.71d45d8d.4eba2208.9827aebf:1320816503894; ALLYESID4=00110503104143503706036; SGUP=0; mvsign=v%3D%2Atz%3Cc5uhs4CE5F_%24Uf5%3E; loginType=freemail; SHOW_TIP_BOX=1; _s_upa=7; ULOGIN_IMG=13208272802654; Apache=00000042.71d45d8d.4eba2208.9827aebf; SID=BdimHsH8SQooBHNNxsHHNHgo4oBBrWWBBoWHN8nirxHHNoWBgxW8yoW; SPRIAL=d38fb34629f58bca2d47db89f8bcc1f5; SINA_USER=j; U_TRS2=000000a2.1e3514bd.4eba226c.e1f9f60b; SUE=es%3D08613ec0baa20bc5de1c64800beebcd4%26ev%3Dv1%26es2%3Db3819624e7f5c93ed6e9ffd2f7667ccb%26rs0%3DegQRXaekdBX0Cv4RZLVGeN%252BJov2MOCrllf%252BT5K%252FHgqxOfu7Z3F8xlJHKpglceCpId1YzV%252FFh91g5tZvk86raopv99gWgxx%252FfAaEFoC6DeskUGWkmwKVO9yAspaUSOo4SPSzMlZX0Gy%252BkHtU%252BsOx7rVIVjNy6Zezg5oyexRYLOPk%253D%26rv%3D0; SUP=cv%3D1%26bt%3D1320827324%26et%3D1320913724%26lt%3D1%26uid%3D2521991044%26user%3Djimmy_cmd.%252A%252A%26ag%3D9%26name%3Djimmy_cmd%2540sina.com%26nick%3Djimmy_cmd%26sex%3D%26ps%3D0%26email%3Djimmy_cmd%2540sina.com%26dob%3D%26ln%3Djimmy_cmd%2540sina.com%26os%3D%26fmp%3D%26lcp%3D%26us%3D; SWEBAPPSESSID=ff951a6cf52f9a9cdfb8dfd7b67d0b8b; SWMHA=SWMHA137; WTP_VISSTATUS=TRUE; WTP_VISTAB=address

第三步,点击发送:

POST http://m1.mail.sina.com.cn/basic/sendmail.php HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Referer: http://m1.mail.sina.com.cn/basic/writemail.php
Accept-Language: zh-CN
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; MAAU)
Content-Type: multipart/form-data; boundary=---------------------------7db2a861008aa
Accept-Encoding: gzip, deflate
Host: m1.mail.sina.com.cn
Content-Length: 1305
Connection: Keep-Alive
Pragma: no-cache
Cookie: freeName=jimmy_cmd@sina.com; SINAMAIL-WEBFACE-SESSID=4810c7c33fc1e1c6682bceab4ddef2c6; UOR=,,; U_TRS1=000000b4.2d6a4a30.4dbeccdf.f7085a45; vjuids=-8a3c2a43b.12f673b30db.0.8ab6cd7a91ca3; vjlast=1304434711; SINAGLOBAL=00000049.c6df3442.4e8ecea8.c10d0d3d; ULV=1320821256248:19:9:9:00000042.71d45d8d.4eba2208.9827aebf:1320816503894; ALLYESID4=00110503104143503706036; SGUP=0; mvsign=v%3D%2Atz%3Cc5uhs4CE5F_%24Uf5%3E; loginType=freemail; SHOW_TIP_BOX=1; _s_upa=7; ULOGIN_IMG=13208272802654; Apache=00000042.71d45d8d.4eba2208.9827aebf; SID=BdimHsH8SQooBHNNxsHHNHgo4oBBrWWBBoWHN8nirxHHNoWBgxW8yoW; SPRIAL=d38fb34629f58bca2d47db89f8bcc1f5; SINA_USER=j; U_TRS2=000000a2.1e3514bd.4eba226c.e1f9f60b; SUE=es%3D08613ec0baa20bc5de1c64800beebcd4%26ev%3Dv1%26es2%3Db3819624e7f5c93ed6e9ffd2f7667ccb%26rs0%3DegQRXaekdBX0Cv4RZLVGeN%252BJov2MOCrllf%252BT5K%252FHgqxOfu7Z3F8xlJHKpglceCpId1YzV%252FFh91g5tZvk86raopv99gWgxx%252FfAaEFoC6DeskUGWkmwKVO9yAspaUSOo4SPSzMlZX0Gy%252BkHtU%252BsOx7rVIVjNy6Zezg5oyexRYLOPk%253D%26rv%3D0; SUP=cv%3D1%26bt%3D1320827324%26et%3D1320913724%26lt%3D1%26uid%3D2521991044%26user%3Djimmy_cmd.%252A%252A%26ag%3D9%26name%3Djimmy_cmd%2540sina.com%26nick%3Djimmy_cmd%26sex%3D%26ps%3D0%26email%3Djimmy_cmd%2540sina.com%26dob%3D%26ln%3Djimmy_cmd%2540sina.com%26os%3D%26fmp%3D%26lcp%3D%26us%3D; SWEBAPPSESSID=ff951a6cf52f9a9cdfb8dfd7b67d0b8b; SWMHA=SWMHA137; WTP_VISSTATUS=TRUE; WTP_VISTAB=address

-----------------------------7db2a861008aa
Content-Disposition: form-data; name="to"

jimmy_cmd@sina.com
-----------------------------7db2a861008aa
Content-Disposition: form-data; name="cc"


-----------------------------7db2a861008aa
Content-Disposition: form-data; name="bcc"


-----------------------------7db2a861008aa
Content-Disposition: form-data; name="subject"

subject-basic
-----------------------------7db2a861008aa
Content-Disposition: form-data; name="atth1"; filename=""
Content-Type: application/octet-stream


-----------------------------7db2a861008aa
Content-Disposition: form-data; name="atth2"; filename=""
Content-Type: application/octet-stream


-----------------------------7db2a861008aa
Content-Disposition: form-data; name="atth3"; filename=""
Content-Type: application/octet-stream


-----------------------------7db2a861008aa
Content-Disposition: form-data; name="body"

hello-basic-version.
-----------------------------7db2a861008aa
Content-Disposition: form-data; name="saveSent"

1
-----------------------------7db2a861008aa
Content-Disposition: form-data; name="action"


-----------------------------7db2a861008aa
Content-Disposition: form-data; name="a_sendmail"

  发  送  
-----------------------------7db2a861008aa--


下面,就是要用WinInet API模拟以上三个过程就好了!

/******************************************************************
*	向奋战在刀光剑影中的特洛伊勇士们致敬
*	2011.11.07
*	于 南京航空航天大学  电子信息工程学院
******************************************************************/

#include<windows.h>   
#include<wininet.h>   

#include <iostream>

using namespace std;

#pragma comment(lib,"wininet.lib") 

HINTERNET   hSession = NULL; 
HINTERNET   hConnect = NULL; 
HINTERNET   hRequest = NULL; 

//
//构造邮件体
//注意行与行中间没有空格
//
void BuildMailContent(PSTR szFormData)
{
	strcpy(szFormData,"\
-----------------------------7db2a861008aa\r\n\
Content-Disposition: form-data; name=\"to\"\r\n\
\r\n\
jimmy_cmd@sina.com\r\n\
-----------------------------7db2a861008aa\r\n\
Content-Disposition: form-data; name=\"cc\"\r\n\
\r\n\
wangjian.nuaa@qq.com\r\n\
-----------------------------7db2a861008aa\r\n\
Content-Disposition: form-data; name=\"bcc\"\r\n\
\r\n\
\r\n\
-----------------------------7db2a861008aa\r\n\
Content-Disposition: form-data; name=\"subject\"\r\n\
\r\n\
subject-basic\r\n\
-----------------------------7db2a861008aa\r\n\
Content-Disposition: form-data; name=\"atth1\"; filename=\"\"\r\n\
Content-Type: application/octet-stream\r\n\
\r\n\
\r\n\
-----------------------------7db2a861008aa\r\n\
Content-Disposition: form-data; name=\"atth2\"; filename=\"\"\r\n\
Content-Type: application/octet-stream\r\n\
\r\n\
\r\n\
-----------------------------7db2a861008aa\r\n\
Content-Disposition: form-data; name=\"atth3\"; filename=\"\"\r\n\
Content-Type: application/octet-stream\r\n\
\r\n\
\r\n\
-----------------------------7db2a861008aa\r\n\
Content-Disposition: form-data; name=\"body\"\r\n\
\r\n\
application-send : send content!\r\n\
-----------------------------7db2a861008aa\r\n\
Content-Disposition: form-data; name=\"saveSent\"\r\n\
\r\n\
1\r\n\
-----------------------------7db2a861008aa\r\n\
Content-Disposition: form-data; name=\"action\"\r\n\
\r\n\
\r\n\
-----------------------------7db2a861008aa\r\n\
Content-Disposition: form-data; name=\"a_sendmail\"\r\n\
\r\n\
发  送\r\n\
-----------------------------7db2a861008aa--\r\n");

}

//
//将返回的页面写入磁盘文件
//
BOOL WriteFileToDisk(LPCSTR lpFileName,HINTERNET& hInternet)
{
	CHAR	szRecvBuf[1024+1];          // 接受数据缓冲区
	DWORD	dwNumberOfBytesRead;        // 服务器返回大小
	DWORD	dwRecvTotalSize=0;          // 接受数据总大小
	DWORD	dwRecvBuffSize=0;           // 接受数据buf的大小
	BOOL	bReturn = FALSE;
	memset(szRecvBuf,0,1024+1);

	DWORD	dwNumberOfBytesWritten ;

	HANDLE hOpenFile = (HANDLE)CreateFileA(lpFileName,GENERIC_WRITE,0,NULL,OPEN_ALWAYS,NULL,NULL);

	if (hOpenFile == INVALID_HANDLE_VALUE)
	{
		hOpenFile = NULL;
		return FALSE;
	}
	do 
	{
		bReturn = InternetReadFile(hInternet,szRecvBuf,1024,&dwNumberOfBytesRead);
		if(!bReturn)
		{
			break;
		}

		// 统计接受数据的大小
		szRecvBuf[dwNumberOfBytesRead] = '\0';
		dwRecvTotalSize += dwNumberOfBytesRead;
		dwRecvBuffSize  += strlen(szRecvBuf);

		WriteFile(hOpenFile,szRecvBuf,dwNumberOfBytesRead,&dwNumberOfBytesWritten,NULL);

	} while (dwNumberOfBytesRead !=0);

	CloseHandle(hOpenFile);

	return TRUE;
}

//
//初始化HINTERNET 建立连接
//
BOOL InitionWinInet()
{
	//InternetOpenA
	LPCSTR	lpszAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; MAAU)";
	DWORD	dwAccessType = INTERNET_OPEN_TYPE_PRECONFIG;

	hSession = InternetOpenA(lpszAgent,dwAccessType,NULL,NULL,0);
	if (!hSession)
	{
		return FALSE;
	}
	
	return TRUE;
}

//
//模拟点击登录邮箱
//
BOOL ClickToLoginEmail()
{
	//InternetConnectA
	LPCSTR lpszServerName = "mail.sina.com.cn";
	INTERNET_PORT nServerPort = INTERNET_DEFAULT_HTTP_PORT; 
	DWORD dwService = INTERNET_SERVICE_HTTP;

	hConnect = InternetConnectA(hSession,lpszServerName,nServerPort,NULL,NULL,dwService,0,1);
	if (!hConnect)
	{
		return FALSE;
	}

	//HttpOpenRequestA
	LPCSTR	lpszVerb = "POST";
	LPCSTR	lpszObjectName = "cgi-bin/login.php"; //网站的对象名,网址在InternetConnectA第二个参数指定
	LPCSTR	lpszVersion = "HTTP/1.1"; 
	LPCSTR	lpszReferrer = "http://mail.sina.com.cn/cgi-bin/login.php"; 
	LPCSTR	lpszAcceptTypes = "text/html, application/xhtml+xml, */*"; 
	DWORD	dwFlags = INTERNET_FLAG_RELOAD; 

	hRequest = HttpOpenRequestA(hConnect,lpszVerb,lpszObjectName,lpszVersion,lpszReferrer,&lpszAcceptTypes,dwFlags,1);
	if (!hRequest)
	{
		return FALSE;
	}
	
	//HttpSendRequestA
	LPCSTR	lpszHeaders = "Content-Type: application/x-www-form-urlencoded\r\n";
	DWORD	dwHeadersLength=-1L;
	char	szFormData[1024]={0};
	strcpy(szFormData,"logintype=uid&u=jimmy_cmd&psw=123abc&product=mail&%B5%C7%C2%BC=%B5%C7+%C2%BC\r\n");

	LPVOID pBuf = (LPVOID)szFormData;
	BOOL bReturn = HttpSendRequestA(hRequest,lpszHeaders,dwHeadersLength,pBuf,strlen(szFormData));
	if(!bReturn)
	{
		return FALSE;
	}

	LPCSTR	lpFileName = "login.html";

	WriteFileToDisk(lpFileName,hRequest);

	return TRUE;
}

//
//模拟点击到基本版
//
BOOL ClickToBasicVersion()
{
	LPCSTR lpszUrl = "http://m1.mail.sina.com.cn/basic/";
	hRequest = InternetOpenUrlA(hSession,lpszUrl,NULL,0,INTERNET_FLAG_RELOAD,0);
	if (!hRequest)
	{
		return FALSE;
	}

	LPCSTR	lpFileName = "basic.html";

	WriteFileToDisk(lpFileName,hRequest);

	return TRUE;
}

//
//模拟点击写信按钮
//
BOOL ClickToWrite()
{
	LPCSTR lpszUrl = "http://m1.mail.sina.com.cn/basic/writemail.php ";
	hRequest = InternetOpenUrlA(hSession,lpszUrl,NULL,0,INTERNET_FLAG_RELOAD,0);
	if (!hRequest)
	{
		return FALSE;
	}
	
	LPCSTR	lpFileName =  "write.html";

	WriteFileToDisk(lpFileName,hRequest);

	return TRUE;
}

//
//模拟点击发送邮件
//
BOOL ClickSendEmail()
{
	//InternetConnectA
	LPCSTR lpszServerName = "m1.mail.sina.com.cn";
	INTERNET_PORT nServerPort = INTERNET_DEFAULT_HTTP_PORT; 
	DWORD dwService = INTERNET_SERVICE_HTTP;

	hConnect = InternetConnectA(hSession,lpszServerName,nServerPort,NULL,NULL,dwService,0,1);
	if (!hConnect)
	{
		return FALSE;
	}

	//HttpOpenRequestA
	LPCSTR	lpszVerb = "POST";
	LPCSTR	lpszObjectName = "basic/sendmail.php"; //网站的对象名,网址在InternetConnectA第二个参数指定
	LPCSTR	lpszVersion = "HTTP/1.1"; 
	LPCSTR	lpszReferrer = "http://m1.mail.sina.com.cn/basic/writemail.php"; 
	LPCSTR	lpszAcceptTypes = "text/html, application/xhtml+xml, */*"; 
	DWORD	dwFlags = INTERNET_FLAG_RELOAD; 
	
	hRequest = HttpOpenRequestA(hConnect,lpszVerb,lpszObjectName,lpszVersion,lpszReferrer,&lpszAcceptTypes,dwFlags,1);
	if (!hRequest)
	{
		return FALSE;
	}

	//HttpSendRequestA
	LPCSTR	lpszHeaders = "Content-Type: multipart/form-data; boundary=---------------------------7db2a861008aa\r\n";
	DWORD	dwHeadersLength=-1L;
	CHAR	szContentData[10240]={0};
	
	BuildMailContent(szContentData);

	LPVOID pBuf = (LPVOID)szContentData;
	BOOL bReturn = HttpSendRequestA(hRequest,lpszHeaders,dwHeadersLength,pBuf,strlen(szContentData));
	if(!bReturn)
	{
		return FALSE;
	}
	
	return TRUE;	
}

//
//主函数
//
void main()
{
	BOOL isOK = FALSE ;
	
	do 
	{
		if (!InitionWinInet()){
			break;
		}
		cout<<"InitionWinInet finished."<<endl;

		if (!ClickToLoginEmail()){
			break;
		}
		cout<<"ClickToLoginEmail finished."<<endl;

		if (!ClickToBasicVersion()){
			break;
		}
		cout<<"ClickToBasicVersion finished."<<endl;

		if (!ClickToWrite()){
			break;
		}
		cout<<"ClickToWrite finished."<<endl;

		if (!ClickSendEmail()){
			break;
		}
		cout<<"ClickSendEmail finished."<<endl;

	} while (FALSE);


	cout<<"Press any key to quit."<<endl;
	getchar();

	InternetCloseHandle(hSession);
	InternetCloseHandle(hConnect);
	InternetCloseHandle(hRequest);
}

测试得到的,写入磁盘的html文件可以辅助直观感受这个过程,也展示一下:






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值