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

📄 smtp1.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	base64字符串,"username:"
	//NTg2MTkwNDI=			base64字符串,用户名,"58619042"
	//	334 UGFzc3dvcmQ6	base64字符串,"Password:"
	//xxxxxxxxxxx			base64字符串,密码,"xxxxxxx"
	//	235 Authentication successful
	senddata("AUTH LOGIN\r\n");						// 我要登录了
	if (recvdata() != 334)
		return 0;

	senddata("NTg2MTkwNDI=\r\n");	// 我的用户名
	if (recvdata() != 334)
		return 0;

	senddata("xxxxxxxxxxx\r\n");	// 我的密码
	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;

	//Date: Tue, 18 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"
		);

	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";	// 解码后就是"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";	// 编码后得"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 + -