📄 mailrcv1.cpp
字号:
void __fastcall TPOP3ExcercizerForm::Pop3ClientMessageLine(TObject *Sender)
{
DisplayMemo->Lines->Add(((TPop3Cli *)Sender)->LastResponse);
}
//---------------------------------------------------------------------------
// This event handler is called when TPop3Client is about to receive a
// list line. The MsgNum property gives the message number.
void __fastcall TPOP3ExcercizerForm::Pop3ClientListBegin(TObject *Sender)
{
DisplayMemo->Lines->Add("*** List begin ***");
}
//---------------------------------------------------------------------------
// This event handler is called when TPop3Client has received the last list
// line.
void __fastcall TPOP3ExcercizerForm::Pop3ClientListEnd(TObject *Sender)
{
DisplayMemo->Lines->Add("*** List End ***");
}
//---------------------------------------------------------------------------
// This event handler is called for each list line received by TPop3Client.
void __fastcall TPOP3ExcercizerForm::Pop3ClientListLine(TObject *Sender)
{
AnsiString Buffer;
Buffer = "MsgNum = " + IntToStr(((TPop3Cli *)Sender)->MsgNum) + " " +
"MsgSize = " + IntToStr(((TPop3Cli *)Sender)->MsgSize) + " " +
"Line = """ + ((TPop3Cli *)Sender)->LastResponse + """";
if (DisplayMemo->Lines->Count > 200)
DisplayMemo->Clear();
DisplayMemo->Lines->Add(Buffer);
}
//---------------------------------------------------------------------------
void __fastcall TPOP3ExcercizerForm::Pop3ClientUidlBegin(TObject *Sender)
{
DisplayMemo->Lines->Add("*** Uidl begin ***");
}
//---------------------------------------------------------------------------
void __fastcall TPOP3ExcercizerForm::Pop3ClientUidlEnd(TObject *Sender)
{
DisplayMemo->Lines->Add("*** Uidl end ***");
}
//---------------------------------------------------------------------------
void __fastcall TPOP3ExcercizerForm::Pop3ClientUidlLine(TObject *Sender)
{
AnsiString Buffer;
Buffer = "MsgNum = " + IntToStr(((TPop3Cli *)Sender)->MsgNum) + " " +
"MsgUidl = " + ((TPop3Cli *)Sender)->MsgUidl + """";
if (DisplayMemo->Lines->Count > 200)
DisplayMemo->Clear();
DisplayMemo->Lines->Add(Buffer);
}
//---------------------------------------------------------------------------
void __fastcall TPOP3ExcercizerForm::MessageBegin(TObject *Sender)
{
MessageForm->Caption = "Message " +
IntToStr(((TPop3Cli *)Sender)->MsgNum);
MessageForm->Show();
}
//---------------------------------------------------------------------------
void __fastcall TPOP3ExcercizerForm::MessageLine(TObject *Sender)
{
if (MessageForm->DisplayMemo->Lines->Count > 200)
MessageForm->DisplayMemo->Clear();
MessageForm->DisplayMemo->Lines->Add(((TPop3Cli *)Sender)->LastResponse);
}
//---------------------------------------------------------------------------
void __fastcall TPOP3ExcercizerForm::NextButtonClick(TObject *Sender)
{
MessageForm->DisplayMemo->Clear();
MessageForm->Caption = "Message";
Pop3Client->OnMessageBegin = MessageBegin;
Pop3Client->OnMessageEnd = NULL;
Pop3Client->OnMessageLine = MessageLine;
Pop3Client->OnRequestDone = NextMessageRequestDone;
Pop3Client->MsgNum = StrToInt(MsgNumEdit->Text);
Pop3Client->Retr();
}
//---------------------------------------------------------------------------
void __fastcall TPOP3ExcercizerForm::NextMessageRequestDone(
TObject *Sender,
TPop3Request RqType,
WORD Error)
{
if (Error != 0)
return;
MsgNumEdit->Text = IntToStr(StrToInt(MsgNumEdit->Text) + 1);
}
//---------------------------------------------------------------------------
void __fastcall TPOP3ExcercizerForm::GetAllMessageLine(TObject *Sender)
{
fprintf(FFile, "%s\n", ((TPop3Cli *)Sender)->LastResponse.c_str());
}
//---------------------------------------------------------------------------
// The function here after will start an event chain that will eventually
// download all messages for the POP3 server. We cannot simply loop because
// the POP3 compomnet is asynchronous: it will not wait for operation done
// before returning. We must "chain" operations one after the other using
// the OnRequestDone event handler. We use the variable FGetAllState to keep
// track of where we are.
// To get all messages, we must first call Stat to know how many messages
// are on the server, then for each message we call Uidl to get a unique
// identifier for each message to build a file name and know if we already
// have a message, then we retrieve the message, then we increment the
// message number and continue until the number of messages is reached.
// We should start a TTimer to handle timeout...
void __fastcall TPOP3ExcercizerForm::GetAllButtonClick(TObject *Sender)
{
TIniFile *IniFile;
// Get path from INI file
IniFile = new TIniFile(IniFileName);
FMsgPath = IniFile->ReadString("Data", "MsgPath",
ExtractFilePath(Application->ExeName));
delete IniFile;
// Be sure to have an ending backslash
if ((FMsgPath.Length() > 0) && (FMsgPath[FMsgPath.Length()] != '\\'))
FMsgPath = FMsgPath + "\\";
FGetAllState = 0;
FFileOpened = FALSE;
Pop3Client->OnRequestDone = GetAllRequestDone;
Pop3Client->OnMessageBegin = NULL;
Pop3Client->OnMessageEnd = NULL;
Pop3Client->OnMessageLine = GetAllMessageLine;
Pop3Client->Stat();
}
//---------------------------------------------------------------------------
// This event handler is called when a request related to GetAll is done.
// We check for errors and our state variable FGetAllState which tells us
// where we are (stat, uidl or retr which are the 4 commands we use.
// Note that we also could use Dele to remove the messages from the server.
void __fastcall TPOP3ExcercizerForm::GetAllRequestDone(
TObject *Sender,
TPop3Request RqType,
WORD Error)
{
if (Error) {
if (FFileOpened) {
FFileOpened = FALSE;
fclose(FFile);
}
DisplayMemo->Lines->Add("Error " + Pop3Client->ErrorMessage);
return;
}
try {
switch (FGetAllState) {
case 0: // Comes from the Stat command
if (Pop3Client->MsgCount < 1) {
DisplayMemo->Lines->Add("No message to download->");
return;
}
Pop3Client->MsgNum = 1; // Start with first message
FGetAllState = 1;
Pop3Client->Uidl();
break;
case 1: // Comes from the Uidl command
FFileName = FMsgPath + "Msg " + Pop3Client->MsgUidl + "->txt";
if (FileExists(FFileName)) {
DisplayMemo->Lines->Add("Message " + IntToStr(Pop3Client->MsgNum) + " already here");
if (Pop3Client->MsgNum == Pop3Client->MsgCount) {
DisplayMemo->Lines->Add("Finished");
return;
}
Pop3Client->MsgNum = Pop3Client->MsgNum + 1;
FGetAllState = 1;
Pop3Client->Uidl();
}
else {
DisplayMemo->Lines->Add("Message " + IntToStr(Pop3Client->MsgNum));
FFile = fopen(FFileName.c_str(), "w");
if (FFile == NULL)
throw Exception("Can't open file " + FFileName);
FFileOpened = TRUE;
FGetAllState = 2;
Pop3Client->Retr();
}
break;
case 2: // Comes from the Retr command
FFileOpened = FALSE;
fclose(FFile);
if (Pop3Client->MsgNum == Pop3Client->MsgCount) {
DisplayMemo->Lines->Add("Finished");
return;
}
Pop3Client->MsgNum = Pop3Client->MsgNum + 1;
FGetAllState = 1;
Pop3Client->Uidl();
break;
default:
DisplayMemo->Lines->Add("Invalid state");
return;
}
} catch (Exception &E) {
if (FFileOpened) {
FFileOpened = FALSE;
fclose(FFile);
}
DisplayMemo->Lines->Add("Error: " + E.Message);
}
}
//---------------------------------------------------------------------------
void __fastcall TPOP3ExcercizerForm::Pop3ClientRequestDone(
TObject *Sender,
TPop3Request RqType,
WORD Error)
{
DisplayMemo->Lines->Add("Request Done Rq==" + IntToStr(Integer(RqType)) +
" Error==" + IntToStr(Error));
if (RqType == pop3Stat) {
InfoLabel->Caption = "Stat ok, " +
IntToStr(Pop3Client->MsgCount) + " messages " +
IntToStr(Pop3Client->MsgSize) + " bytes";
}
else if (RqType == pop3List) {
InfoLabel->Caption = "List ok, " +
IntToStr(Pop3Client->MsgNum) + " message " +
IntToStr(Pop3Client->MsgSize) + " bytes";
}
else if (RqType == pop3Last) {
InfoLabel->Caption = "Last == " + IntToStr(Pop3Client->MsgNum);
}
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -