论坛: 编程破解 标题: 发送电子邮件(VC)各位都进来帮帮忙看看 复制本贴地址    
作者: battle [battle]    论坛用户   登录
typedef struct _SMTPINFO
{
    char SmtpSrvName[32];
    char Port[7];
    char UserName[16];
    char Password[16];
    char From[32];
    char To[32];
    char Subject[32];
    char *msg;

}SMTPINFO;

int SendMail(const SMTPINFO *psmtpinfo);
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", "AUTH LOGIN"))
    {
        goto STOP;
    }

    //将用户名和密码转换为base64编码
    const int buflen = 128;
    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;
    }

    if (Talk(sockid, "235", "HELO sjdf"))
    {
        goto STOP;
    }

    ZeroMemory(buf, buflen);
    wsprintf(buf, "MAIL FROM:%s", psmtpinfo->From);

    if (Talk(sockid, "250", 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 = 128;
    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(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(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;

}
运行时出现下面这个错误
error C2664: 'Base64' : cannot convert parameter 1 from 'const char *' to 'unsigned char []'Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
请各位朋友,还帮忙看看问题在哪


[此贴被 特务(battle) 在 07月22日17时27分 编辑过]

地主 发表时间: 04-07-22 17:26

回复: 286 [unique]   版主   登录
void Base64(unsigned char chasc[3],unsigned char chuue[4])

void Base64(unsigned char *chasc,unsigned char *chuue)

B1层 发表时间: 04-07-22 17:59

回复: battle [battle]   论坛用户   登录
不行,我改了,还是报错,错的是这两句

for(i = 0; i < (userlen%3?userlen/3+1:userlen/3); i++)
{
    Base64(psmtpinfo->UserName + i * 3, buf + i * 4);
}

for(i = 0; i < (passlen%3?passlen/3+1:passlen/3); i++)
{
    Base64(psmtpinfo->Password + i * 3, buf + i * 4);
}

error C2664: 'Base64' : cannot convert parameter 1 from 'const char *' to 'unsigned char *'Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast



B2层 发表时间: 04-07-22 18:06

回复: LionD8 [liond8]   论坛用户   登录
#include "winsock2.h"
#include "windows.h"
#include "stdio.h"

const int buflen = 128;

typedef struct _SMTPINFO
{
    char SmtpSrvName[32];
    char Port[7];
    char UserName[16];
    char Password[16];
    char From[32];
    char To[32];
    char Subject[32];
    char *msg;

}SMTPINFO;

int SendMail(const SMTPINFO *psmtpinfo);
void Base64(unsigned char* chasc,unsigned char* chuue);
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", "AUTH LOGIN"))
    {
        goto STOP;
    }

    //将用户名和密码转换为base64编码
    char buf[128];
    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((UCHAR*)(psmtpinfo->UserName + i * 3), (UCHAR*)(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((UCHAR*)(psmtpinfo->Password + i * 3), (UCHAR*)(buf + i * 4));
    }

    if (Talk(sockid, "334", buf))
    {
        goto STOP;
    }

    if (Talk(sockid, "235", "HELO sjdf"))
    {
        goto STOP;
    }

    ZeroMemory(buf, buflen);
    wsprintf(buf, "MAIL FROM:%s", psmtpinfo->From);

    if (Talk(sockid, "250", 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 = 128;
    char buf[128];
    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(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(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,unsigned char* chuue)
{
    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;

}

修改了一点 编译是通过了 不知道 你不是你想要的结果

B3层 发表时间: 04-07-23 12:17

回复: battle [battle]   论坛用户   登录
谢谢!!
编译是成功了,,

但好象信发不出去哦,有时间帮忙看看问题在哪


[此贴被 特务(battle) 在 07月23日19时59分 编辑过]

B4层 发表时间: 04-07-23 19:51

回复: leonshoh [leonshoh]   论坛用户   登录
SMTP发163,sina,sohu想都不要想了,有MX验证,除非在他们的红名单里面,不然一律认为是垃圾邮件过滤,如果DATA部分格式没有遵循RFC文档的话,象21cn也拒收。

用ESMTP通过验证的话就可以扔邮件了,不过DATA部分要遵循RFC文档...

B5层 发表时间: 04-07-24 14:29

回复: battle [battle]   论坛用户   登录
是smtp验证的啊!!

B6层 发表时间: 04-07-24 16:24

回复: pwycctv [pwycctv]   论坛用户   登录
我怎么一点也看不懂


B7层 发表时间: 04-07-28 19:19

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号