📄 send.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 + -