На этом шаге мы рассмотрим пример использования компонента 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;
Если введен неверный номер или почтовый ящик пуст, выводится сообщение об ошибке.
Все остальные компоненты этой страницы будут использоваться для вывода получаемой информации. Добавим на страницу четыре компонента ТМе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.
Со следующего шага мы начнем рассматривать компонент TNMSMTP.