小弟最近在做个用SMTP发送邮件的程序
碰到点问题,求大虾们指导
首先是想请教一下套接字连接SMTP服务器,Connect之后应该是"HELO"还是"AUTH LOGIN"?
还有就是我在Connect SMTP服务器后,服务器返回220,表示连接成功了,但是接下来我不管是发送HELO还是AUTH LOGIN服务器都返回421,服务失败,为什么?具体代码如下:
...........connect smtp server...............................
         ...............
         char chrMessage[255]="HELO smtp.163.com\r\n";
memset(chrMessage, 0, sizeof(chrMessage));
if(!theSocket.Send(chrMessage,sizeof(chrMessage)))
{
AfxMessageBox("Could not send to LOGIN!");
return false;
}
if (theSocket.Receive(chrResponse, sizeof(chrResponse)) == SOCKET_ERROR)
{
CString strError;
strError.Format("%d",theSocket.GetLastError());
AfxMessageBox(strError);
return false;
}
strResponse.Format("%s",chrResponse);
if (strResponse.Left(3) != _T("334"))
{
CString strError = "ERROR: Not a valid SMTP server response\r\n";
strError += strResponse;
AfxMessageBox(strError);
theSocket.Send("QUIT\r\n",255);
return false;
          }

解决方案 »

  1.   

    把 HELO 改成 EHLO 试试
      

  2.   

    还是不行,我改成EHLO smtp.163.com
    返回的还是421。:(
      

  3.   

    你这样是是//初使化套接口
    BOOL CSendMail::InitSocket()
    {
    int ret=0; WSADATA wsa;
    ret=WSAStartup(0x0101,&wsa);
    if(ret!=0)
    {
    return FALSE;
    } Sock=socket(AF_INET,SOCK_STREAM,0);
    if(Sock==INVALID_SOCKET)
    {
    return FALSE;
    } int timeo=100;
    ret=setsockopt(Sock,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeo,sizeof(timeo));
    if(ret==SOCKET_ERROR)
    {
    return FALSE;
    } return TRUE;
    }
      

  4.   


    //接收响应码
    BOOL CSendMail::WaitForResponse(char *_code,ULONG _minisec)
    {
    ULONG stick=GetTickCount();
    char szbuf[1024]={0};
    int bytes_in=0;
    while(GetTickCount()-stick<=_minisec)
    {
    bytes_in=recv(Sock,szbuf,sizeof(szbuf),0);
    if(bytes_in>0)
    {
    szbuf[bytes_in]=0;
    if( memcmp(szbuf,_code,3)==0 )
    return TRUE;
    }
    } return FALSE;
    }
      

  5.   


    BOOL CSendMail::CycleSendData(const std::string strdata)
    {
    int rt = 0;
    int iTolLen = strdata.size();
    char *ptr=new char[strdata.size()+1];
    if (ptr==NULL)
    return FALSE;
    strcpy(ptr,strdata.c_str());
    while(iTolLen>0)
    {
    rt = send(Sock,ptr,iTolLen,0);
    Sleep(10);
    if (rt == SOCKET_ERROR)
    {
    closesocket(Sock);
    Sock = INVALID_SOCKET;
    delete[] ptr;
    return FALSE;
    }
    iTolLen -= rt;
    if (iTolLen>0)
    ptr += rt;
    }
    if (ptr != NULL)
    delete[] ptr;
    Sleep(10);
    return TRUE;
    }
      

  6.   

    建议参考描述smtp协议的rfc文档,里面都有参考:
    www.cnanf.com中国协议分析网
      

  7.   

    http://www.vckbase.com/code/listcode.asp?mclsid=9&sclsid=903
      

  8.   

    你把第一个send里面的长度由sizeof(chrMessage)改成strlen(chrMessage)试试。