void CSendmailDlg::OnSendmail() 
{
FAILLOOP:
CSocket socket;
int nTime = 0;
CString str,strResponse;
CString m_sSenderSMTPAddr = "smtp.21cn.com";
UINT m_nSenderSMTPPort = 25;
CString m_sSenderMailAddr = "[email protected]";
CString m_sRecver   = "[email protected]";

TRY
{
socket.Create();
if (socket.Connect((LPCTSTR)m_sSenderSMTPAddr, m_nSenderSMTPPort))
{
CSocketFile file(&socket);
CArchive arIn(&file, CArchive::load | CArchive::bNoFlushOnDelete);
CArchive arOut(&file, CArchive::store | CArchive::bNoFlushOnDelete);
while (TRUE)
{
arIn.ReadString(strResponse);
if ("220" != strResponse.Left(3))
{
break;
}
CString strTemp;
CString strHostName; gethostname(strHostName.GetBuffer(256), 256);
strHostName.ReleaseBuffer();

nTime = 0;
strTemp.Format("HELO %s\r\n", (LPCTSTR)strHostName);
str = strTemp;
LOOPHELO: arOut.WriteString(str);
arOut.Flush();
arIn.ReadString(strResponse);
if ("250" != strResponse.Left(3))
{
if (nTime < 3)
{
nTime++;
goto LOOPHELO;
}
else
{
break;
}
} nTime = 0;
str.Format("MAIL FROM: <%s>\r\n", 
(LPCTSTR)m_sSenderMailAddr);
LOOPMAILFROM: arOut.WriteString(str);
arOut.Flush();
arIn.ReadString(strResponse);
if ("250" != strResponse.Left(3))
{
if (nTime < 3)
{
nTime++;
goto LOOPMAILFROM;
}
else
{
break;
}
} nTime = 0;
str = "RCPT TO: <" + m_sRecver + ">\r\n";
LOOPRCPTTO: arOut.WriteString(str);
arOut.Flush();
arIn.ReadString(strResponse);
strResponse = strResponse.Left(3);
if (("250" != strResponse) && ("251" != strResponse))
{
if (nTime < 3)
{
nTime++;
goto LOOPRCPTTO;
}
else
{
break;
}
} nTime = 0;
LOOPDATA: arOut.WriteString("DATA\r\n");
arOut.Flush();
arIn.ReadString(strResponse);
strResponse = strResponse.Left(3);
if ("354" != strResponse)
{
if (nTime < 3)
{
nTime++;
goto LOOPDATA;
}
else
{
break;
}
}LOOPSUB: str="Hello World!";
arOut.WriteString(str);
str = "r\n.\r\n";
arOut.WriteString(str);
arOut.Flush();
arIn.ReadString(strResponse);
if ("250" != strResponse.Left(3))
{
if (nTime < 3)
{
nTime++;
goto LOOPSUB;
}
else
{
break;
}
} arOut.WriteString("QUIT\r\n");
arOut.Flush();
arIn.ReadString(strResponse);
break;
}
}
}
CATCH_ALL(e)
{
e->Delete();
Sleep(10);
goto FAILLOOP;
}
END_CATCH_ALL
}