Ну кидаем NMPOP3 на форму допустим.
Затем создаем следующий обработчик на нажатие какой-нить кнопки:
Код |
{ Form1->NMPOP31->Host = "pop.mail.ru"; Form1->NMPOP31->UserID = "mymail"; Form1->NMPOP31->Password = "password"; Form1->NMPOP31->DeleteOnRead = true; Form1->NMPOP31->AttachFilePath=FullPath; Form1->NMPOP31->Connect(); if(Form1->NMPOP31->Connected & Form1->NMPOP31->MailCount>0) { for(int i=1;i<=Form1->NMPOP31->MailCount;i++) Form1->NMPOP31->GetMailMessage(i); Form1->NMPOP31->Disconnect(); } }
|
где FullPath - это путь где будет сохранятся Аттачмент.
Добавлено через 3 минуты и 32 секундыПОЧТОВЫЙ КЛИЕНТ СВОИМИ РУКАМИ
Код |
#include <vcl.h> #pragma hdrstop
#include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "CSPIN" #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::NMPOP31Disconnect(TObject *Sender) { Button1->Enabled=false; } //--------------------------------------------------------------------------- void __fastcall TForm1::NMSMTP1Disconnect(TObject *Sender) { Button1->Enabled=false; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { NMSMTP1->PostMessage->FromAddress = Edit10->Text; NMSMTP1->PostMessage->FromName = Edit9->Text; NMSMTP1->PostMessage->Subject = Edit0->Text; NMSMTP1->PostMessage->ToAddress->Add(Memo2->Lines->Strings[0]); NMSMTP1->PostMessage->Body->Assign(Memo1->Lines); NMSMTP1->SendMail(); } //--------------------------------------------------------------------------- void __fastcall TForm1::NMSMTP1PacketSent(TObject *Sender) { Memo2->Lines->Delete(0); CSpinEdit1->Value=CSpinEdit1->Value+1; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { NMPOP31->Connect(); } //---------------------------------------------------------------------------
|
Вместо NMSMTP1 и NMPOP31 можно использовать соответсвующие Indy компоненты.
Добавлено через 5 минут и 3 секундыПример использования компонента TNMPOP3
На этом шаге мы рассмотрим пример использования компонента TNMPOP3.
Итак, создаем новое приложение, и размещаем на форме компонент TPageControl, в который добавляем две страницы и даем им имена Связь и Получение почты. Далее оформляем первую станицу, внешний вид которой показан на рисунке 1. Добавим на эту страницу три окна редактирования и две командные кнопки. В окнах редактирования будем последовательно задавать имя РОРЗ-сервера, имя пользователя и пароль. Кнопка с надписью Подключиться/Отключиться будет последовательно выполнять задачу подключения или разрыва связи в зависимости от текущего состояния компонента. Нажатия на эту кнопку будут вызывать следующую процедуру:
Код |
procedure TForml.ButtonlClick(Sender:TObject) begin if NMPOP31.Connected then NMPOP31.Disconneсt else begin NMPOP31.Host := Edit1.Text; NMPOPSl.UserlD := Edit2.Text; NMPOP31.Password := Edit3.Text; NMPOP31.DeleteOnRead := Checkboxl.Checked; NMPOP31.Connect; end; end;
|
Рис.1. Страница Связь приложения с компонентом TNMPOP3
При помощи второй командной кнопки можно менять имя каталога, в который будут помещаться вложенные в письмо файлы. Имя каталога будет выводиться в метку, расположенную по соседству с кнопкой. Соответствующая процедура приводится ниже:
Код |
procedure TForm1.Button2Click(Sender: TObject); var S: String; begin if SelectDirectory(S,[sdAllowCreate,sdPerformCreate,sdPrompt],0) then begin Label3.Caption:='Каталог для выгрузки присоединенных файлов:'+ S; NMPOPSl.AttachFilePath := S; end; end;
|
Далее добавим на страницу флажок, который будет определять режим чтения писем. Если он будет отмечен, то прочитанные письма будут помечаться на удаление. Прежде чем переходить ко второй странице формы, добавим в форму компонент TNMPOP3.
Внешний вид второй страницы изображен на рисунке 2. Здесь будем использовать четыре командные кнопки с надписями Получить письмо, Получить резюме, Удалить письмо и Получить список писем. Эти кнопки вызывают методы GetMailMessage, GetSummary, DeleteMailMessage и метод List соответственно. Обработчики событий OnClick этих кнопок последовательно приводятся ниже.
Рис.2. Страница Получение почты приложения с компонентом TNMPOP3
Код |
procedure TForm1.Button4Click(Sender: TObject); var M: Integer; begin if NMPOP31.MailCount > 0 then begin M := StrToIntDef( Edit8.Text, -1); if (M < 0) or (M > NMPOP31.MailCount) then ShowMessage('Вы ввели неправильный номер') else NMPOP31.GetMailMessage(M); Edit4.Text := NMPOP31.MailMessage.From; Edit6.Text := NMPOP31.MailMessage.Subject; Edit7.Text := NMPOP31.MailMessage.MessagelD; Меmо3.Lines.Assign(NMPOP31.MailMessage.Head); Memo1.Lines.Assign(NMPOP31.MailMessage.Body); Memo4.Text := NMPOP31.MailMessage.Attachments.Text; end else ShowMessage('В вашем ящике нет писем'); end;
procedure TForm1.Button6Click(Sender: TObject); var M: Integer; begin if NMPOP31.MailCount > 0 then begin M := StrToIntDef( Edit8.Text, -1); if (M < 0) or (M > NMPOP31.MailCount) then ShowMessage('Вы ввели неправильный номер') else NMPOP31.GetSummary(M); Edit4.Text := NMPOP31.Summary.From; Edit6.Text := NMPOP31.Summary.Subject; Edit5.Text := IntToStr(NMPOP31.Summary.Bytes); Edit7.Text := NMPOP31.Summary.MessagelD; Memo1.Lines.Assign(NMPOP31.Summary.Header) ; end else ShowMessage('В вашем ящике нет писем'); end;
procedure TForm1.Button5Click(Sender: TObject); var M: Integer; begin if NMPOP31.MailCount > 0 then begin M := StrToIntDef( Edit8.Text, -1); if (M < 0) or (M > NMPOP31.MailCount) then ShowMessage('Вы ввели неправильный номер') else NMPOP31.DeleteMailMessage(StrToint(Edits.Text)); end else ShowMessage('В вашем ящике нет писем'); end;
procedure TForm1.Button3Click(Sender: Object); begin Memo2.Clear; NMPOP31.List; end;
|
Операции получения письма, получения резюме или удаления письма, выполняемые при нажатии на соответствующие кнопки, относятся к письму, указанному по номеру в компоненте Edit8. В приведенных выше обработчиках из этого окна редактирования считывается номер письма, преобразуется к типу целого числа, проверяется диапазон введенного числа и в случае, если письмо с таким номером существует, выполняется соответствующий метод.
Если введен неверный номер или почтовый ящик пуст, выводится сообщение об ошибке.
Все остальные компоненты этой страницы будут использоваться для вывода получаемой информации. Добавим на страницу четыре компонента ТМеmо, пять полей редактирования и соответствующее количество меток, поясняющих назначение перечисленных компонентов (рисунок 2).
Для улучшения внешнего вида добавим еще один компонент TGroupBox.
Окончательный текст программы приведен ниже.
Код |
unit POP3Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, Psock, NMpop3,filectrl; type TForm1 = class(TForm) PageControl1: TPageControl; TabSheet1: TTabSheet; TabSheet2: TTabSheet; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label8: TLabel; Button1: TButton; Button2: TButton; CheckBox1: TCheckBox; NMPOP31: TNMPOP3; Label4: TLabel; Edit4: TEdit; Label5: TLabel; Edit6: TEdit; Edit5: TEdit; Label10: TLabel; Label7: TLabel; Label6: TLabel; Edit7: TEdit; Label9: TLabel; GroupBox1: TGroupBox; Label11: TLabel; Edit8: TEdit; Button3: TButton; Button4: TButton; Button5: TButton; Button6: TButton; Label12: TLabel; Memo1: TMemo; Memo2: TMemo; Memo3: TMemo; Memo4: TMemo; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormActivate(Sender: TObject); procedure NMPOP31Connect(Sender: TObject); procedure Button4Click(Sender: TObject); procedure NMPOP31RetrieveEnd(Sender: TObject); procedure NMPOP31DecodeStart(var FileName: String); procedure Button6Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure NMPOP31ConnectionFailed(Sender: TObject); procedure NMPOP31ConnectionRequired(var Handled: Boolean); procedure NMPOP31Disconnect(Sender: TObject); procedure NMPOP31Failure(Sender: TObject); procedure NMPOP31InvalidHost(var Handled: Boolean); procedure NMPOP31List(Msg, Size: Integer); procedure NMPOP31Reset(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin if NMPOP31.Connected then NMPOP31.Disconnect else begin NMPOP31.Host:=Edit1.Text; NMPOP31.UserID:=Edit2.Text; NMPOP31.Password:=Edit3.Text; NMPOP31.DeleteOnRead:=CheckBox1.Checked; NMPOP31.Connect; end; end;
procedure TForm1.Button2Click(Sender: TObject); var s:string; begin if SelectDirectory(s,[sdAllowCreate,sdPerformCreate,sdPrompt],0) then begin Label8.Caption:='Каталог для выгрузки присоединенных файлов:'+s; NMPOP31.AttachFilePath:=s; end; end;
procedure TForm1.FormActivate(Sender: TObject); begin Label8.Caption:='Каталог для выгрузки присоединенных файлов:'+NMPOP31.AttachFilePath; end;
procedure TForm1.NMPOP31Connect(Sender: TObject); begin if NMPOP31.MailCount>0 then ShowMessage('В вашем ящике '+IntToStr(NMPOP31.MailCount)+' сообщений.') else ShowMessage('Ваш почтовый ящик пуст.'); end;
procedure TForm1.Button4Click(Sender: TObject); var m:integer; begin if NMPOP31.MailCount>0 then begin m:=StrToIntDef(Edit8.Text,-1); if (m<0) or (m>NMPOP31.MailCount) then ShowMessage('Вы ввели неправильный номер.') else begin NMPOP31.GetMailMessage(m); Edit4.Text:=NMPOP31.MailMessage.From; Edit6.Text:=NMPOP31.MailMessage.Subject; Edit7.Text:=NMPOP31.MailMessage.MessageId; Memo3.Lines.Assign(NMPOP31.MailMessage.Head); Memo1.Lines.Assign(NMPOP31.MailMessage.Body); Memo4.Text:=NMPOP31.MailMessage.Attachments.Text; end end else ShowMessage('В вашем ящике нет писем.'); end;
procedure TForm1.NMPOP31RetrieveEnd(Sender: TObject); begin Memo1.Text:=NMPOP31.MailMessage.Body.Text; Edit4.Text:=NMPOP31.MailMessage.From; Edit6.Text:=NMPOP31.MailMessage.Subject; end;
procedure TForm1.NMPOP31DecodeStart(var FileName: String); var s:string; begin s:=fileName; if InputQuery('Сохранение присоединенного файла','Введите имя файла',s) then fileName:=s; end;
procedure TForm1.Button6Click(Sender: TObject); var m:integer; begin if NMPOP31.MailCount>0 then begin m:=StrToIntDef(Edit8.Text,-1); if (m<0) or (m>NMPOP31.MailCount) then ShowMessage('Вы ввели неправильный номер.') else begin NMPOP31.GetSummary(m); Edit4.Text:=NMPOP31.Summary.From; Edit6.Text:=NMPOP31.Summary.Subject; Edit5.Text:=IntToStr(NMPOP31.Summary.Bytes); Edit7.Text:=NMPOP31.Summary.MessageId; Memo1.Lines.Assign(NMPOP31.Summary.Header); end end else ShowMessage('В вашем ящике нет писем.'); end;
procedure TForm1.Button5Click(Sender: TObject); var m:integer; begin if NMPOP31.MailCount>0 then begin m:=StrToIntDef(Edit8.Text,-1); if (m<0) or (m>NMPOP31.MailCount) then ShowMessage('Вы ввели неправильный номер.') else NMPOP31.DeleteMailMessage(StrToInt(Edit8.Text)); end else ShowMessage('В вашем ящике нет писем.'); end;
procedure TForm1.Button3Click(Sender: TObject); begin Memo2.Clear; NMPOP31.List; end;
procedure TForm1.NMPOP31ConnectionFailed(Sender: TObject); begin ShowMessage('Ошибка соединения.'); end;
procedure TForm1.NMPOP31ConnectionRequired(var Handled: Boolean); begin if MessageDlg('Соединение не установлено. Будем подключаться?',mtConfirmation,mbOkCancel,0)=mrOk then begin Handled:=TRUE; NMPOP31.Connect; end; end;
procedure TForm1.NMPOP31Disconnect(Sender: TObject); begin ShowMessage('Соединение завершено...'); end;
procedure TForm1.NMPOP31Failure(Sender: TObject); begin ShowMessage('Ошибка выполнения операции.'); end;
procedure TForm1.NMPOP31InvalidHost(var Handled: Boolean); var TmpStr:string; begin if InputQuery('Задано неверное имя почтового сервера!', 'Задайте новое имя:',TmpStr) then begin NMPOP31.Host:=TmpStr; Handled:=TRUE; end;
end;
procedure TForm1.NMPOP31List(Msg, Size: Integer); begin Memo2.Lines.Add(IntToStr(Msg)+'/'+IntToStr(Size)); end;
procedure TForm1.NMPOP31Reset(Sender: TObject); begin ShowMessage('Отметки на удаление писем сняты.'); end;
end.
|
Добавлено через 7 минут и 40 секундРаботаем с POP-сервером.
Нам необходимы компоненты - NMPOP (со вкладки FastNET, у меня носит name - NMPOP31); Три Edit (c name - UserEdit; PasswordEdit; HostEdit); Button (хотя в моем примере вместо Button используется - BitBtn1); и для отображения самих писем нам пригодиться компонент ListView (c именим ListView1), сделайте в нем две штуки Columns; первый "ОТ", второй "ТЕМА";
Первое событие, которое мы напишем будет событие, вызываемое кнопкой конэкт (у меня она просто имеет caption-OK):
Код |
if(UserEdit->Text==""){ ShowMessage("Вы не указали логин !"); } if(PasswordEdit->Text==""){ ShowMessage("Вы не указали пароль!"); } ListView1->Clear(); bConnected = false;
//Получаем сведения для конэкта: NMPOP31->UserID = UserEdit->Text; NMPOP31->Password = PasswordEdit->Text; NMPOP31->Host = HostEdit->Text; NMPOP31->Connect(); if(NMPOP31->Connected) //Конэкт удался, смотрим письма: { if(NMPOP31->MailCount > 0) { bSummary = true; for(int i = 0; i < NMPOP31->MailCount; i++) { myId = i + 1; NMPOP31->GetSummary(myId); } } else ShowMessage("Писем нет.");
NMPOP31->Disconnect();
}
|
Но, пока это лишь установка связи и проверка писем. Теперь мы получим и прочтем эти письма.
Нам необходимо создать вторую форму (Form2), где будет выводиться письмо для прочтения. Внешне форма должна выглядет примерно так:
Внимание на форме должны быть еще пару Label с именами: FromLabel (здесь отобразиться имя отправителя); SubjectLabel (здесь отобразиться тема письма). Кроме этого Memo в котором будет отбражаться само письмо, у меня носит имя - MailMemo. Еще размести кнопку Закрыть.
Но вернемся на основную форму (да, кстати незадь подклучить новую форму через include)и теперь рассписываем событие для NMPOP31->OnConnect:
И событие NMPOP31->OnRetrieveEnd:
Код |
if(bSummary) { TListItem *Temp = ListView1->Items->Add();
Temp->Caption = NMPOP31->Summary->From; Temp->SubItems->Add(NMPOP31->Summary->Subject); Temp->SubItems->Add(myId); } else { TForm2 *Temp = new TForm2(NULL); Temp->MailMemo->Lines->Assign(NMPOP31->MailMessage->Body); Temp->FromLabel->Caption = NMPOP31->MailMessage->From; Temp->SubjectLabel->Caption = NMPOP31->MailMessage->Subject; Temp->Show(); }
|
Здесь нет ничего архи-сложного. Написание программы подходит к завершающему этапу, теперь мы наконец разработаем событие сомого прочтения писем. Для прочтения письма пользователю придется два раза кликнуть по теме в ListView1. Итак, ListView1->OnDblClick :
Код |
NMPOP31->Connect(); if(ListView1->SelCount > 0) { bSummary = false; NMPOP31->GetMailMessage(ListView1->Selected ->SubItems->Strings[1].ToIntDef(0)); } NMPOP31->Disconnect();
|
И последнее, что мы сделаем - это опишим ошибку ауторизации, событие NMPOP31->OnAuthenticationFailed:
Код |
AnsiString NewPassword;
NewPassword = PasswordEdit->Text; if(InputQuery("Неправильный пароль ", "Введите новый пароль :", NewPassword)) { PasswordEdit->Text = NewPassword; NMPOP31->Password = NewPassword; Handled = true; } else Handled = false;
|
И самое последнее - добавьте в начало кода следующие:
Код |
#pragma link "CGAUGES" #pragma link "PERFGRAP" #pragma link "CSPIN" #pragma link "CCALENDR"
|