其中第四章的smtp程序怎么在编译后提示must be connect!
  是不是csmtp没有封装好
csmtp源程序如下:
//smtp.cpp#include "../stdafx.h"
#include "SMTP.h"#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif// Static member initializers
//// Note: the order of the entries is important.
//       They must be synchronized with eResponse entries. 
CSMTP::response_code CSMTP::response_table[] =
{
{ 250, _T( "SMTP server error" ) },

{ 220, _T( "SMTP server not available" ) },

{ 354, _T( "SMTP server not ready for data" ) },

{ 221, _T( "SMTP server didn't terminate session" ) }
};
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////CSMTP::CSMTP( LPCTSTR szSMTPServerName, UINT nPort )
{
ASSERT( szSMTPServerName != NULL );
AfxSocketInit();
m_sSMTPServerHostName = szSMTPServerName;
m_nPort = nPort;
m_bConnected = FALSE;
m_sError = _T( "OK" );
response_buf = NULL;
}CSMTP::~CSMTP()
{
Disconnect();
}CString CSMTP::GetServerHostName()
{
return m_sSMTPServerHostName;
}
BOOL CSMTP::Connect()
{
CString sHello;
TCHAR local_host[ 80 ];
if( m_bConnected )
return TRUE;
try
{

response_buf = new TCHAR[ RESPONSE_BUFFER_SIZE ];
if( response_buf == NULL )
{
m_sError = _T( "Not enough memory" );
return FALSE;
}
} catch( CException *e )
{
response_buf = NULL;
m_sError = _T( "Not enough memory" );
delete e;
return FALSE;
} if( !m_wsSMTPServer.Create() )
{
m_sError = _T( "Unable to create the socket." );
delete response_buf;
response_buf = NULL;
return FALSE;
} if( !m_wsSMTPServer.Connect( GetServerHostName(), GetPort() ) )
{
m_sError = _T( "Unable to connect to server" );
m_wsSMTPServer.Close();
delete response_buf;
response_buf = NULL;
return FALSE;
} if( !get_response( CONNECT_SUCCESS ) )
{
m_sError = _T( "Server didn't respond." );
m_wsSMTPServer.Close();
delete response_buf;
response_buf = NULL;
return FALSE;
}
gethostname( local_host, 80 );

sHello.Format( _T( "HELO %s\r\n" ), local_host );
m_wsSMTPServer.Send( (LPCTSTR)sHello, sHello.GetLength() );

if( !get_response( GENERIC_SUCCESS ) )
{
m_wsSMTPServer.Close();
delete response_buf;
response_buf = NULL;
return FALSE;
}
m_bConnected = TRUE;
return TRUE;
}BOOL CSMTP::Disconnect()
{
BOOL ret;
if( !m_bConnected )
return TRUE;
//·¢ËÍQUITÃüÁî
CString sQuit = _T( "QUIT\r\n" );
m_wsSMTPServer.Send( (LPCTSTR)sQuit, sQuit.GetLength() );
//¹Ø±ÕSocket
ret = get_response( QUIT_SUCCESS );
m_wsSMTPServer.Close();

if( response_buf != NULL )
{
delete[] response_buf;
response_buf = NULL;
}

m_bConnected = FALSE;
return ret;
}UINT CSMTP::GetPort()
{
return m_nPort;
}CString CSMTP::GetLastError()
{
return m_sError;
}BOOL CSMTP::SendMessage(CMailMessage * msg)
{
ASSERT( msg != NULL );
if( !m_bConnected )
{
m_sError = _T( "Must be connected" );
return FALSE;
}
if( FormatMailMessage( msg ) == FALSE )
{
return FALSE;
}
if( transmit_message( msg ) == FALSE )
{
return FALSE;
}
return TRUE;
}BOOL CSMTP::FormatMailMessage( CMailMessage* msg )
{
ASSERT( msg != NULL );
   if( msg->GetNumRecipients() == 0 )
{
m_sError = _T( "No Recipients" );
return FALSE;
}
msg->FormatMessage();
return TRUE;
}void CSMTP::SetServerProperties( LPCTSTR szSMTPServerName, UINT nPort)
{
ASSERT( szSMTPServerName != NULL );
// Needs to be safe in non-debug too
if( szSMTPServerName == NULL )
return;
m_sSMTPServerHostName = szSMTPServerName;
m_nPort = nPort;
}
CString CSMTP::cook_body(CMailMessage * msg)
{
ASSERT( msg != NULL );
CString sTemp;
CString sCooked = _T( "" );

LPTSTR szBad = _T( "\r\n.\r\n" );
LPTSTR szGood = _T( "\r\n..\r\n" );
int nPos;
int nStart = 0;
int nBadLength = strlen( szBad );
sTemp = msg->m_sBody;

if( sTemp.Left( 3 ) == _T( ".\r\n" ) )
sTemp = _T( "." ) + sTemp; while( (nPos = sTemp.Find( szBad )) > -1 )
{
sCooked = sTemp.Mid( nStart, nPos );
sCooked += szGood;
sTemp = sCooked + sTemp.Right( sTemp.GetLength() - (nPos + nBadLength) );
}
return sTemp;
}
BOOL CSMTP::transmit_message(CMailMessage * msg)
{
CString sFrom;
CString sTo;
CString sTemp;
CString sEmail;

ASSERT( msg != NULL );
if( !m_bConnected )
{
m_sError = _T( "Must be connected" );
return FALSE;
}
//·¢ËÍ MAIL FROM:ÃüÁî
sFrom.Format( _T( "MAIL From: <%s>\r\n" ), (LPCTSTR)msg->m_sFrom );
m_wsSMTPServer.Send( (LPCTSTR)sFrom, sFrom.GetLength() );
if( !get_response( GENERIC_SUCCESS ) )
return FALSE;

for( int i = 0; i < msg->GetNumRecipients(); i++ )
{
msg->GetRecipient( sEmail, sTemp, i );
sTo.Format( _T( "RCPT TO: <%s>\r\n" ), (LPCTSTR)sEmail );
m_wsSMTPServer.Send( (LPCTSTR)sTo, sTo.GetLength() );
get_response( GENERIC_SUCCESS );
}

for( i = 0; i < msg->GetNumRecipients(CMailMessage::CC); i++ )
   {
msg->GetRecipient( sEmail, sTemp, i, CMailMessage::CC );
sTo.Format( _T( "RCPT TO: <%s>\r\n" ), (LPCTSTR)sEmail );
m_wsSMTPServer.Send( (LPCTSTR)sTo, sTo.GetLength() );
get_response( GENERIC_SUCCESS );
   }

for( i = 0; i < msg->GetNumRecipients(CMailMessage::BCC); i++ )
   {
msg->GetRecipient( sEmail, sTemp, i, CMailMessage::BCC );
sTo.Format( _T( "RCPT TO: <%s>\r\n" ), (LPCTSTR)sEmail );
m_wsSMTPServer.Send( (LPCTSTR)sTo, sTo.GetLength() );
get_response( GENERIC_SUCCESS );
   }


sTemp = _T( "DATA\r\n" );
m_wsSMTPServer.Send( (LPCTSTR)sTemp, sTemp.GetLength() );
if( !get_response( DATA_SUCCESS ) )
{
return FALSE;
}

m_wsSMTPServer.Send( (LPCTSTR)msg->m_sHeader, msg->m_sHeader.GetLength() );


sTemp = cook_body( msg );

m_wsSMTPServer.Send( (LPCTSTR)sTemp, sTemp.GetLength() );

sTemp = _T( "\r\n.\r\n" );
m_wsSMTPServer.Send( (LPCTSTR)sTemp, sTemp.GetLength() );
if( !get_response( GENERIC_SUCCESS ) )
{
return FALSE;
}
return TRUE;
}BOOL CSMTP::get_response( UINT response_expected )
{

ASSERT( response_expected >= GENERIC_SUCCESS );
ASSERT( response_expected < LAST_RESPONSE );

CString sResponse;
UINT response;
response_code* pResp;
//&frac12;&Oacute;&Ecirc;&Uuml;&Iuml;ì&Oacute;&brvbar;
if( m_wsSMTPServer.Receive( response_buf, RESPONSE_BUFFER_SIZE ) == SOCKET_ERROR )
{
m_sError = _T( "Socket Error" );
return FALSE;
}
sResponse = response_buf;

sscanf( (LPCTSTR)sResponse.Left( 3 ), _T( "%d" ), &response );

pResp = &response_table[ response_expected ];

if( response != pResp->nResponse )
{
m_sError.Format( _T( "%d:%s" ), response, (LPCTSTR)pResp->sMessage );
return FALSE;
}
return TRUE;
}void CSMTP::Cancel()
{
   m_wsSMTPServer.CancelBlockingCall();   m_wsSMTPServer.Close();
}

