首选连上smtp.163.net
lstrcpy(lpBuffer,"HELO [email protected]\r\n");
if (send(sock,lpBuffer,lstrlen(lpBuffer),0)==SOCKET_ERROR)
{
WSACleanup();
return;
}
recv(sock,lpBuffer2,sizeof(lpBuffer2),0);
服务器返回220,显然这是错误信息的返回,请问高手这是为什么。
我对STMP的通信语法不是很熟悉

解决方案 »

  1.   

    全代码如下:
    WSADATA wsaData;
    char lpBuffer[MAX_PATH*2];
    SOCKADDR_IN addrIn;
    SOCKET sock;
    CString strMsg; if (WSAStartup(2,&wsaData)!=0)
    return;
    sock=socket(AF_INET,SOCK_STREAM,0);
    if (sock==INVALID_SOCKET)
    {
    WSACleanup();
    return;
    }
    PHOSTENT pHostent=::gethostbyname("smtp.163.net");
    addrIn.sin_addr= *((in_addr*)(pHostent->h_addr_list[0]));
    addrIn.sin_family=AF_INET;
    addrIn.sin_port =htons(25);
    if (connect(sock,(sockaddr*) &addrIn,sizeof(addrIn))==SOCKET_ERROR)
    {
    WSACleanup();
    return;
    }
    lstrcpy(lpBuffer,"HELO [email protected]\r\n");
    if (send(sock,lpBuffer,lstrlen(lpBuffer),0)==SOCKET_ERROR)
    {
    WSACleanup();
    return;
    }
    if (EmailCheckResponse(sock,HELLO_CHECK,strMsg)==FALSE)
    {
    MessageBox(strMsg);
                      //EmailCheckResponse函数检测到服务器返回220,返回FALSE }
      

  2.   

    220并不是错误码,
    是SMTP服务器的返回码,
    表示已经准备好,
    准备发信
    流程是这样的:
    connect服务器,
    收到220返回码,
    HELO ...
      

  3.   

    WSADATA wsaData;
    char lpBuffer[MAX_PATH*2];
    SOCKADDR_IN addrIn;
    SOCKET sock;
    CString strMsg; if (WSAStartup((WORD)2,&wsaData)!=0)
    return;
    sock=socket(AF_INET,SOCK_STREAM,0);
    if (sock==INVALID_SOCKET)
    {
    WSACleanup();
    return;
    }
    PHOSTENT pHostent=::gethostbyname("smtp.163.net");
    addrIn.sin_addr= *((in_addr*)(pHostent->h_addr_list[0]));
    addrIn.sin_family=AF_INET;
    addrIn.sin_port =htons(25);
    connect(sock,(sockaddr*) &addrIn,sizeof(addrIn); lstrcpy(lpBuffer,"HELO [email protected]\r\n");
    send(sock,lpBuffer,lstrlen(lpBuffer),0); lstrcpy(lpBuffer,"MAIL From:<[email protected]>\r\n");
    send(sock,lpBuffer,lstrlen(lpBuffer),0); lstrcpy(lpBuffer,"RCPT TO:<[email protected]>\r\n");
    send(sock,lpBuffer,lstrlen(lpBuffer),0);         lstrcpy(lpBuffer,"DATA\r\n");
    send(sock,lpBuffer,lstrlen(lpBuffer),0); lstrcpy(lpBuffer,"SUBJECT:test\r\n");
    send(sock,lpBuffer,lstrlen(lpBuffer),0); lstrcpy(lpBuffer,"test message\r\n");
    send(sock,lpBuffer,lstrlen(lpBuffer),0); lstrcpy(lpBuffer,".\r\n");
    send(sock,lpBuffer,lstrlen(lpBuffer),0); lstrcpy(lpBuffer,"QUIT \r\n");
    send(sock,lpBuffer,lstrlen(lpBuffer),0); ::closesocket(sock);
    MessageBox("finished");
    //结果用FoxMail收不到邮件
      

  4.   

    程序没有任何问题,
    但是163.net需要SMTP认证,
    所以,在
    lstrcpy(lpBuffer,"MAIL From:<[email protected]>\r\n");
    send(sock,lpBuffer,lstrlen(lpBuffer),0);
    这一步时已经返回553错误了你可以先telnet上163的SMTP服务器的25号端口,
    直接敲入这些命令来测试。
      

  5.   

    今天晚上我已经试验过你的程序,
    没有问题,
    除了connect少了一个)外,
    我想使无意的。
    完全可以发送成功,
    但有些服务器需要SMTP认证,
    例如371,sohu的,
    你可以在每个send后加一个
    recv语句,接收返回值,
    再跟踪调试,
    其中写的很清楚了,
    我试了信箱www.huyou.com完全可以的
      

  6.   

    请问高手向需要SMTP认证的服务器发送邮件应该在我的代码加上
    什么呢才行呢?成万分感谢。
      

  7.   

    据我了解,一些服务器设置了认证,
    是因为防止垃圾邮件的发送,
    SMTP服务器要求必须是本服务器的用户,
    所以如果你是它的用户,
    就可以进行认证,
    你可以去使用免费的MFC类CSMTPConnection(http://www.naughter.com/smtp.html),
    但如果你不是用户,
    那我就没有办法了,
    如果你发现办法了,一定要告诉我,呵呵