#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)传入的参数不对,请问应该如何修改~