www.pudn.com > xlmSendMail.rar > SendMail.cpp


//--------------------------------------------------------------------------- 
 
 
#include  
#pragma hdrstop 
 
#include "SendMail.h" 
 
//--------------------------------------------------------------------------- 
 
#pragma package(smart_init) 
 
__fastcall TSendMail::TSendMail(void) 
{ 
    FTo=new TStringList(); 
    FAttachments=new TStringList(); 
    MailBody=new TStringList(); 
    FBody=new TStringList(); 
    Port=25; 
    Boundary="--NextPart_001_SendMail"+AnsiString(double(TDateTime::CurrentDateTime())); 
} 
 
__fastcall TSendMail::~TSendMail() 
{ 
    delete FTo; 
    delete FAttachments; 
    delete FBody; 
    delete MailBody; 
} 
 
void __fastcall TSendMail::SendCommand(AnsiString Command) 
{ 
    ReplyString=""; 
    SendText(Command+"\n"); 
    GetReply(); 
} 
 
void __fastcall TSendMail::SendDataEnd(void) 
{ 
    ReplyString=""; 
    SendText("\x0D\x0A"+AnsiString(".")+"\x0D\x0A"); 
    GetReply(); 
} 
 
void __fastcall TSendMail::SendData(void) 
{ 
    ReplyString=""; 
    AnsiString tempStr; 
    for(int i=0;iCount;i++){ 
        tempStr=MailBody->Strings[i]+"\x0D"; 
        pStream->Write(tempStr.c_str(),tempStr.Length()); 
    } 
    SendDataEnd(); 
} 
 
void __fastcall TSendMail::SendUserName(AnsiString pUserName) 
{ 
    ReplyString=""; 
    char tempStr[100]; 
    ZeroMemory(tempStr,100); 
    Base64.EncodeData(pUserName.c_str(),pUserName.Length(),tempStr); 
    SendText(tempStr); 
    GetReply(); 
} 
 
void __fastcall TSendMail::SendPassword(AnsiString pPassword) 
{ 
    ReplyString=""; 
    char tempStr[100]; 
    ZeroMemory(tempStr,100); 
    Base64.EncodeData(pPassword.c_str(),pPassword.Length(),tempStr); 
    SendText(tempStr); 
    GetReply(); 
} 
 
void __fastcall TSendMail::AddMailBody(void) 
{ 
    MailBody->Add("Return-Path:"+FFrom); 
    MailBody->Add("Delivered-To:"+FFrom); 
    if(FVirtualFrom=="") 
        MailBody->Add("From:"+FFrom); 
    else 
        MailBody->Add("From:"+FVirtualFrom); 
    if(FTo->Count>1){ 
        MailBody->Add("To:"+FTo->Strings[0]+","); 
        for(int i=1;iCount-1;i++) 
            MailBody->Add("    "+FTo->Strings[i]+","); 
        MailBody->Add("    "+FTo->Strings[FTo->Count-1]); 
    }else if(FTo->Count==1){ 
        MailBody->Add("To:"+FTo->Strings[0]); 
    } 
    MailBody->Add("Subject:"+FSubject); 
    MailBody->Add("Date:"+TDateTime::CurrentDateTime().DateTimeString()); 
    MailBody->Add("MIME-Version: 1.0"); 
    MailBody->Add("Content-Type: multipart/mixed;"); 
    MailBody->Add("	boundary=\""+Boundary+"\""); 
    MailBody->Add(""); 
    MailBody->Add("--"+Boundary); 
    MailBody->Add("Content-Type: text/plain;"); 
	MailBody->Add("   charset=\"gb2312\""); 
    MailBody->Add(""); 
    MailBody->Add(FBody->Text); 
} 
 
void __fastcall TSendMail::AddAttachment(AnsiString FileName) 
{ 
    if(!FileExists(FileName))return; 
    MailBody->Add(""); 
    MailBody->Add("--"+Boundary); 
    MailBody->Add("Content-Type: application/files;"); 
    MailBody->Add("   name=\""+ExtractFileName(FileName)+"\""); 
    MailBody->Add("Content-Transfer-Encoding: base64"); 
    MailBody->Add("Content-Disposition: attachment;"); 
    MailBody->Add("   filename=\""+ExtractFileName(FileName)+"\""); 
    MailBody->Add(""); 
    TMemoryStream* FileStream=new TMemoryStream(); 
    FileStream->LoadFromFile(FileName); 
    Base64.EncodeData((char*)FileStream->Memory,int(FileStream->Size),MailBody); 
    delete FileStream; 
} 
 
void __fastcall TSendMail::AddAttachments(void) 
{ 
    for(int i=0;iCount;i++) 
        AddAttachment(FAttachments->Strings[i]); 
} 
 
void __fastcall TSendMail::CreateMail(void) 
{ 
    MailBody->Clear(); 
    AddMailBody(); 
    AddAttachments(); 
    MailBody->Add(""); 
    MailBody->Add("--"+Boundary+"--"); 
} 
 
AnsiString __fastcall TSendMail::Send(void) 
{ 
    Boundary="--NextPart_001_SendMail"+AnsiString(double(TDateTime::CurrentDateTime())); 
    Socket=new TClientSocket(NULL); 
    Socket->ClientType=ctBlocking; 
    Socket->Host=Host; 
    Socket->Port=Port; 
    pStream=NULL; 
    try{ 
    CreateMail(); 
    try{ 
        Socket->Active=true; 
        pStream=new TWinSocketStream(Socket->Socket,TimeOut); 
        GetReply(); 
        if(ReplyString.SubString(1,3)!="220"){Socket->Active=false;return ReplyString;} 
        SendCommand("auth login"); 
        if(ReplyString.SubString(1,3)!="502" && 
           ReplyString.SubString(1,3)!="334"){Socket->Active=false;return ReplyString;} 
        if(ReplyString.SubString(1,3)=="334"){ 
            SendUserName(UserName); 
            if(ReplyString.SubString(1,3)!="334"){Socket->Active=false;return ReplyString;} 
            SendPassword(Password); 
            if(ReplyString.SubString(1,3)!="235"){Socket->Active=false;return ReplyString;} 
        } 
        SendCommand("mail from:"+From); 
        if(ReplyString.SubString(1,3)!="250"){Socket->Active=false;return ReplyString;} 
        for(int i=0;iCount;i++){ 
            SendCommand("rcpt to:"+FTo->Strings[i]); 
            if(ReplyString.SubString(1,3)!="250"){Socket->Active=false;return ReplyString;} 
        } 
        SendCommand("data"); 
        if(ReplyString.SubString(1,3)!="354"){Socket->Active=false;return ReplyString;} 
        SendData(); 
        if(ReplyString.SubString(1,3)!="250"){Socket->Active=false;return ReplyString;} 
        SendCommand("quit"); 
        return "OK"; 
    }catch(Exception &e){ 
        return e.Message; 
    } 
    }__finally{ 
        MailBody->Clear(); 
        if(Socket->Active)Socket->Active=false; 
        delete Socket; 
        Socket=NULL; 
        if(pStream)delete pStream; 
        pStream=NULL; 
    } 
    return "OK"; 
} 
 
void __fastcall TSendMail::SendText(AnsiString Text) 
{ 
    pStream->Write(Text.c_str(),Text.Length()); 
} 
 
void __fastcall TSendMail::GetReply(void) 
{ 
    if(pStream->WaitForData(TimeOut)){ 
        ZeroMemory(Buff,512); 
        pStream->Read(Buff,512); 
        ReplyString=Buff; 
    } 
}