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

📄 send.cpp

📁 网页上mail组件
💻 CPP
字号:
// Send.cpp: implementation of the CSend class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Send.h"
#include <windows.h>
#include <winsock.h>
#include <time.h>
#include "base64.h"
#include <stdio.h>

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CSend::CSend()
{
}

CSend::~CSend()
{

}

int CSend::Startup()
{
	WORD ver=MAKEWORD(2,0);
	WSADATA wsaData;
	
	ERet=::WSAStartup(ver,&wsaData);
	if(ERet!=0)		
		return 1;//Initlize Socket Error.
	return 0;
}

int CSend::CreateSocket()
{
	s=socket(AF_INET,SOCK_STREAM,0);
	if(s==INVALID_SOCKET)
	{
		::WSACleanup();
		
		return 3;//Socket alloc Error.
	}
	return 0;
}

int CSend::Connect(char *Smtp)
{
	//get host infomation.
	struct hostent *host;
	host=gethostbyname(Smtp);
	if(host==NULL)
	{
		closesocket(s);
		::WSACleanup();
		
		return 2;//Can not get host or DNS Error.
	}

	//connect the smtp server.
	struct sockaddr_in sock;
	memset(&sock,0,sizeof(sock));

	sock.sin_family=AF_INET;
	sock.sin_addr.S_un.S_addr=*(long*)host->h_addr_list[0];
	sock.sin_port=htons(25);

	ERet=connect(s,(struct sockaddr *)&sock,sizeof(sock));
	if(ERet==SOCKET_ERROR)
	{
		closesocket(s);
		::WSACleanup();

		return 4;//Can not connect the host.
	}

	//receive the response data.
	ERet=recv(s,queque,256,0);
	if(ERet==SOCKET_ERROR)
	{
		::closesocket(s);
		::WSACleanup();

		return 6;//Can not receive the data,Network Error.
	}

	//check the server's response: 220 OK
	queque[3]='\0';
	if(strcmp(queque,"220"))
	{
		::closesocket(s);
		::WSACleanup();

		return 7;//SMTP server response Error.
	}
	return 0;
}

int CSend::SayHello(char *Hello)
{
	ERet=F_send(s,Hello,strlen(Hello),0);
	if(ERet==SOCKET_ERROR)
	{
		closesocket(s);
		::WSACleanup();

		return 5;//Can not send the data,Network Error.
	}

	//receive the server's response data.
	ERet=recv(s,queque,256,0);
	if(ERet==SOCKET_ERROR)
	{
		closesocket(s);
		::WSACleanup();

		return 6;//Can not receive the data,Network Error.
	}

	//check the server's response: 250 OK
	queque[3]='\0';
	if(strcmp(queque,"250"))
	{
		closesocket(s);
		::WSACleanup();

		return 7;//SMTP server response Error.
	}
	return 0;
}

int CSend::SayMail(char *From)
{
	//send "MAIL From:" to the server.
	ERet=F_send(s,From,strlen(From),0);
	if(ERet==SOCKET_ERROR)
	{
		closesocket(s);
		::WSACleanup();
	
		return 5;//Can not send the data,Network Error.
	}

	//receive the server's response data.
	ERet=recv(s,queque,256,0);
	if(ERet==SOCKET_ERROR)
	{
		closesocket(s);
		::WSACleanup();

		return 6;//Can not receive the data,Network Error.
	}

	//check the server's response: 250 OK
	queque[3]='\0';
	if(strcmp(queque,"250"))
	{
		closesocket(s);
		::WSACleanup();

		return 7;//SMTP server response Error.
	}

	return 0;
}

int CSend::SayTo(char *To)
{
	//send "RCPT TO:" to the server.
	ERet=F_send(s,To,strlen(To),0);
	if(ERet==SOCKET_ERROR)
	{
		closesocket(s);
		::WSACleanup();

		return 5;//Can not send the data,Network Error.
	}

	//receive the server's response data.
	ERet=recv(s,queque,256,0);
	if(ERet==SOCKET_ERROR)
	{
		closesocket(s);
		::WSACleanup();

		return 6;//Can not receive the data,Network Error.
	}

	//check the server's response: 250 OK
	queque[3]='\0';
	if(strcmp(queque,"250"))
	{
		closesocket(s);
		::WSACleanup();

		return 7;//SMTP server response Error.
	}

	return 0;
}

