用BCB TClientSocket控件开发有身份认证功能的Email程序


#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

 

posted on 2005-10-25 14:57  痛并快乐着  阅读(670)  评论(0编辑  收藏  举报

导航