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;i Count;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;i Count-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;i Count;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;i Count;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; } }