mysendmail 函数即可:
void WriteLog(char *context)
{
char time[BUFFERSIZE];
SYSTEMTIME st;
FILE *log ;
if (!WRITELOG) return;
if (0 == strlen(context))
{
sprintf(time,"=======================================================================================\n");
}
else
{
GetLocalTime(&st);
sprintf(time,"%d-%d-%d %d : %d : %d %s\n",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond,context);
}
if (0==(log=fopen("Mail.log","at"))) return;
fputs(time,log);
fclose(log);
}
bool Initwsa(BYTE minorver,BYTE majorver)
{
WSADATA wsadata;
WORD sockversion=MAKEWORD(minorver,majorver);
if (WSAStartup(sockversion,&wsadata)!=0)
{
char err[BUFFERSIZE];
sprintf(err, "[WSAStartup]error code:
%d",WSAGetLastError());
WriteLog(err);
return false;
}
return true;
}
bool SetSocket( SOCKET *pSock, struct sockaddr_in *pTo, char *
smtpName)
{
struct hostent *pHostent = NULL;
char err[BUFFERSIZE];
int TimeOut;
pHostent = gethostbyname(smtpName);
if( NULL == pHostent )
{
sprintf(err, "Error at gethostbyname(%s): %d", smtpName,
WSAGetLastError() );
WriteLog(err);
return false;
}
*pSock = socket(AF_INET,SOCK_STREAM,0);
if( INVALID_SOCKET == *pSock )
{
sprintf(err, "Error at socket(): %d", WSAGetLastError()
);
WriteLog(err);
return false;
}
TimeOut=3000;
if(setsockopt(*pSock,SOL_SOCKET,SO_SNDTIMEO,(char
*)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR){return
false;}
if(setsockopt(*pSock,SOL_SOCKET,SO_RCVTIMEO,(char
*)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR){return false;}
pTo->sin_family = AF_INET;
pTo->sin_port = htons(25);
memcpy( &pTo->sin_addr.S_un.S_addr,
pHostent->h_addr_list[0], pHostent->h_length );
return true;
}
void Clear(SOCKET * socket)
{
closesocket(*socket);
WSACleanup();
}
bool Connect(SOCKET Sock,struct sockaddr_in to, int
size)
{
char err[BUFFERSIZE];
unsigned long ul = 1;
struct timeval timeout ;
fd_set r;
int ret;
sprintf(err, "Connected to the SMPT server %s ...",
inet_ntoa(to.sin_addr));
WriteLog(err);
if (ioctlsocket(Sock, FIONBIO, &ul)==SOCKET_ERROR ){return
false;}
connect(Sock, (struct sockaddr*)&to, size);
FD_ZERO(&r);
FD_SET(Sock, &r);
timeout.tv_sec = 3;
timeout.tv_usec =0;
ret = select(0, 0, &r, 0, &timeout);
if (ret == 0) {Clear(&Sock); return false; }
else if (ret < 0) {Clear(&Sock); return false; }
ul=0;
if (SOCKET_ERROR == ioctlsocket(Sock, FIONBIO,
&ul)){Clear(&Sock); return false;}
ZeroMemory(err, BUFFERSIZE);
if ( SOCKET_ERROR == recv(Sock, err, BUFFERSIZE, 0 ) )
{
sprintf(err, "Error at recv() :%d", WSAGetLastError());
WriteLog(err);
Clear( &Sock );
return false;
}
else
{
WriteLog(err);
}
return true;
}
void MakeCmd(char *cmd, char *strcmd, char* strparam)
{
ZeroMemory(cmd, BUFFERSIZE);
sprintf( cmd, "%s%s%s",strcmd, strparam, "\r\n");
}
bool SendMailCmd(SOCKET sock, char * cmd, char*
response)
{
int retConnect = send(sock, cmd, (int)strlen(cmd),
0);
WriteLog("Send: ");
WriteLog(cmd);
if(SOCKET_ERROR == retConnect)
{
WriteLog("Send Failure.\n");
Clear( &sock );
return false;
}
ZeroMemory(cmd, BUFFERSIZE);
retConnect = recv(sock, cmd, BUFFERSIZE,
0);
if(SOCKET_ERROR == retConnect)
{
WriteLog("Recv Failure.\n");
Clear( &sock );
return false;
}
else
{
WriteLog(cmd);
if ((strlen(response) != 0)&&(response[0] != cmd[0] ||
response[1] != cmd[1] || response[2] != cmd[2]))
{
WriteLog("Unexpected Response.\n");
return false;
}
}
return true;
}
bool GetSMTPServerAddr(char *SmtpServerAddr,char
*sendAddr)
{
char * smtpName;
int startPos;
for (startPos=0; ; startPos++)
{
if ('@' == sendAddr[startPos])
{
startPos++;
break;
}
}
smtpName=sendAddr+startPos;
sprintf(SmtpServerAddr,"smtp.%s",smtpName);
SmtpServerAddr[strlen(SmtpServerAddr)-1]='\0';
return true;
}
bool SendMail(char * un,
char * pw,
char * strMailFrom,
char * strMailTo[],
int nTo,
char * MailHead,
char * MailData
)
{
int i;
SOCKET Sock;
struct sockaddr_in to;
char Buffer[BUFFERSIZE] = {0};
if (false == Initwsa(2, 2))
return false;
GetSMTPServerAddr(Buffer,strMailFrom);
if (false == SetSocket( &Sock, &to, Buffer))
{
Clear( &Sock );
return false;
}
if (false == Connect( Sock, to, sizeof(struct sockaddr_in)))
return false;
MakeCmd(Buffer,"HELO ","ABC");
if(false == SendMailCmd(Sock, Buffer,"250"))return
false;
MakeCmd(Buffer,"AUTH LOGIN ","");
if(false == SendMailCmd(Sock, Buffer,"334"))return
false;
MakeCmd(Buffer,base64_encode(un),"");
if(false == SendMailCmd(Sock, Buffer,"334"))return
false;
MakeCmd(Buffer,base64_encode(pw),"");
if(false == SendMailCmd(Sock, Buffer,"235"))return
false;
MakeCmd(Buffer,"MAIL FROM: ",strMailFrom);
if(false == SendMailCmd(Sock, Buffer,"250"))return
false;
for (i=0;i
{
MakeCmd(Buffer,"RCPT TO: ",strMailTo[i]);
if(false == SendMailCmd(Sock, Buffer,"250")) continue;
}
MakeCmd(Buffer,"DATA","");
if(false == SendMailCmd(Sock, Buffer,"354")) return
false;
strcat(MailHead, "\r\n\r\n");
strcat(MailHead, MailData);
MakeCmd(Buffer,MailHead,"\r\n.");
if(false == SendMailCmd(Sock, Buffer,"250")) return
false;
MakeCmd(Buffer,"QUIT ","");
SendMailCmd(Sock, Buffer,"221");
Clear(&Sock);
return true;
}
//以下函数发送电子邮件
int mysendmail(char neirong[],char dizhi[])
{
char * un="发送邮箱的用户名";
char * pw="发送邮箱的密码";
char * strMailFrom = "发件箱地址";
char * strMailTo[] =
{"","",dizhi};//dizhi是通过函数参数传递来的接收邮箱地址
charmailHead[BUFFERSIZE]={0};
charmailData[BUFFERSIZE]={0};
WriteLog("START");WriteLog("");
strcat(mailHead, "SUBJECT: 这里书写邮件主题");
strcat(mailData,
neirong);//neirong是通过函数参数传递来的邮件内容,也可以在此处直接输入"邮件内容"
SendMail(un,pw,strMailFrom,strMailTo,2,mailHead,mailData);
WriteLog("");
WriteLog("END\n\n");
return 0;
}