用CSocket如何发邮件? 包括SMTP身份验证
解决方案 »
- 各位 MYSQL 库 与API的SOCKET 冲突怎么办 能否 重命名空间 解决 如何解决 冲突后显示找不到 SOCKET
- 连接远程SQL Server2005失败,在线等,解决立即给分!
- 关于鼠标移入事件!
- VC如何设置拨号连接代理?
- 利用Microsoft Visual Studio .NET 2003打包应用程序时,如何控制程序安装后提示重新启动电脑?
- 问题比较偏,如果有人能回答我再给更多的分。
- 内存操作(高手进)
- 有關自製進度條的問題
- 怎么根椐一个已连接的SOCKET,得到对方的地址?
- 如何在自定义类里面响应菜单的command命令?
- 有谁能解释解释fontfamily fontface到底是什么意思啊?
- 有没有人遇到过 VC编译器总是编译不能结束的情况?
http://www.ietf.org/rfc/rfc0821.txt
以后先去搜一下在问,不要浪费分
{
……
// m_wsSMTPServer为CSocket的类对象,调用Receive()将应答码接收到缓存
// response_buf中
m_wsSMTPServer.Receive( response_buf, RESPONSE_BUFFER_SIZE )
sResponse = response_buf;
sscanf( (LPCTSTR)sResponse.Left( 3 ), _T( "%d" ), &response );
pResp = &response_table[ response_expected ];
file://检验收到的应答码是否是所希望得到的
if( response != pResp->nResponse )
{
……//不相等的话进行错误处理
return FALSE;
}
return TRUE;
} 会话的各个部分比较类似,都是命令--应答方式,而且均成对出现,下面是本文的重点也是实现的关键部分--在程序控制下完成对SMTP命令的格式化以及对命令的发送和对邮件服务器应答码的检验处理://格式化并发送HELLO命令,并接收、验证服务器应答码
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 ) ) file://检验应答码是否为250
{
……
return FALSE;
}
file://格式化并发送MAIL命令,并接收、验证服务器应答码
sFrom.Format( _T( "MAIL From: <%s>\r\n" ), (LPCTSTR)msg->m_strFrom );
m_wsSMTPServer.Send( (LPCTSTR)sFrom, sFrom.GetLength() );
if( !get_response( GENERIC_SUCCESS ) ) file://检验应答码是否为250
return FALSE;
file://格式化并发送RCPT命令,并接收、验证服务器应答码
sEmail=(LPCTSTR)msg->m_strTo;
sTo.Format( _T( "RCPT TO: <%s>\r\n" ), (LPCTSTR)sEmail );
m_wsSMTPServer.Send( (LPCTSTR)sTo, sTo.GetLength() );
if(!get_response( GENERIC_SUCCESS )) file://检验应答码是否为250
return FALSE;
file://格式化并发送DATA命令,并接收、验证服务器应答码
sTemp = _T( "DATA\r\n" );
m_wsSMTPServer.Send( (LPCTSTR)sTemp, sTemp.GetLength() );
if( !get_response( DATA_SUCCESS ) ) file://检验应答码是否为354
return FALSE;
file://发送根据RFC 822文档规定格式化过的邮件头
m_wsSMTPServer.Send( (LPCTSTR)msg->m_strHeader, msg->m_strHeader.GetLength() );
……
file://发送根据RFC 822文档规定格式化过的邮件体
sTemp = msg->m_strBody;
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) );
}
m_wsSMTPServer.Send( (LPCTSTR)sTemp, sTemp.GetLength() );
file://发送内容数据结束标志"<CRLF>.<CRLF>",并检验返回应答码
sTemp = _T( "\r\n.\r\n" );
m_wsSMTPServer.Send( (LPCTSTR)sTemp, sTemp.GetLength() );
if( !get_response( GENERIC_SUCCESS ) )// 检验应答码是否为250
return FALSE; 到此为止,已基本在程序中体现出了SMTP协议的会话流程,能在Socket套接字所提供的网络通讯能力基础之上实现以SMTP命令和SMTP应答码为基本会话内容的通讯交互过程,从而最终实现SMTP协议对电子邮件的发送。
authentication is required我不知道如何认证, 看了RFC文档, 上面竟然也没有提到!