int CSend::SayDataNormal(char *Subject,char *Data, size_t Length)
{
	//send DATA
	sprintf(queque,"DATA \r\n");
	ERet=F_send(s,queque,strlen(queque),0);
	if(ERet==SOCKET_ERROR)
	{
		closesocket(s);
		::WSACleanup();

		return 5;//Can not send the data,Network Error.
	}

	//receive the server's response data.
	ERet=recv(s,queque,256,0);
	if(ERet==SOCKET_ERROR)
	{
		closesocket(s);
		::WSACleanup();

		return 6;//Can not receive the data,Network Error.
	}

	//check the server's response: 354 INPUT
	queque[3]='\0';
	if(strcmp(queque,"354"))
	{
		closesocket(s);
		::WSACleanup();

		return 7;//SMTP server response Error.
	}

	//send the mail subject.
	ERet=F_send(s,Subject,strlen(Subject),0);
	if(ERet==SOCKET_ERROR)
	{
		closesocket(s);
		::WSACleanup();

		return 5;//Can not send the data,Network Error.
	}
	
	strcpy(queque,"\r\n");
	ERet=F_send(s,queque,strlen(queque),0);
	if(ERet==SOCKET_ERROR)
	{
		closesocket(s);
		::WSACleanup();

		return 5;//Can not send the data,Network Error.
	}
	
	//send the mail body
	ERet=F_send(s,Data,Length,0);
	if(ERet==SOCKET_ERROR)
	{
		closesocket(s);
		::WSACleanup();

		return 5;//Can not send the data,Network Error.
	}
	
	//end the DATA
	sprintf(queque,"\r\n.\r\n");	
	ERet=F_send(s,queque,strlen(queque),0);
	if(ERet==SOCKET_ERROR)
	{
		closesocket(s);
		::WSACleanup();

		return 5;//Can not send the data,Network Error.
	}

	//receive the server's response data.
	ERet=recv(s,queque,256,0);
	if(ERet==SOCKET_ERROR)
	{
		closesocket(s);
		::WSACleanup();

		return 6;//Can not receive the data,Network Error.
	}

	//check the server's response: 250 OK
	queque[3]='\0';
	if(strcmp(queque,"250"))
	{
		closesocket(s);
		::WSACleanup();

		return 7;//SMTP server response Error.
	}
	
	return 0;
}

int CSend::SayQuit()
{
	//send QUIT
	strcpy(queque,"QUIT \r\n");
	ERet=F_send(s,queque,strlen(queque),0);
	if(ERet==SOCKET_ERROR)
	{
		closesocket(s);
		::WSACleanup();

		return 5;//Can not send the data,Network Error.
	}

	//receive the server's response data.
	ERet=recv(s,queque,256,0);
	if(ERet==SOCKET_ERROR)
	{
		closesocket(s);
		::WSACleanup();

		return 6;//Can not receive the data,Network Error.
	}

	//check the server's response: 221 OK
	queque[3]='\0';
	if(strcmp(queque,"221"))
	{
		closesocket(s);
		::WSACleanup();

		return 7;//SMTP server response Error.
	}

	//clean up the socket use.
	closesocket(s);
	::WSACleanup();
	
	return 0;
}