解决方案 »

  1.   

    to  wxuevc(我学vc)
      能说说怎么加吗?
      谢谢!!
      

  2.   

    你的错误在于需要给它加上登录的功能:我给你段代码吧:
    //发送电子邮件函数
    BOOL SendMail(HWND hWnd)
    {
    if (!InitialSocket(hWnd)) 
    {
    WSACleanup();
    return false;
    }
    //进行Base64编码的数据
    bool flag;//设置和检查当前是否发送成功
    flag=false;
    char Show[300]="\0";
    char *tp;
    tp=Show;
    char **p;
    p=&tp;
    CBase64 base;
    //发送数据,进行数据通信
    TCHAR Data[1024];
    recv(sock,RecvBuffer,1024,0);
    if (!CheckResponse(RecvBuffer,"220"))
    {
    MessageBox(hWnd,RecvBuffer,"错误",MB_OK|MB_ICONSTOP);
    goto Error;
    }
    //清除缓冲信息
    ClearStr(RecvBuffer);
    //开始建立对话
    strcpy(Data,"EHLO ");
    strcat(Data,ServerName);
    strcat(Data,"\r\n");
    //strcpy(Data,"EHLO znuhuxiaobo\r\n");
    send(sock,Data,strlen(Data),0);
    ClearStr(Data);

    recv(sock,RecvBuffer,1024,0);
    if (!CheckResponse(RecvBuffer,"250"))
    {
    MessageBox(hWnd,RecvBuffer,"错误",MB_OK|MB_ICONSTOP);
    goto Error;
    }

    //认证
    strcpy(Data,"AUTH LOGIN\r\n");
    send(sock,Data,strlen(Data),0);
    ClearStr(Data);
    recv(sock,RecvBuffer,1024,0);
    if (!CheckResponse(RecvBuffer,"334"))
    {
    MessageBox(hWnd,RecvBuffer,"错误",MB_OK|MB_ICONSTOP);
    goto Error;
    }
    ClearStr(RecvBuffer); //Base64编码
    base.Encode(Account,p,strlen(Account));
    strcpy(Data,Show);
    strcat(Data,"\r\n");
    send(sock,Data,strlen(Data),0);
    ClearStr(Data);
    recv(sock,RecvBuffer,1024,0);
    if (!CheckResponse(RecvBuffer,"334"))
    {
    MessageBox(hWnd,RecvBuffer,"错误",MB_OK|MB_ICONSTOP);
    goto Error;
    }
    ClearStr(RecvBuffer);
    ClearStr(Show);
    /*send(sock,Data,strlen(Data),0);
    ClearStr(Data);
    recv(sock,RecvBuffer,1024,0);
    ClearStr(RecvBuffer);*/

    //密码编码
    base.Encode(Password,p,strlen(Password));
    strcpy(Data,Show);
    strcat(Data,"\r\n");
    send(sock,Data,strlen(Data),0);
    ClearStr(Data);
    recv(sock,RecvBuffer,1024,0);
    if (!CheckResponse(RecvBuffer,"235"))
    {
    MessageBox(hWnd,RecvBuffer,"错误",MB_OK|MB_ICONSTOP);
    goto Error;
    }

    //设置发送方
    strcpy(Data,"MAIL FROM:<");
    strcat(Data,Send);
    strcat(Data,">\r\n");
    send(sock,Data,strlen(Data),0);
    ClearStr(Data);
    recv(sock,RecvBuffer,1024,0);
    if (!CheckResponse(RecvBuffer,"250"))
    {
    MessageBox(hWnd,RecvBuffer,"错误",MB_OK|MB_ICONSTOP);
    goto Error;
    }
    ClearStr(RecvBuffer); //设置接受方
    strcpy(Data,"RCPT TO:<");
    strcat(Data,Receive);
    strcat(Data,">\r\n");
    send(sock,Data,strlen(Data),0);
    ClearStr(Data);
    recv(sock,RecvBuffer,1024,0);
    if (!CheckResponse(RecvBuffer,"250"))
    {
    MessageBox(hWnd,RecvBuffer,"错误",MB_OK|MB_ICONSTOP);
    goto Error;
    }
    ClearStr(RecvBuffer); //发送电子邮件正文命令
    strcpy(Data,"DATA\r\n");
    send(sock,Data,strlen(Data),0);
    ClearStr(Data);
    recv(sock,RecvBuffer,1024,0);
    if (!CheckResponse(RecvBuffer,"354"))
    {
    MessageBox(hWnd,RecvBuffer,"错误",MB_OK|MB_ICONSTOP);
    goto Error;
    }
    ClearStr(RecvBuffer); //装配正文
    strcpy(Data,"From: ");
    strcat(Data,Send);
    strcat(Data,"\r\nTo: ");
    strcat(Data,Receive);
    strcat(Data,"\r\nCc: \r\nDate: ");
    //得到时间
    struct tm *gmt;
    time_t ltime;
    time( &ltime );
    gmt = gmtime( &ltime );
    strcat(Data,asctime( gmt ));
    strcat(Data,"Subject: ");
    strcat(Data,Subject);
    strcat(Data,"\r\nX-Mailer: WC Mail\r\nMIME-Version: 1.0\r\nContent-Type: multipart/mixed; boundary=WC_MAIL_PaRt_BoUnDaRy_05151998\r\n");
    strcat(Data,"Content-Type: text/plain\r\nContent-Transfer-Encoding: 7Bit\r\n\r\n");
    //得到信件正文信息
    GetText();
    strcat(Data,Text);
    strcat(Data,"\r\n");
    //发送该正文数据
    send(sock,Data,strlen(Data),0);
    strcpy(Data,"\r\n.\r\n");
    send(sock,Data,strlen(Data),0);
    ClearStr(Data);
    recv(sock,RecvBuffer,1024,0);
    if (!CheckResponse(RecvBuffer,"250"))
    {
    MessageBox(hWnd,RecvBuffer,"错误",MB_OK|MB_ICONSTOP);
    goto Error;
    }
    ClearStr(RecvBuffer); strcpy(Data,"QUIT\r\n");
    send(sock,Data,strlen(Data),0);
    ClearStr(Data);
    recv(sock,RecvBuffer,1024,0);
    if (!CheckResponse(RecvBuffer,"221"))
    {
    MessageBox(hWnd,RecvBuffer,"错误",MB_OK|MB_ICONSTOP);
    goto Error;
    }
    ClearStr(RecvBuffer);
    flag=true;
    Error:
    if (SOCKET_ERROR==closesocket(sock))
    {
    MessageBox(hWnd,"不能关闭连接!","错误",MB_OK|MB_ICONSTOP);
    return false;
    }
    return flag;
    }关于这些代码,需要说明的是:
    发送字符串:ELHO 服务器名\r\n
    AUTH LOGIN\r\n
    然后Base64编码用户名和密码
      

  3.   

    你把电子邮件地址告诉我,我给你一个工程!
    或者给我发信:[email protected]
      

  4.   

    我的是email:  [email protected]