Шаг 47.
Пример использования компонента 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.
Текст этого приложения можно взять здесь.

    Со следующего шага мы начнем рассматривать компонент TNMSMTP.




Предыдущий шаг Содержание Следующий шаг