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!");
#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!");
相关文章推荐
- 通过SMTP发送邮件的Python代码
- oracle存储过程通过SMTP发送E-MAIL邮件代码
- Oracle PLSQL通过SMTP发送E-MAIL邮件代码
- Delphi通过IdSmtp发送邮件的简单代码
- Oracle PLSQL通过SMTP发送E-MAIL邮件代码
- 使用phantomjs实现highcharts等报表通过邮件发送(本文仅提供完整解决方案和实现思路,完全照搬不去整理代码无法马上得到效果)
- Spring代码实例系列-10:通过Spring Mail发送简单邮件、附件和HTML邮件
- python使用smtplib模块通过gmail实现邮件发送的方法
- python使用smtplib模块通过gmail实现邮件发送的方法
- smtp发送带附件的邮件代码分享
- Python的SMTP邮件发送代码
- VBS通过SMTP发送邮件
- Java实现通过smtp服务器向指定邮箱发送邮件
- Zabbix监控之邮件发送失败-smtp-server: 错误代码550与535 推荐
- python3利用smtplib通过qq邮箱发送邮件方法示例
- 使用PowerShell通过Smtp发送邮件
- java通过SMTP发送QQ邮件的完全步骤
- 在asp.NET 中使用SMTP发送邮件的实现代码
- 通过smtp验证发送邮件的perl脚本
- SMTP 通过程序发送邮件