[code=c] hostent *shost;
shost = gethostbyname("smtp.163.com");
SOCKADDR_IN soaddr;
soaddr.sin_family = AF_INET;
soaddr.sin_port = htons(25);
soaddr.sin_addr.S_un.S_addr = *(ULONG *)(shost->h_addr_list[0]); client = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (client == INVALID_SOCKET)
{
return ;
}
if (SOCKET_ERROR == connect(client,(sockaddr*)&soaddr,sizeof((soaddr))))
{
MessageBox(NULL,"tsadfasd",NULL);
}
char buff[1024] = {0};
recv(client,buff,1024,0);
send(client,"ehlo hao\r\n",strlen("helo hao\r\n"),0);
recv(client,buff,1024,0); send(client,"auth login\r\n",strlen("auth login\r\n"),0);
recv(client,buff,1024,0);
//AfxMessageBox(buff);
send(client,"Z2c2NTI1XEXX\r\n",strlen("Z2c2NTI1XEXX\r\n"),0);//base64账号 我在这里就不写真号了
recv(client,buff,1024,0);

send(client,"MTM1NDU0OTc2cqq=\r\n",strlen("MTM1NDU0OTc2cqq=\r\n"),0););//base64密码 我在这里就不写真号了 recv(client,buff,1024,0);
send(client,"mail from:<[email protected]>\r\n",strlen("mail from:<[email protected]>\r\n"),0);
recv(client,buff,1024,0);
send(client,"rcpt to:<[email protected]>\r\n",strlen("rcpt to:<[email protected]>\r\n"),0);
recv(client,buff,1024,0);

send(client,"DATA\r\n",strlen("DATA\r\n"),0);
recv(client,buff,1024,0);
////在这里一切都是正常//////////////////就这里最后一步不知道怎么发邮件了
    char str[]="from:[email protected]\r\nto:[email protected]\r\nsubject:sss\r\nssdsfsdf\r\n.\r\n";
send(client,str,strlen(str),0);
//////////////////就这里最后一步不知道怎么发邮件了我用telnet 发smtp协议邮件  正常
把代码办到vc里面 就最后一步 不正常求指教smtp邮件vc

