const BYTE Base64ValTab[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
#define AVal(x) Base64ValTab[x]
#pragma comment (lib,"ws2_32.lib")
void printRecv(SOCKET sock)
{
char recvBuff[1024*8];
memset(recvBuff,0,sizeof(recvBuff));
recv(sock,recvBuff,1000,0);
fprintf(cgiOut,"%s<br/>",recvBuff);
}
int EncodingBase64(char * pInput, char * pOutput)
{
int i = 0;
int loop = 0;
int remain = 0;
int iDstLen = 0;
int iSrcLen = (int)strlen(pInput);
loop = iSrcLen/3;
remain = iSrcLen%3;
// also can encode native char one by one as decode method
// but because all of char in native string is to be encoded so encode 3-chars one time is easier.
for (i=0; i < loop; i++)
{
BYTE a1 = (pInput[i*3] >> 2);
BYTE a2 = ( ((pInput[i*3] & 0x03) << 4) | (pInput[i*3+1] >> 4) );
BYTE a3 = ( ((pInput[i*3+1] & 0x0F) << 2) | ((pInput[i*3+2] & 0xC0) >> 6) );
BYTE a4 = (pInput[i*3+2] & 0x3F);
pOutput[i*4] = AVal(a1);
pOutput[i*4+1] = AVal(a2);
pOutput[i*4+2] = AVal(a3);
pOutput[i*4+3] = AVal(a4);
}
iDstLen = i*4;
if (remain == 1)
{
// should pad two equal sign
i = iSrcLen-1;
BYTE a1 = (pInput[i] >> 2);
BYTE a2 = ((pInput[i] & 0x03) << 4);
pOutput[iDstLen++] = AVal(a1);
pOutput[iDstLen++] = AVal(a2);
pOutput[iDstLen++] = '=';
pOutput[iDstLen++] = '=';
pOutput[iDstLen] = 0x00;
}
else if (remain == 2)
{
// should pad one equal sign
i = iSrcLen-2;
BYTE a1 = (pInput[i] >> 2);
BYTE a2 = ( ((pInput[i] & 0x03) << 4) | (pInput[i+1] >> 4));
BYTE a3 = ( (pInput[i+1] & 0x0F) << 2);
pOutput[iDstLen++] = AVal(a1);
pOutput[iDstLen++] = AVal(a2);
pOutput[iDstLen++] = AVal(a3);
pOutput[iDstLen++] = '=';
pOutput[iDstLen] = 0x00;
}
else
{
// just division by 3
pOutput[iDstLen] = 0x00;
}
return iDstLen;
}
enum SendResult {errorusername,ok};
SendResult sendmail(char * smtpServer,int port,char* username,char * password,char* from,char * to,char * subject,char * body)
{
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD( 1, 1 );
WSAStartup( wVersionRequested, &wsaData );
sockaddr_in serverAddr;
SOCKET sock;
hostent * host;
host = gethostbyname(smtpServer);
if(host==NULL)
{
return errorusername;
}
sock = socket(AF_INET, SOCK_STREAM,0);
serverAddr.sin_addr = *(struct in_addr*)host->h_addr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(port);//25
if(connect(sock,(const sockaddr*)&serverAddr,sizeof(sockaddr))==SOCKET_ERROR)
{
closesocket(sock);
return errorusername;
}
char buffer[1024];
sprintf(buffer,"EHLO %s\r\n",from);//from为char数据。存储发送地址
send(sock,buffer,strlen(buffer),0);
printRecv(sock);
sprintf(buffer,"AUTH LOGIN\r\n");
send(sock,buffer,strlen(buffer),0);
printRecv(sock);
//USER NAME
//User name is coded by base64.
EncodingBase64(username,buffer);//先将用户帐号经过base64编码
strcat(buffer,"\r\n");
send(sock,buffer,strlen(buffer),0);
printRecv(sock);
//password coded by base64
EncodingBase64(password,buffer);//先将密码经过base64编码
strcat(buffer,"\r\n");
send(sock,buffer,strlen(buffer),0);
printRecv(sock);
sprintf(buffer,"MAIL FROM:<%s>\r\n",from);
send(sock,buffer,strlen(buffer),0);
printRecv(sock);
sprintf(buffer,"RCPT TO: <%s>\r\n",to);
send(sock,buffer,strlen(buffer),0);
printRecv(sock);
//memset(buffer,0,sizeof(buffer));
sprintf(buffer,"DATA\r\n");
send(sock,buffer,strlen(buffer),0);
printRecv(sock);
sprintf(buffer,"Subject: %s.\n\r\n",subject);
//DATA head
send(sock,buffer,strlen(buffer),0);
sprintf(buffer,"%s.\r\n.\r\n",body);
//DATA body
send(sock,buffer,strlen(buffer),0);
printRecv(sock);
strcpy(buffer,"QUIT\r\n");
send(sock,buffer,strlen(buffer),0);
printRecv(sock);
closesocket(sock);
WSACleanup();
return ok;
}
调用测试:
sendmail("smtp.163.com",25,"itcast0420@163.com","123456","itcast0420@163.com","yzk@rupeng.com","miss you","we are the world!");
如鹏网.Net培训班正在报名,有网络的地方就可以参加如鹏网的学习,学完就能高薪就业,点击此处了解
三年前只要懂“三层架构”就可以说“精通分层架构”;现在则需要懂IOC(AutoFac等)、CodeFirst、lambda、DTO等才值钱;
三年前只要会SQLServer就可以说自己“精通数据库开发”;现在则需还需要掌握MySQL等开源数据库才能说是“.Net开源”时代的程序员;
三年前只要会进行用户上传内容的安全性处理即可;现在则需要熟悉云存储、CDN等才能在云计算时代游刃有余;
三年前只要掌握Lucene.Net就会说自己“熟悉站内搜索引擎开发”;现在大家都用ElasticSearch了,你还用Lucene.Net就太老土了;
三年前发邮件还是用SmtpClient;现在做大型网站发邮件必须用云邮件引擎;
三年前缓存就是Context.Cache;现在则是Redis、Memcached的天下;
如鹏网再次引领.Net社区技术潮流!点击此处了解如鹏网.Net最新课程