您的位置:首页 > 编程语言

C通过Smtp发送邮件的代码

2011-06-10 18:03 330 查看
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!");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: