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

📄 smtp.cpp

📁 利用smtp协议发送邮件
💻 CPP
字号:

#include <winsock2.h>
//#include <string.h>
#include <stdio.h>

#include "mime.h"

#pragma comment(lib, "WS2_32")	// 链接到WS2_32.lib


SOCKET  SockFD;
char recvbuf[1460];


// 发送数据
int senddata(const char *s)
{
	puts(">>");
	puts(s);

	return send(SockFD, s, strlen(s), 0);
}

// 接收数据
int recvdata()
{
	//return recv(SockFD, recvbuf, 1460, 0);

	int len = recv(SockFD, recvbuf, 1460, 0);

	recvbuf[len] = 0;
	puts("<<");
	puts(recvbuf);

	// 提取返回码

	if (len >= 3 )
	{
		len = ((recvbuf[0] - '0') * 100) + ((recvbuf[1] - '0') * 10) + (recvbuf[2] - '0');
		return len;
	}
	else
		return 0;
}

// 发邮件
int sendemail()
{
	//LPHOSTENT pHost = gethostbyname("60.191.85.10");	// smtp.yeah.net 的ip
	LPHOSTENT pHost = gethostbyname("121.14.76.66");	// smtp.qq.com 的ip
	struct sockaddr_in ServAddr;
	ServAddr.sin_family = AF_INET;
	ServAddr.sin_addr.s_addr = *(ULONG *)pHost->h_addr_list[0];
	ServAddr.sin_port = htons(25);

	// 连接到SMTP服务器
	//	220 smtp.qq.com ESMTP QQMail Ver 2.2
	if(connect(SockFD, (struct sockaddr *)&ServAddr, sizeof(ServAddr)) == SOCKET_ERROR)
	{
		printf("Failed connect() \n");
		return 0;
	}
	if (recvdata() != 220)
		return 0;

	//EHLO tt
	//	250-mail
	//	250-PIPELINING
	//	250-AUTH LOGIN PLAIN
	//	250-AUTH=LOGIN PLAIN
	//	250 8BITMIME
	senddata("EHLO tt\r\n");						// 我来了
	if (recvdata() != 250)
		return 0;


	//AUTH LOGIN
	//	334 dXNlcm5hbWU6	"username:",base64字符串
	//NTg2MTkwNDI=			这是用户名"58619042",base64字符串。注意,发送者的邮箱必须先开通邮箱smtp服务!
	//	334 UGFzc3dvcmQ6	"Password:",base64字符串
	//xxxxxxxxxxx			这是密码,base64字符串
	//	235 Authentication successful
	senddata("AUTH LOGIN\r\n");						// 我要登录了
	if (recvdata() != 334)
		return 0;

	senddata("NTg2MTkwNDI=\r\n");	// 我的用户名,记得先将明文编码成base64字符串
	if (recvdata() != 334)
		return 0;

	senddata("xxxxxxxxxxx\r\n");	// 我的密码,记得先将明文编码成base64字符串
	if (recvdata() != 235)
		return 0;


	//MAIL FROM: <58619042@qq.com>
	//	250 Mail OK
	senddata("MAIL FROM: <58619042@qq.com>\r\n");	// 发信人(我)的邮箱
	if (recvdata() != 250)
		return 0;

	//RCPT TO: <cradio@yeah.net>
	//	250 Mail OK
	senddata("RCPT TO: <cradio@yeah.net>\r\n");		// 收信人(对方)的邮箱
	if (recvdata() != 250)
		return 0;

	//Data
	//	354 End data with <CR><LF>.<CR><LF>
	senddata("Data\r\n");							// 我要发送数据了
	if (recvdata() != 354)
		return 0;

	/*
	// 纯英文(ANSI)
	{
		//Date: Tue, 24 Nov 2008 17:22:42 +0800
		//From: "my name" <58619042@qq.com>
		//To: "reciver name" <cradio@yeah.net>
		//Subject: my title
		//Message-ID: <200811172243123598816@yeah.net>
		//X-mailer: Foxmail 6, 10, 201, 20 [cn]
		//Mime-Version: 1.0
		//Content-Type: text/plain;
		//charset="gb2312"
		//Content-Transfer-Encoding: 7bit
		//this is my context!
		//.
		//	250 Mail OK queued as smtp1,ClUQrLDbMXaDgyFJo48LCg--.11284S2 1226933124
		senddata(
		"Date: Tue, 23 Nov 2008 21:32:42 +0800\r\n"
		"From: \"my name\" <58619042@qq.com>\r\n"
		"To: \"your name\" <cradio@yeah.net>\r\n"
		"Subject: my title\r\n"
		"Message-ID: <200811182143420623252@yeah.net>\r\n"
		"X-mailer: Foxmail 6, 10, 201, 20 [cn]\r\n"
		"Mime-Version: 1.0\r\n"
		"Content-Type: text/plain;\r\n"
		"charset=\"gb2312\"\r\n"
		"Content-Transfer-Encoding: 7bit\r\n"	// 编码为 ansi(每个字符只占7位)
		"\r\n"
		"this is my content!\r\n"				// 我要发送的内容(ANSI)
		".\r\n"
		);
	}
	*/

	/*
	// 有汉字
	{
		//Date: Tue, 24 Nov 2008 16:43:42 +0800
		//From: "58619042" <58619042@qq.com>
		//To: "cradio" <cradio@yeah.net>
		//Subject: =?gb2312?B?uf7gtg==?=
		//Message-ID: <200811181643420623252@yeah.net>
		//X-mailer: Foxmail 6, 10, 201, 20 [cn]
		//Mime-Version: 1.0
		//Content-Type: text/plain;
		//charset="gb2312"
		//Content-Transfer-Encoding: base64
		//t+ejrMT6usOjoQ0KDQqhoaGhDQoNCqGhoaGhoaGhoaGhoaGhoaHWwg0KwPGjoQ0KDQoNCg0K
		//.
		//	250 Mail OK queued as smtp1,ClUQrLDbiTvBgCJJ+wEnCg--.65429S2 1226997953
		senddata(
		"Date: Tue, 18 Nov 2008 21:32:42 +0800\r\n"
		"From: \"cradio\" <cradio@yeah.net>\r\n"
		"To: \"58619042\" <58619042@qq.com>\r\n"
		"Subject: =?gb2312?B?uf7gtg==?=\r\n"
		"Message-ID: <200811182143420623252@yeah.net>\r\n"
		"X-mailer: Foxmail 6, 10, 201, 20 [cn]\r\n"
		"Mime-Version: 1.0\r\n"
		"Content-Type: text/plain;\r\n"
		"charset=\"gb2312\"\r\n"
		"Content-Transfer-Encoding: base64\r\n"
		"\r\n"
		"t+ejrMT6usOjoQ0KDQqhoaGhDQoNCqGhoaGhoaGhoaGhoaGhoaHWwg0KwPGjoQ0KDQoNCg0K\r\n"	// Base64编码内容
		".\r\n"
		);
	}
	*/


	// 有附件
	{
		//Date: Tue, 24 Nov 2008 21:44:01 +0800
		//From: "58619042" <58619042@qq.com>
		//To: "cradio" <cradio@yeah.net>
		//Subject: =?gb2312?B?uL28/g==?=
		//Message-ID: <200811182144008127934@yeah.net>
		//X-mailer: Foxmail 6, 10, 201, 20 [cn]
		//Mime-Version: 1.0
		//Content-Type: multipart/mixed;
		//	boundary="=====001_Dragon143666724817_====="
		//
		//This is a multi-part message in MIME format.
		//
		//--=====001_Dragon143666724817_=====
		//Content-Type: text/plain;
		//	charset="gb2312"
		//Content-Transfer-Encoding: base64
		//
		//t+ejrMT6usOjoQ0KoaGhoaGhoaGhoaGhoaGhodbCDQrA8aOhDQoNCg0KDQo=
		//--=====001_Dragon143666724817_=====
		//Content-Type: application/octet-stream;
		//	name="a.txt"
		//Content-Transfer-Encoding: base64
		//Content-Disposition: attachment;
		//	filename="a.txt"
		//
		//YmVnaW4uDQq+rbOjzP28+7HwyMvLtcPmz/K21M/ztcSzzNDyyei8xqOs0tTHsNTa0afQo8nPv861
		//xMqxuvKjrNKy09C/qsPmz/K21M/zs8zQ8snovMbV4sPFv86how0KZW5kLg==
		//
		//--=====001_Dragon143666724817_=====--
		//
		//.
		//	250 Mail OK queued as smtp1,ClUQrLD7QDckxyJJytpKCg--.23130S2 1227015973
		senddata(
			"Date: Tue, 23 Nov 2008 21:44:01 +0800\r\n"
			"From: \"58619042\" <58619042@qq.com>\r\n"
			"To: \"cradio\" <cradio@yeah.net>\r\n"
			"Subject: =?gb2312?B?uL28/g==?=\r\n"
			"Message-ID: <200811182144008127934@yeah.net>\r\n"
			"X-mailer: Foxmail 6, 10, 201, 20 [cn]\r\n"
			"Mime-Version: 1.0\r\n"
			"Content-Type: multipart/mixed;\r\n"
			"	boundary=\"=====001_Dragon143666724817_=====\"\r\n"
			"\r\n"
			"This is a multi-part message in MIME format.\r\n"
			"\r\n"
			"--=====001_Dragon143666724817_=====\r\n"
			"Content-Type: text/plain;\r\n"
			"	charset=\"gb2312\"\r\n"
			"Content-Transfer-Encoding: base64\r\n"
			"\r\n"
			"t+ejrMT6usOjoQ0KoaGhoaGhoaGhoaGhoaGhodbCDQrA8aOhDQoNCg0KDQo=\r\n"		// 信件内容(Basi64编码)
			"--=====001_Dragon143666724817_=====\r\n"
			"Content-Type: application/octet-stream;\r\n"
			"	name=\"a.txt\"\r\n"
			"Content-Transfer-Encoding: base64\r\n"
			"Content-Disposition: attachment;\r\n"
			"	filename=\"a.txt\"\r\n"
			"\r\n"
			"YmVnaW4uDQq+rbOjzP28+7HwyMvLtcPmz/K21M/ztcSzzNDyyei8xqOs0tTHsNTa0afQo8nPv861\r\n"	// 附件数据(Basi64编码)
			"xMqxuvKjrNKy09C/qsPmz/K21M/zs8zQ8snovMbV4sPFv86how0KZW5kLg==\r\n"
			"\r\n"
			"--=====001_Dragon143666724817_=====--\r\n"
			".\r\n"
			);
	}


	if (recvdata() != 250)
		return 0;


	//QUIT
	//	221 Bye
	senddata("QUIT\r\n");						// 我收工罗
	recvdata();


	return 1;
}


int main(int argc, char* argv[])
{
	/*
	// Base64 解码
	char src[] = "dXNlcm5hbWU6";	// "dXNlcm5hbWU6"解码后就是"username:"
	unsigned char dest[1024]={0};
	int x = Base64Decode(dest, src);
	dest[x] = 0;
	printf("%s\n", dest);
	return 0;
	*/

	/*
	// Base64 编码
	const char src[] = "58619042";	// "58619042"编码后得"NTg2MTkwNDI="
	char s[1024]={0};
	int x=strlen(src);
	x = Base64Encode(s, (const unsigned char *)src, x);
	s[x] = 0;
	printf("%s\n", s);
	return 0;
	*/



	WSADATA wsaData;
	WSAStartup(MAKEWORD(2,2), &wsaData);

	// 创建socket
	SockFD = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if(SockFD == INVALID_SOCKET)
	{
		printf("Failed socket() \n");
		return 0;
	}

	// 发送邮件
	if (sendemail())
		puts("ok");
	else
		puts("failed!!!");


	// 关闭socket
	closesocket(SockFD);


	WSACleanup();

	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -