server.sin_family =AF_INET;
server.sin_addr.s_addr =inet_addr("192.168.1.254");
server.sin_port =htons(25);
    
if(connect(MailSocket,(sockaddr *)&server,sizeof(server))==SOCKET_ERROR)
{
cout<<"can not connect the server"<<endl;
getchar();
return 0; }ret=send(MailSocket,"MAIL FROM:[email protected]\r\n",100,0);
ret=send(MailSocket,"RCPT TO:xx@xxcom\r\n",50,0);
ret=send(MailSocket,"\r\n",4,0);
ret=send(MailSocket,"hello",9,0);
ret=send(MailSocket,"\r\n.\r\n",10,0);
ret=send(MailSocket,"QUIT\r\n",10,0);

解决方案 »

  1.   

    每次发送后都要调用recv来接收服务器的返回消息。
    ret=send(MailSocket,"MAIL FROM:[email protected]\r\n",100,0);
    recv(MailSocket,.............
    ret=send(MailSocket,"RCPT TO:xx@xxcom\r\n",50,0);
    recv(MailSocket,.............
      

  2.   

    应该是:
    ret=send(MailSocket,"MAIL FROM: <[email protected]>\r\n",strlen(,"MAIL FROM: <[email protected]>\r\n"),0);
    ret=send(MailSocket,"RCPT TO: <xx@xxcom>\r\n",strlen(,"RCPT TO: <xx@xxcom>\r\n"),0);
    ret=send(MailSocket,"DATA\r\n",strlen(,"DATA\r\n"),0);
    ret=send(MailSocket,"hello",strlen(,"hello"),0);
    ret=send(MailSocket,"\r\n.\r\n",strlen(,"\r\n.\r\n"),0);
    ret=send(MailSocket,"QUIT\r\n",strlen(,"QUIT\r\n"),0);
      

  3.   

    每次发送后必须用recv接收。
    我一开始没有用recv接收怎么都不行。
    后来才知道!
     要不先试试!
      

  4.   

    //通过需要身份验证的smtp服务器发送邮件的函数(很简陋)
    /*---------------------------------------------------------------------
    //SendMail.c
    //Coder: sjdf
    //E-mail: [email protected]
    //Create date: 2003.10.6
    //Last modify date: 2003.10.8
    //Compiler: LCC 3.8
    //Test platform: Win2000 Adv Server + sp4
    ---------------------------------------------------------------------*/
    #include <winsock2.h>
    #include <windows.h>
    //---------------------------------------------------------------------
    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)
    {
    return 1;
    } //创建套接字
    SOCKET sockid; if ((sockid = socket(AF_INET,SOCK_STREAM,0)) == INVALID_SOCKET)
    {
    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)); 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)
    {
    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)
    {
    return 1;
    } if (strstr(buf, OkCode) == NULL)
    {
    return 1;
    } //发送命令
    if (lstrlen(pSend))
    {
    ZeroMemory(buf, buflen);
    wsprintf(buf, "%s\r\n", pSend); if (send(sockid, buf, lstrlen(buf), 0) == SOCKET_ERROR)
    {
    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;}
      

  5.   

    to sjdf
     好!我是初学者,想问问你的程序能成功的发出邮件吗?我不明白为什么你的顺序是这样的
    “username--->passwd--->helo.....”?好像我看到的是:“helo-->auth login-->username-->passwd”。请指教!
      

  6.   

    如果不需要验证网上很多例子(只要开了SMTP虚拟服务器即可),VCKBASE上很多例子
    不过如果是需要验证的那也只能接受验证了,输入用户名和密码