#ifdef _DEBUG
#include <stdio.h>
#endif
#include "GQPSvr.h"
#include <winsock2.h>
#include <windows.h>
//---------------------------------------------------------------------
void Base64(unsigned char chasc[3],unsigned char chuue[4]);
int Talk(SOCKET sockid, const char *OkCode, char *pSend);
//---------------------------------------------------------------------
int SendMail(const SMTPINFO *psmtpinfo)
{
//准备网络连接
WSADATA wsadata;
if (WSAStartup(MAKEWORD(2,2),&wsadata) != 0){
#ifdef _DEBUG
printf("WSAStartup() error : %d\n", GetLastError());
#endif
return 1;
}
//创建套接字
SOCKET sockid;
if ((sockid = socket(AF_INET,SOCK_STREAM,0)) == INVALID_SOCKET){
#ifdef _DEBUG
printf("socket() error : %d\n", GetLastError());
#endif
WSACleanup();
return 1;
}
//得到smtp服务器ip
struct hostent *phostent = gethostbyname(psmtpinfo->SmtpSrvName);
struct sockaddr_in addr;
CopyMemory(&addr.sin_addr.S_un.S_addr,
phostent->h_addr_list[0],
sizeof(addr.sin_addr.S_un.S_addr));
#ifdef _DEBUG
struct in_addr srvaddr;
CopyMemory(&srvaddr, &addr.sin_addr.S_un.S_addr, sizeof(struct in_addr));
printf("Smtp server name is %s\n", psmtpinfo->SmtpSrvName);
printf("Smtp server ip is %s\n", inet_ntoa(srvaddr));
#endif
addr.sin_family = AF_INET;
addr.sin_port = htons(atoi(psmtpinfo->Port));
ZeroMemory(&addr.sin_zero, 8);
//连接服务器
if (connect(sockid, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) == SOCKET_ERROR){
#ifdef _DEBUG
printf("connect() error : %d\n", GetLastError());
#endif
goto STOP;
}
if (Talk(sockid, "220", "EHLO sjdf")){
goto STOP;
}
if (Talk(sockid, "250", "AUTH LOGIN")){
goto STOP;
}
//将用户名和密码转换为base64编码
const int buflen = 256;
char buf[buflen];
int i,userlen,passlen;
ZeroMemory(buf, buflen);
userlen = lstrlen(psmtpinfo->UserName);
passlen = lstrlen(psmtpinfo->Password);
for(i = 0; i < (userlen%3?userlen/3+1:userlen/3); i++){
Base64(psmtpinfo->UserName + i * 3, buf + i * 4);
}
if (Talk(sockid, "334", buf)){
goto STOP;
}
ZeroMemory(buf, buflen);
for(i = 0; i < (passlen%3?passlen/3+1:passlen/3); i++){
Base64(psmtpinfo->Password + i * 3, buf + i * 4);
}
if (Talk(sockid, "334", buf)){
goto STOP;
}
ZeroMemory(buf, buflen);
wsprintf(buf, "MAIL FROM:<%s>", psmtpinfo->From);
if (Talk(sockid, "235", buf)){
goto STOP;
}
ZeroMemory(buf, buflen);
wsprintf(buf, "RCPT TO:<%s>", psmtpinfo->To);
if (Talk(sockid, "250", buf)){
goto STOP;
}
if (Talk(sockid, "250", "DATA")){
goto STOP;
}
ZeroMemory(buf, buflen);
wsprintf(buf, "TO: %s\r\nFROM: %s\r\nSUBJECT: %s\r\n%s\r\n\r\n.",
psmtpinfo->To,psmtpinfo->From,psmtpinfo->Subject,psmtpinfo->Msg);
if (Talk(sockid, "354", buf)){
goto STOP;
}
if (Talk(sockid, "250", "QUIT")){
goto STOP;
}
if (Talk(sockid, "221", "")){
goto STOP;
}
else{
closesocket(sockid);
WSACleanup();
return 0;
}
STOP:
closesocket(sockid);
WSACleanup();
return 1;
}
//---------------------------------------------------------------------
int Talk(SOCKET sockid, const char *OkCode, char *pSend)
{
const int buflen = 256;
char buf[buflen];
ZeroMemory(buf, buflen);
//接收返回信息
if (recv(sockid, buf, buflen, 0) == SOCKET_ERROR){
#ifdef _DEBUG
printf("recv() error : %d\n", GetLastError());
#endif
return 1;
}
#ifdef _DEBUG
printf("%s\n", buf);
#endif
if (strstr(buf, OkCode) == NULL){
#ifdef _DEBUG
printf("Error: recv code != %s\n", OkCode);
#endif
return 1;
}
//发送命令
if (lstrlen(pSend)){
ZeroMemory(buf, buflen);
wsprintf(buf, "%s\r\n", pSend);
#ifdef _DEBUG
printf("%s\n", buf);
#endif
if (send(sockid, buf, lstrlen(buf), 0) == SOCKET_ERROR){
#ifdef _DEBUG
printf("send() error : %d\n", GetLastError());
#endif
return 1;
}
}
return 0;
}
//---------------------------------------------------------------------
//Base64编码,chasc:未编码的二进制代码,chuue:编码过的Base64代码
void Base64(unsigned char chasc[3],unsigned char chuue[4])
{
int i,k=2;
unsigned char t = 0;
for(i=0;i<3;i++){
*(chuue+i)=*(chasc+i)>>k;
*(chuue+i)|=t;
t=*(chasc+i)<<(8-k);
t>>=2;
k+=2;
}
*(chuue+3)=*(chasc+2)&63;
for(i=0;i<4;i++)
if((*(chuue+i)>=0)&&(*(chuue+i)<=25)) *(chuue+i)+=65;
else if((*(chuue+i)>=26)&&(*(chuue+i)<=51)) *(chuue+i)+=71;
else if((*(chuue+i)>=52)&&(*(chuue+i)<=61)) *(chuue+i)-=4;
else if(*(chuue+i)==62) *(chuue+i)=43;
else if(*(chuue+i)==63) *(chuue+i)=47;
} 编译的时候总是提示Base64(psmtpinfo->UserName + i * 3, buf + i * 4)传入的参数不对,请问应该如何修改~
#include <stdio.h>
#endif
#include "GQPSvr.h"
#include <winsock2.h>
#include <windows.h>
//---------------------------------------------------------------------
void Base64(unsigned char chasc[3],unsigned char chuue[4]);
int Talk(SOCKET sockid, const char *OkCode, char *pSend);
//---------------------------------------------------------------------
int SendMail(const SMTPINFO *psmtpinfo)
{
//准备网络连接
WSADATA wsadata;
if (WSAStartup(MAKEWORD(2,2),&wsadata) != 0){
#ifdef _DEBUG
printf("WSAStartup() error : %d\n", GetLastError());
#endif
return 1;
}
//创建套接字
SOCKET sockid;
if ((sockid = socket(AF_INET,SOCK_STREAM,0)) == INVALID_SOCKET){
#ifdef _DEBUG
printf("socket() error : %d\n", GetLastError());
#endif
WSACleanup();
return 1;
}
//得到smtp服务器ip
struct hostent *phostent = gethostbyname(psmtpinfo->SmtpSrvName);
struct sockaddr_in addr;
CopyMemory(&addr.sin_addr.S_un.S_addr,
phostent->h_addr_list[0],
sizeof(addr.sin_addr.S_un.S_addr));
#ifdef _DEBUG
struct in_addr srvaddr;
CopyMemory(&srvaddr, &addr.sin_addr.S_un.S_addr, sizeof(struct in_addr));
printf("Smtp server name is %s\n", psmtpinfo->SmtpSrvName);
printf("Smtp server ip is %s\n", inet_ntoa(srvaddr));
#endif
addr.sin_family = AF_INET;
addr.sin_port = htons(atoi(psmtpinfo->Port));
ZeroMemory(&addr.sin_zero, 8);
//连接服务器
if (connect(sockid, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) == SOCKET_ERROR){
#ifdef _DEBUG
printf("connect() error : %d\n", GetLastError());
#endif
goto STOP;
}
if (Talk(sockid, "220", "EHLO sjdf")){
goto STOP;
}
if (Talk(sockid, "250", "AUTH LOGIN")){
goto STOP;
}
//将用户名和密码转换为base64编码
const int buflen = 256;
char buf[buflen];
int i,userlen,passlen;
ZeroMemory(buf, buflen);
userlen = lstrlen(psmtpinfo->UserName);
passlen = lstrlen(psmtpinfo->Password);
for(i = 0; i < (userlen%3?userlen/3+1:userlen/3); i++){
Base64(psmtpinfo->UserName + i * 3, buf + i * 4);
}
if (Talk(sockid, "334", buf)){
goto STOP;
}
ZeroMemory(buf, buflen);
for(i = 0; i < (passlen%3?passlen/3+1:passlen/3); i++){
Base64(psmtpinfo->Password + i * 3, buf + i * 4);
}
if (Talk(sockid, "334", buf)){
goto STOP;
}
ZeroMemory(buf, buflen);
wsprintf(buf, "MAIL FROM:<%s>", psmtpinfo->From);
if (Talk(sockid, "235", buf)){
goto STOP;
}
ZeroMemory(buf, buflen);
wsprintf(buf, "RCPT TO:<%s>", psmtpinfo->To);
if (Talk(sockid, "250", buf)){
goto STOP;
}
if (Talk(sockid, "250", "DATA")){
goto STOP;
}
ZeroMemory(buf, buflen);
wsprintf(buf, "TO: %s\r\nFROM: %s\r\nSUBJECT: %s\r\n%s\r\n\r\n.",
psmtpinfo->To,psmtpinfo->From,psmtpinfo->Subject,psmtpinfo->Msg);
if (Talk(sockid, "354", buf)){
goto STOP;
}
if (Talk(sockid, "250", "QUIT")){
goto STOP;
}
if (Talk(sockid, "221", "")){
goto STOP;
}
else{
closesocket(sockid);
WSACleanup();
return 0;
}
STOP:
closesocket(sockid);
WSACleanup();
return 1;
}
//---------------------------------------------------------------------
int Talk(SOCKET sockid, const char *OkCode, char *pSend)
{
const int buflen = 256;
char buf[buflen];
ZeroMemory(buf, buflen);
//接收返回信息
if (recv(sockid, buf, buflen, 0) == SOCKET_ERROR){
#ifdef _DEBUG
printf("recv() error : %d\n", GetLastError());
#endif
return 1;
}
#ifdef _DEBUG
printf("%s\n", buf);
#endif
if (strstr(buf, OkCode) == NULL){
#ifdef _DEBUG
printf("Error: recv code != %s\n", OkCode);
#endif
return 1;
}
//发送命令
if (lstrlen(pSend)){
ZeroMemory(buf, buflen);
wsprintf(buf, "%s\r\n", pSend);
#ifdef _DEBUG
printf("%s\n", buf);
#endif
if (send(sockid, buf, lstrlen(buf), 0) == SOCKET_ERROR){
#ifdef _DEBUG
printf("send() error : %d\n", GetLastError());
#endif
return 1;
}
}
return 0;
}
//---------------------------------------------------------------------
//Base64编码,chasc:未编码的二进制代码,chuue:编码过的Base64代码
void Base64(unsigned char chasc[3],unsigned char chuue[4])
{
int i,k=2;
unsigned char t = 0;
for(i=0;i<3;i++){
*(chuue+i)=*(chasc+i)>>k;
*(chuue+i)|=t;
t=*(chasc+i)<<(8-k);
t>>=2;
k+=2;
}
*(chuue+3)=*(chasc+2)&63;
for(i=0;i<4;i++)
if((*(chuue+i)>=0)&&(*(chuue+i)<=25)) *(chuue+i)+=65;
else if((*(chuue+i)>=26)&&(*(chuue+i)<=51)) *(chuue+i)+=71;
else if((*(chuue+i)>=52)&&(*(chuue+i)<=61)) *(chuue+i)-=4;
else if(*(chuue+i)==62) *(chuue+i)=43;
else if(*(chuue+i)==63) *(chuue+i)=47;
} 编译的时候总是提示Base64(psmtpinfo->UserName + i * 3, buf + i * 4)传入的参数不对,请问应该如何修改~
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货