int CSend::SayDataMIME(char *Subject, char *Data, size_t Length, RCPT *rcpt)
{
	//send DATA
	sprintf(queque,"DATA \r\n");
	ERet=F_send(s,queque,strlen(queque),0);
	if(ERet==SOCKET_ERROR)
	{
		closesocket(s);
		::WSACleanup();

		return 5;//Can not send the data,Network Error.
	}

	//receive the server's response data.
	ERet=recv(s,queque,256,0);
	if(ERet==SOCKET_ERROR)
	{
		closesocket(s);
		::WSACleanup();

		return 6;//Can not receive the data,Network Error.
	}

	//check the server's response: 354 INPUT
	queque[3]='\0';
	if(strcmp(queque,"354"))
	{
		closesocket(s);
		::WSACleanup();

		return 7;//SMTP server response Error.
	}

	//send the mail subject.
	ERet=F_send(s,Subject,strlen(Subject),0);
	if(ERet==SOCKET_ERROR)
	{
		closesocket(s);
		::WSACleanup();

		return 5;//Can not send the data,Network Error.
	}

	//send mail body.
	//send mail MIME head.
	char *boundary=new char[128];
	time_t timer;
	time(&timer);
	strcpy(boundary,"Fang_Mail_Sender_0_0_0_");		
	itoa(timer,&(boundary[strlen(boundary)]),10);
	
	strcpy(queque,"MIME-Version: 1.0\r\nContent-Type: multipart/mixed;\r\n");
	strcat(queque,"\tboundary=\"");
	strcat(queque,boundary);
	strcat(queque,"\"\r\n\r\nThis is a multi-part message in MIME format.\r\n\r\n");

	ERet=F_send(s,queque,strlen(queque),0);
	if(ERet==SOCKET_ERROR)
	{
		closesocket(s);
		::WSACleanup();

		return 5;//Can not send the data,Network Error.
	}
	
	//send the data,plain
	sprintf(queque,"--%s",boundary);
	strcpy(boundary,queque);
	strcat(queque,"\r\nContent-Type: text/plain\r\n\r\n");
	
	ERet=F_send(s,queque,strlen(queque),0);
	if(ERet==SOCKET_ERROR)
	{
		closesocket(s);
		::WSACleanup();

		return 5;//Can not send the data,Network Error.
	}

	ERet=F_send(s,Data,Length,0);
	if(ERet==SOCKET_ERROR)
	{
		closesocket(s);
		::WSACleanup();

		return 5;//Can not send the data,Network Error.
	}

	for(int i=0;i<rcpt->Count;i++)
	{
		//send the boundary head.
		char *name=new char[32];
		strcpy(queque,&(rcpt->szRcpt[i*rcpt->Length]));
		for(int k=strlen(queque);k>0;k--)
			if(queque[k]=='\\')
			{
				strcpy(name,&(queque[k+1]));
				k=0;
			}

		strcpy(queque,"\r\n\r\n");
		strcat(queque,boundary);
		strcat(queque,"\r\nContent-Type: application/Fang_File;\r\n");
		strcat(queque,"\tname=\"");
		strcat(queque,name);
		strcat(queque,"\"\r\n");
		strcat(queque,"Content-Transfer-Encoding: base64\r\n");
		strcat(queque,"Content-Disposition: attachment;\r\n");
		strcat(queque,"\tfilename=\"");
		strcat(queque,name);
		strcat(queque,"\"\r\n\r\n");

		delete []name;

		ERet=F_send(s,queque,strlen(queque),0);
		if(ERet==SOCKET_ERROR)
		{
			closesocket(s);
			::WSACleanup();

			return 5;//Can not send the data,Network Error.
		}

		//send the attachment with base64 encoding.
		//open the file with specified by rcpt->szRcpt.
		HANDLE hFile=::CreateFile(&(rcpt->szRcpt[i*rcpt->Length]),
			GENERIC_READ,
			0,
			NULL,
			OPEN_EXISTING,
			FILE_ATTRIBUTE_NORMAL,
			NULL);

		if(hFile==INVALID_HANDLE_VALUE)			
		{
			closesocket(s);
			::WSACleanup();

			return 10;//Can not open the file.
		}

		char *filedata=new char[180];
		unsigned long nReaded=0;
		while(::ReadFile(hFile,filedata,171,&nReaded,NULL))
		{
			if(nReaded==0)
				break;

			Cbase64 base64;
			int nEncoded=base64.Encode(filedata,queque,nReaded,256);
			char FormatedData[80];
			int n=nEncoded/76;
			for(int j=0;j<n;j++)
			{
				strncpy(FormatedData,&(queque[j*76]),76);
				FormatedData[76]='\0';
				strcat(FormatedData,"\r\n");
				ERet=F_send(s,FormatedData,78,0);
				if(ERet==SOCKET_ERROR)
				{
					closesocket(s);
					::WSACleanup();
	
					return 5;//Can not send the data,Network Error.
				}
			}
			if(n=nEncoded%76)
			{
				ERet=F_send(s,&queque[nEncoded-n],n,0);
				if(ERet==SOCKET_ERROR)
				{
					closesocket(s);
					::WSACleanup();
	
					return 5;//Can not send the data,Network Error.
				}
			}

		}

		delete []filedata;
		::CloseHandle(hFile);


	}//end of attachments.

	//end of multiple mixed.
	strcpy(queque,"\r\n\r\n");
	strcat(queque,boundary);
	strcat(queque,"--");
	ERet=F_send(s,queque,strlen(queque),0);
	if(ERet==SOCKET_ERROR)
	{
		closesocket(s);
		::WSACleanup();

		return 5;//Can not send the data,Network Error.
	}

	//delete the boundary
	if(boundary)
		delete []boundary;

	//end the DATA
	sprintf(queque,"\r\n.\r\n");
	ERet=F_send(s,queque,strlen(queque),0);
	if(ERet==SOCKET_ERROR)
	{
		closesocket(s);
		::WSACleanup();

		return 5;//Can not send the data,Network Error.
	}

	//receive the server's response data.
	ERet=recv(s,queque,256,0);
	if(ERet==SOCKET_ERROR)
	{
		closesocket(s);
		::WSACleanup();

		return 6;//Can not receive the data,Network Error.
	}

	//check the server's response: 250 OK
	queque[3]='\0';
	if(strcmp(queque,"250"))
	{
		closesocket(s);
		::WSACleanup();

		return 7;//SMTP server response Error.
	}

	return 0;
}

int CSend::F_send(SOCKET s, const char *buf, int len, int flags)
{
	int ret=0;
	while(ret<len)
	{
		ret=send(s,buf,len,flags);
		if(ret==SOCKET_ERROR)
			return ret;
	}
	return ret;
}

⌨️ 快捷键说明

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