解决方案 »

  1.   


    int CDlg::SendEmail(char* pFile,char* pReciver,char* pSubject,char* pContent)
    {
    int nRet = -1;
    if (pReciver == NULL)
    {
    return 1;
    }
    if (NULL == pSubject)
    {
    //主题是否为空
    }
    if (NULL == pContent)
    {
    //内容是否为空
    } WSAData data;
    int error;
    error = WSAStartup(MAKEWORD(2, 2), &data);
    if (0 != error)
    {
    return -1;
    }
    if(HIBYTE(data.wVersion) != 2 && LOBYTE(data.wVersion))    
    {         
    WSACleanup();         
    return -1;     
    }
    SOCKET sConn = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); SOCKADDR_IN sock_addr = { 0 } ;  
    sock_addr.sin_family = AF_INET;
    sock_addr.sin_port = htons(25);
      struct hostent *phost = gethostbyname("smtp.163.com");
      memcpy(&sock_addr.sin_addr.S_un.S_addr , phost->h_addr_list[0] , phost->h_length );  if (connect(sConn,(SOCKADDR*)&sock_addr,sizeof(SOCKADDR_IN)))
    {
    //未连接
    int nError = GetLastError();
    TRACE("ERROR = %d",nError);
    nRet = 1;
    closesocket(sConn);
    return nRet;
    } char szTemp[1024] = {0};
    if (recv(sConn,szTemp,1024,0) > 0)
    {
    int response = -1;
    CString sResponse = szTemp;
    sscanf((LPCTSTR)sResponse.Left(3), _T("%d"), &response);
    if (response != 220)
    {
    //邮箱服务器不可用
    nRet = 2;
    closesocket(sConn);
    return nRet;
    }
    } CString strSend;
    strSend.Format(_T("EHLO %s\r\n"), "smtp.163.com"); if (send(sConn,(char*)strSend.GetBuffer(),strSend.GetLength(),0) > 0)
    {
    memset(szTemp,0,1024);
    if (recv(sConn,szTemp,1024,0) > 0)
    {
    int response = -1;
    CString sResponse = szTemp;
    sscanf((LPCTSTR)sResponse.Left(3), _T("%d"), &response);
    if (response != 250)
    {
    //服务器错误
    nRet = 3;
    closesocket(sConn);
    return nRet;
    }
    }
    }
    strSend.Empty();
    strSend = "AUTH LOGIN\r\n";
    if (send(sConn,(char*)strSend.GetBuffer(),strSend.GetLength(),0) > 0)
    {
    memset(szTemp,0,1024);
    if (recv(sConn,szTemp,1024,0) > 0)
    {
    int response = -1;
    CString sResponse = szTemp;
    sscanf((LPCTSTR)sResponse.Left(3), _T("%d"), &response);
    if (response != 334)
    {
    //验证连接错误
    nRet = 4;
    closesocket(sConn);
    return nRet;
    }
    }
    }
    CBase64 Base64;
    strSend.Empty();
    strSend.Format("%s\r\n", Base64.Encode(m_szUserName, strlen(m_szUserName)));
    if (send(sConn,(char*)strSend.GetBuffer(),strSend.GetLength(),0) > 0)
    {
    memset(szTemp,0,1024);
    if (recv(sConn,szTemp,1024,0) > 0)
    {
    int response = -1;
    CString sResponse = szTemp;
    sscanf((LPCTSTR)sResponse.Left(3), _T("%d"), &response);
    if (response != 334)
    {
    //验证连接错误
    nRet = 4;
    closesocket(sConn);
    return nRet;
    }
    }
    } strSend.Empty();
    strSend.Format("%s\r\n", Base64.Encode(m_szPassWord, strlen(m_szPassWord)));
    if (send(sConn,(char*)strSend.GetBuffer(),strSend.GetLength(),0) > 0)
    {
    memset(szTemp,0,1024);
    if (recv(sConn,szTemp,1024,0) > 0)
    {
    int response = -1;
    CString sResponse = szTemp;
    sscanf((LPCTSTR)sResponse.Left(3), _T("%d"), &response);
    if (response != 235)
    {
    //用户名或密码验证错误
    nRet = 5;
    closesocket(sConn);
    return nRet;
    }
    }
    } strSend.Empty();
    strSend.Format(_T("MAIL FROM:<%s>\r\n"), XXXXX);//[email protected]
    if (send(sConn,(char*)strSend.GetBuffer(),strSend.GetLength(),0) > 0)
    {
    memset(szTemp,0,1024);
    if (recv(sConn,szTemp,1024,0) > 0)
    {
    int response = -1;
    CString sResponse = szTemp;
    sscanf((LPCTSTR)sResponse.Left(3), _T("%d"), &response);
    if (response != 250)
    {
    //邮箱服务器错误
    nRet = 6;
    closesocket(sConn);
    return nRet;
    }
    }
    } strSend.Empty();
    strSend.Format(_T("RCPT TO:<%s>\r\n"),pReciver);
    if (send(sConn,(char*)strSend.GetBuffer(),strSend.GetLength(),0) > 0)
    {
    memset(szTemp,0,1024);
    if (recv(sConn,szTemp,1024,0) > 0)
    {
    int response = -1;
    CString sResponse = szTemp;
    sscanf((LPCTSTR)sResponse.Left(3), _T("%d"), &response);
    if (response != 250)
    {
    //邮箱服务器错误
    nRet = 7;
    closesocket(sConn);
    return nRet;
    }
    }
    } strSend.Empty();
    strSend = "DATA\r\n";
    if (send(sConn,(char*)strSend.GetBuffer(),strSend.GetLength(),0) > 0)
    {
    memset(szTemp,0,1024);
    if (recv(sConn,szTemp,1024,0) > 0)
    {
    int response = -1;
    CString sResponse = szTemp;
    sscanf((LPCTSTR)sResponse.Left(3), _T("%d"), &response);
    if (response != 354)
    {
    //邮箱服务器不能接收数据
    nRet = 8;
    closesocket(sConn);
    return nRet;
    }
    }
    }
    CString szFrom;
    CString szTo;
    CString szDateTime;
    CString szSubject;
    CString szBodyHead;
    CString szBody;
    CString szContent;
    CString szAttachment;
    CString strTemp; szFrom.Format(_T("FROM:%s<%s>\r\n"),xxxxx,xxxxxx);
    szTo.Format(_T("TO:<%s>\r\n"),pReciver);
    CTime tDateTime = tDateTime.GetCurrentTime();
    szDateTime = "Date:";
    szDateTime += tDateTime.Format("%a, %d %b %Y %H:%M:%S %Z");
    szDateTime += "\r\n";
    szSubject.Format(_T("Subject:%s\r\n"),pSubject);
    szBodyHead = "X-Mailer: Test [ch]\r\n";
    szBodyHead += "MIME_Version:1.0\r\n";
    szBodyHead += "Content-type:multipart/mixed;Boundary=Test\r\n\r\n";
    szBodyHead += "--Test\r\n";
    szBodyHead += "Content-type:text/plain;Charset=gb2312\r\n";
    szBodyHead += "Content-Transfer-Encoding:8bit\r\n\r\n";
    szBody.Format(_T("%s\r\n\r\n"), pContent); //以下进行附件的处理:
    if(pFile[0] != '\0')
    {
    strTemp = "--Test\r\n";
    strTemp += "Content-Type:application/octet-stream;Name=%s\r\n";
    strTemp += "Content-Disposition:attachment;FileName=%s\r\n";
    strTemp += "Content-Transfer-Encoding:Base64\r\n\r\n";
    strTemp += "%s\r\n\r\n"; szContent = szFrom + szTo + szDateTime + szSubject + szBodyHead + szBody; char sep[2] = ";";
    char* pPos = NULL;
    char* token = NULL;
    char* next;
    int nCount = 0;
    token = strtok_s(pFile,sep,&next);
    while (token != NULL)
    {
    CFile hFile;
    if(hFile.Open(token, CFile::modeRead))
    {
    DWORD dwFileSize = hFile.GetLength();
    CString szFileBuffer;
    hFile.Read(szFileBuffer.GetBuffer(dwFileSize), dwFileSize);
    szAttachment.Format(strTemp.GetBuffer(), hFile.GetFileName(), hFile.GetFileName(), Base64.Encode(szFileBuffer, dwFileSize));
    szFileBuffer.ReleaseBuffer();
    hFile.Close();
    szContent += szAttachment;
    }
    else
    {
    int nError = GetLastError();
    TRACE("ERROR = %d\n",nError);
    nRet = 9;
    closesocket(sConn);
    return nRet;
    }
    token = strtok_s(NULL, sep, &next);
    }
    szContent += "--Test--\r\n.\r\n";
    }
    else
    {
    szContent = szFrom + szTo + szDateTime + szSubject + szBodyHead + szBody + "--Test" + "\r\n.\r\n";
    } if (send(sConn,(char*)szContent.GetBuffer(),szContent.GetLength(),0) > 0)
    {
    memset(szTemp,0,1024);
    if (recv(sConn,szTemp,1024,0) > 0)
    {
    int response = -1;
    CString sResponse = szTemp;
    sscanf((LPCTSTR)sResponse.Left(3), _T("%d"), &response);
    if (response != 250)
    {
    //邮箱服务器错误
    nRet = 10;
    closesocket(sConn);
    return nRet;
    }
    }
    } strSend.Empty();
    strSend = "QUIT\r\n";
    if (send(sConn,(char*)strSend.GetBuffer(),strSend.GetLength(),0) > 0)
    {
    memset(szTemp,0,1024);
    if (recv(sConn,szTemp,1024,0) > 0)
    {
    int response = -1;
    CString sResponse = szTemp;
    sscanf((LPCTSTR)sResponse.Left(3), _T("%d"), &response);
    if (response != 221)
    {
    //没有中止会话
    nRet = 11;
    closesocket(sConn);
    return nRet;
    }
    }
    }
    nRet = 0;
    return nRet;
    }
    xxxxx的地方你改改.
    给分吧....
      

  2.   

    内容最后的\r\n.\r\n改成\r\n\r\n试试  应该是你的结束符没发送对 服务器还在等...
      

  3.   

    没用哦!
    我就是最后一句格式错了 
    不知道怎么改smtp协议中  '.' 表示发信内容结束. 你把'.' 改掉了. 我试了没用
      

  4.   

    char str[]="ssdsfsdf\r\n.\r\n";
    send(client,str,strlen(str),0);这样可以吗?
      

  5.   

    这样不行啊! 没加 subject: from:  to:   
      

  6.   

    这样不行啊! 没加 subject: from:  to:   只是让你测试下 看下是不是中间的字符有问题之类的  内容可以乱写的啊 又不一样要subject: from:  to: 这几个标签...
      

  7.   

     char str[]="from:<[email protected]>\r\nto:<[email protected]>\r\nsubject:sss\r\nssdsfsdf\r\n.\r\n";
      

  8.   

    FROM:[email protected]<[email protected]>
    TO:<[email protected]>
    Date:Thu, 31 Oct 2013 18:23:28 中国标准时间
    Subject:关于测试的问题
    X-Mailer: Test [ch]
    MIME_Version:1.0
    Content-type:multipart/mixed;Boundary=Test--Test
    Content-type:text/plain;Charset=gb2312
    Content-Transfer-Encoding:8bit您好! 欢迎来到测试天地. 谢谢!--Test
    .
    上面就是格式
      

  9.   

    还是不懂 能否帮我 格式化成 char str[]="xxxxxxxxxxx";
      

  10.   

    没见过你这样的...char str[] = “FROM:[email protected]<[email protected]>\r\nTO:<[email protected]>\r\nDate:Thu, 31 Oct 2013 18:23:28 中国标准时间\r\nSubject:关于测试的问题\r\nX-Mailer: Test [ch]\r\nMIME_Version:1.0\r\nContent-type:multipart/mixed;Boundary=Test\r\n\r\n--Test\r\nContent-type:text/plain;Charset=gb2312\r\nContent-Transfer-Encoding:8bit\r\n\r\n您好! 欢迎来到测试天地. 谢谢!\r\n\r\n--Test\r\n.\r\n”
      

  11.   

    我代码都给你了,上面的代码还是封装好的,可以直接拿来就用.
    最后这些东西都是rfc文档,具体哪个忘了,自己去搜搜