Пример использования компонента TNMSMTP

   
На этом шаге мы рассмотрим пример использования компонента TNMSMTP.

   
Для размещения всех элементов программы используем три компонента TTabSheet, которые добавлены в
компонент TPageControl. Добавим в разрабатываемую форму компоненты TStatusBar, TOpenDialog
и TNMSMTP. Назовем страницы именами Связь, Отправка писем и Служебная.

   
Начнем с первой страницы с именем Связь. Добавим в форму три окна редактирования, три метки,
описывающих назначение каждого из этих окон, и две командные кнопки. Внешний вид страницы показан на рисунке 1.


Рис.1. Страница Связь приложения с компонентом TNMSMTP

   
В первом окне задается имя сервера (или его IP-адрес), во втором - номер порта, по умолчанию - 25, и в
третьем имя для регистрации на сервере, если оно требуется.

   
Командные кнопки с именами Подключиться и Отключиться
выполняют подключение и разрыв соединения с сервером. Обработчики событий OnClick этих кнопок приводятся ниже.

procedure TForml.ButtonlClick(Sender:TObject); 
//Подключиться
begin
  if not NMSMTP1.Connected then 
  begin
    NMSMTP1.Host := Edit1.Text;   
    NMSMTPl.Port := StrToInt(Edit2.Text) ; 
    NMSMTP1.UserID := Edit3.Text;   
    NMSMTP1.Connect; 
  end; 
end;

procedure TForm1.Button2Click(Sender:TObject); 
//Отключиться
begin 
  if  NMSMTP1.Connected then
      NMSMTP1.Disconnect 
end;

   
Далее перейдем ко второй странице с именем Отправка писем. Внешний вид страницы приведен на рисунке 2.


Рис.2. Страница Отправка писем приложения с компонентом TNMSMTP

   
Добавляем пять окон редактирования с подписями Кому, Копия, Скрытая копия,
Тема письма и Адрес для ответа. Назначения полей редактирования станет понятным, если мы посмотрим на приведенный
ниже обработчик события OnClick кнопки с надписью Отправить:

procedure TForm1.Button5Click(Sender: TObject); 
begin
  if NMSMTP1.Connected then 
  begin
    NMSMTP1.ClearParams := CheckBox1.Checked;
    NMSMTP1.SubType := mtPlain;
    case RadioGroup1.Itemlndex of
      0: NMSMTP1.EncodeType := uuMime; 
      1: NMSMTP1.EncodeType := uuCode;
    end;
    NMSMTP1.PostMessage.FromAddress := Edit12.Text;
    NMSMTP1.PostMessage.FromName := Edit11.Text;
    NMSMTP1.PostMessage.ToAddress.Text := Edit4.Text;
    NMSMTP1.PostMessage.ToCarbonCopy.Text := Edit5.Text;
    NMSMTP1.PostMessage.ToBlindCarbonCopy.Text := Edit6.Text;
    NMSMTP1.PostMessage.Body.Text := Memo1.Text; 
    NMSMTP1.PostMessage.Attachments.Text := ListBox1.Items.Text;
    NMSMTP1.PostMessage.Subject := Edit7.Text;
    NMSMTP1.PostMessage.LocalProgram := 'Delphi 6.0 Example';
    NMSMTP1.PostMessage.Date := DateToStr(Date);
    NMSMTP1.PostMessage.ReplyTo := Edit10.Text;
    NMSMTP1.SendMail;
    end 
    else
      ShowMessage('Нет соединения с сервером SMTP'); 
end;

   
В данной процедуре значения из описанных пяти полей редактирования записываются в соответствующие подсвойства свойства PostMessage.
Кроме них нужно обязательно задать значение адреса отправителя. Имя отправителя указывать не обязательно. Поле Body также не
является обязательным, но обычно оно заполняется. Очевидно, что нет смысла обмениваться пустыми письмами.
Итак, свойство Body заполняется содержимым поля Memo1.

   
В свойство Attachments записываются имена вложенных файлов и заполняются поля даты, адреса для ответа и
имя программы, отправившей сообщение. После этого вызывается метод SendMail. А перед всеми этими
действиями проводится проверка наличия соединения, задается режим очищения или не очищения полей после отправки письма свойства
PostMessage. Сообщение объявляется имеющим тип текста ASCII, и в соответствии с выбором кнопки
Кодирование вложенных файлов выбирается тип кодировки.

   
Кроме рассмотренных пяти окон редактирования и командной кнопки Отправить на этой странице
расположено поле мемо для ввода текста сообщения. В нижней части страницы находятся два окна редактирования с
данными отправителя. Кнопка Очистить используется для "обнуления" компонентов, содержащих данные для отправки.
Этим занимается приведенная ниже процедура.

procedure TForm1.Button8Click(Sender: TObject); 
begin
  NMSMTP1.ClearParameters;
  Edit4.Clear; 
  Edit5.Clear; 
  Edit6.Clear; 
  Edit7.Clear; 
  Edit10.Clear; 
  Memo1.Clear; 
  ListBox1.Clear; 
end;

   
Последнее, что еще есть на этой странице, это компонент TListBox, в который помещаются имена вложенных файлов.
Вложить очередной файл в письмо можно нажатием кнопки Добавить. Кнопка Удалить очищает этот компонент.

   
Ниже приведены процедуры, обрабатывающие событие OnClick этих кнопок.

procedure TForm1.Button3Click(Sender: TObject); 
//Добавить
begin
  If OpenDialog1.Execute then
    ListBox1.Items.Add(OpenDialog1.FileName); 
end;

procedure TForm1.Button4Click(Sender: TObject); 
//Удалить
begin
  ListBox1.Items.Delete(ListBox1.ItemIndex); 
end;

   
На странице с условным именем Служебная представлены две дополнительные возможности этого компонента:

  • можно проверить существование имени пользователя (адреса) на данном сервере.
  • получить список адресов списка рассылки.
  •    
    Вид этой последней страницы нашего примера приведен на рисунке 3.


    Рис.3. Страница Служебная приложения с компонентом TNMSMTP

       
    В первом поле редактирования можно ввести адрес, существование которого необходимо проверить. Во втором поле нужно
    задавать имя листа рассылки. Кнопки Проверить и Получить вызывают соответствующие
    этим двум задачам методы. Процедуры, вызываемые при нажатии на эти кнопки, приведены ниже.

    procedure TForm1.Button6Click(Sender: TObject); 
    //Проверить
    var
      TmpStr: String; 
    begin
      TmpStr:= Edits.Text;
      If NMSMTP1.Verify(TmpStr) then
        ShowMessage('Имя'+TmpStr+' обнаружено')
      else
        ShowMessage('Имя'+TmpStr+' не обнаружено'); 
    end;
    
    Procedure TForm1.Button7Clik(Sender: Tobject);
    //Получить
    begin
      NMSMTP1.ExpandList(Edit9.Text); 
    end;
    

       
    Если компонент получает список имен из листа рассылки, то этот список выводится в поле мемо, расположенное на данной странице.

       
    Далее рассмотрим обработчики событий компонента TNMSMTP, используемые в данной программе. Рассмотрим их по алфавиту.

       
    Обработчик события OnAttachmentNotFound вызывается, если не найден файл вложения, он просто сообщает вам об этом.

    procedure TForm1.NMSMTP1AttachmentNotFound(Filename: String); 
    begin
      ShowMessage('Файл вложения '+FileName+' не найден'); 
    end;
    

       
    Для события OnAuthentieationFailed предлагается следующий обработчик:

    procedure TForm1.NMSMTP1AuthenticationFailed(var Handled: Boolean); 
    var
      S: String; 
    begin
      S := NMSMTP1.UserID;
      if InputQuery('Ошибка регистрации', 
       'Неверное имя пользователя. Введите правильное имя: ', S) then 
      begin
        NMSMTP1.UserID := S; 
        Handled := true; 
      end; 
    end;
    

       
    Здесь пользователю предоставляется возможность ввести правильное имя и повторить попытку регистрации.

       
    Обработчики событий OnConnect и OnConnectionFailed выводят соответствующие сообщения в
    строку состояния и в окно сообщения.

       
    Если в процессе работы приложения произойдет событие ОnConnectionRequired, то будет вызвана следующая процедура:

    procedure TForm1.NMSMTP1ConnectionRequired(var Handled: Boolean); 
    begin
      If MessageDlg('Требуется установить соединение. Соединяемся?',
        mtConfirmation, mbOkCancel, 0) = mrOk then 
      begin
        Handled := true; 
        NMSMTP1.Connect; 
      end; 
    end;
    

       
    Как видно из приведенной процедуры, здесь можно установить соединение с сервером, если оно не было установлено ранее или было
    разорвано по каким-то причинам.

       
    Обработчики событий OnDisconnect, OnEncodeEnd, OnEncodeStart, OnFailure, OnHostResolved, OnPacketSent, OnRecipientNotFound, OnSendStart, OnStutus и OnSuccess
    достаточно просты, а поэтому отдельного внимания уделять им не будем, найти их можно в листинге программы. Из сколько-нибудь
    содержательных обработчиков событий остался только обработчик события OnInvalidHost. Он приведен ниже.
    Здесь пользователю дается возможность задать имя сервера и повторить попытку соединения.

    procedure TForm1.NMSMTP1InvalidHost(var Handled: Boolean); 
    var
      TmpStr: String; 
    begin
      if InputQuery('Неверное имя сервера!', 
        'Укажите новое имя:',  TmpStr) then 
      begin
        NMSMTP1.Host := TmpStr; 
        Handled := true; 
      end; 
    end;
    

       
    На этом разбор программы закончен, ниже приводится листинг примера.

    unit SMTPUnit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ComCtrls, Psock, NMsmtp, ExtCtrls;
    
    type
      TForm1 = class(TForm)
        PageControl1: TPageControl;
        StatusBar1: TStatusBar;
        NMSMTP1: TNMSMTP;
        OpenDialog1: TOpenDialog;
        TabSheet1: TTabSheet;
        TabSheet2: TTabSheet;
        TabSheet3: TTabSheet;
        Label1: TLabel;
        Label2: TLabel;
        Label3: TLabel;
        Edit1: TEdit;
        Edit2: TEdit;
        Edit3: TEdit;
        Button1: TButton;
        Button2: TButton;
        Label4: TLabel;
        Label5: TLabel;
        Label6: TLabel;
        Edit4: TEdit;
        Edit5: TEdit;
        Edit6: TEdit;
        Label7: TLabel;
        Edit7: TEdit;
        ListBox1: TListBox;
        Label8: TLabel;
        Button3: TButton;
        Button4: TButton;
        Label9: TLabel;
        Memo1: TMemo;
        Button5: TButton;
        GroupBox1: TGroupBox;
        Label10: TLabel;
        Edit8: TEdit;
        Button6: TButton;
        GroupBox2: TGroupBox;
        Label11: TLabel;
        Edit9: TEdit;
        Button7: TButton;
        Memo2: TMemo;
        Label12: TLabel;
        Edit10: TEdit;
        GroupBox3: TGroupBox;
        Label13: TLabel;
        Label14: TLabel;
        Edit11: TEdit;
        Edit12: TEdit;
        RadioGroup1: TRadioGroup;
        CheckBox1: TCheckBox;
        Button8: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button5Click(Sender: TObject);
        procedure Button8Click(Sender: TObject);
        procedure NMSMTP1AttachmentNotFound(Filename: String);
        procedure NMSMTP1AuthenticationFailed(var Handled: Boolean);
        procedure NMSMTP1Connect(Sender: TObject);
        procedure NMSMTP1SendStart(Sender: TObject);
        procedure Button3Click(Sender: TObject);
        procedure Button6Click(Sender: TObject);
        procedure Button4Click(Sender: TObject);
        procedure Button7Click(Sender: TObject);
        procedure NMSMTP1ConnectionFailed(Sender: TObject);
        procedure NMSMTP1ConnectionRequired(var Handled: Boolean);
        procedure NMSMTP1Disconnect(Sender: TObject);
        procedure NMSMTP1EncodeEnd(Filename: String);
        procedure NMSMTP1EncodeStart(Filename: String);
        procedure NMSMTP1Failure(Sender: TObject);
        procedure NMSMTP1HostResolved(Sender: TComponent);
        procedure NMSMTP1InvalidHost(var Handled: Boolean);
        procedure NMSMTP1MailListReturn(MailAddress: String);
        procedure NMSMTP1PacketSent(Sender: TObject);
        procedure NMSMTP1RecipientNotFound(Recipient: String);
        procedure NMSMTP1Status(Sender: TComponent; Status: String);
        procedure NMSMTP1Success(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      if not(NMSMTP1.Connected) then
         begin
           NMSMTP1.Host:=Edit1.Text;
           NMSMTP1.Port:=StrToInt(Edit2.Text);
           NMSMTP1.UserID:=Edit3.Text;
           NMSMTP1.Connect;
         end;  
    end;
    
    procedure TForm1.Button2Click(Sender: TObject);
    begin
       if NMSMTP1.Connected then
          NMSMTP1.Disconnect;
    end;
    
    procedure TForm1.Button5Click(Sender: TObject);
    begin
        if  NMSMTP1.Connected then
           begin
             NMSMTP1.ClearParams:=CheckBox1.Checked;
             NMSMTP1.SubType:=mtPlain;
             case RadioGroup1.ItemIndex of
               1:NMSMTP1.EncodeType:=uuMime;
               2:NMSMTP1.EncodeType:=uuCode;
             end;
             NMSMTP1.PostMessage.FromAddress:=Edit12.Text;
             NMSMTP1.PostMessage.FromName:=Edit11.Text;
             NMSMTP1.PostMessage.ToAddress.Text:=Edit4.Text;
             NMSMTP1.PostMessage.ToCarbonCopy.Text:=Edit5.Text;
             NMSMTP1.PostMessage.ToBlindCarbonCopy.Text:=Edit6.Text;
             NMSMTP1.PostMessage.Body.Text:=Memo1.Text;
             NMSMTP1.PostMessage.Attachments.Text:=ListBox1.Items.Text;
             NMSMTP1.PostMessage.Subject:=Edit7.Text;
             NMSMTP1.PostMessage.LocalProgram:='Delphi 6.0 Example';
             NMSMTP1.PostMessage.Date:=DateToStr(Date);
             NMSMTP1.PostMessage.ReplyTo:=Edit10.Text;
             NMSMTP1.SendMail;
           end
        else
          ShowMessage('Нет соединения с сервером SMTP');
    end;
    
    procedure TForm1.Button8Click(Sender: TObject);
    begin
        NMSMTP1.ClearParameters;
        Edit4.Clear;
        Edit5.Clear;
        Edit6.Clear;
        Edit7.Clear;
        Edit10.Clear;
        Memo1.Clear;
        ListBox1.Clear;
    end;
    
    procedure TForm1.NMSMTP1AttachmentNotFound(Filename: String);
    begin
       ShowMessage('Файл вложения '+FileName+' не найден.');
    end;
    
    procedure TForm1.NMSMTP1AuthenticationFailed(var Handled: Boolean);
    var
      s:string;
    begin
      s:=NMSMTP1.UserID;
      if InputQuery('Ошибка регистрации',
        'Неверное имя пользователя. Введите правильное имя: ',s) then
         begin
           NMSMTP1.UserID:=s;
           Handled:=true;
         end;  
    
    end;
    
    procedure TForm1.NMSMTP1Connect(Sender: TObject);
    begin
       StatusBar1.SimpleText:='Соединились.';
    end;
    
    procedure TForm1.NMSMTP1SendStart(Sender: TObject);
    begin
       StatusBar1.SimpleText:='Отправление пписьма...';
    end;
    
    procedure TForm1.Button3Click(Sender: TObject);
    begin
       if OpenDialog1.Execute then
         ListBox1.Items.Add(OpenDialog1.FileName);
    end;
    
    procedure TForm1.Button6Click(Sender: TObject);
    var
       TmpStr:string;
    begin
       TmpStr:=Edit8.Text;
       if  NMSMTP1.Verify(TmpStr) then
           ShowMessage('Имя '+TmpStr+' обнаружено.')
       else
           ShowMessage('Имя '+TmpStr+' не обнаружено.')
    end;
    
    procedure TForm1.Button4Click(Sender: TObject);
    begin
       ListBox1.Items.Delete(ListBox1.ItemIndex);
    end;
    
    procedure TForm1.Button7Click(Sender: TObject);
    begin
       NMSMTP1.ExpandList(Edit9.Text);
    end;
    
    procedure TForm1.NMSMTP1ConnectionFailed(Sender: TObject);
    begin
       ShowMessage('Ошибка соединения.');
    end;
    
    procedure TForm1.NMSMTP1ConnectionRequired(var Handled: Boolean);
    begin
      if MessageDlg('Требуется установить соединение. Соединиться?',
            mtConfirmation,mbOkCancel,0)=mrOk then
         begin
           Handled:=true;
           NMSMTP1.Connect;
         end;  
    end;
    
    procedure TForm1.NMSMTP1Disconnect(Sender: TObject);
    begin
       If StatusBar1<>nil then
          StatusBar1.SimpleText:='Соединение завершено.';
    end;
    
    procedure TForm1.NMSMTP1EncodeEnd(Filename: String);
    begin
       StatusBar1.SimpleText:='Кодирование файла '+FileName+' закончено.';
    end;
    
    procedure TForm1.NMSMTP1EncodeStart(Filename: String);
    begin
        StatusBar1.SimpleText:='Кодирование файла '+FileName;
    end;
    
    procedure TForm1.NMSMTP1Failure(Sender: TObject);
    begin
       StatusBar1.SimpleText:='Ошибка.';
    end;
    
    procedure TForm1.NMSMTP1HostResolved(Sender: TComponent);
    begin
       StatusBar1.SimpleText:='Сервер обнаружен.';
    end;
    
    procedure TForm1.NMSMTP1InvalidHost(var Handled: Boolean);
    var
      TmpStr:string;
    begin
        if InputQuery('Неверное имя сервера.','Укажите новое имя: ',TmpStr) then
           begin
              NMSMTP1.Host:=TmpStr;
              Handled:=true;
           end;   
    end;
    
    procedure TForm1.NMSMTP1MailListReturn(MailAddress: String);
    begin
       Memo2.Lines.Add(MailAddress);
    end;
    
    procedure TForm1.NMSMTP1PacketSent(Sender: TObject);
    begin
        StatusBar1.SimpleText:='Отослано '+IntToStr(NMSMTP1.BytesSent)+' байт из '+
              IntToStr(NMSMTP1.BytesTotal);
    end;
    
    procedure TForm1.NMSMTP1RecipientNotFound(Recipient: String);
    begin
        ShowMessage('Имя получателя "'+Recipient+'" не найдено!');
    end;
    
    procedure TForm1.NMSMTP1Status(Sender: TComponent; Status: String);
    begin
        If StatusBar1<>nil then
          StatusBar1.SimpleText:=status;
    end;
    
    procedure TForm1.NMSMTP1Success(Sender: TObject);
    begin
        StatusBar1.SimpleText:='Успешное завершение.';
    end;
    
    end.
    

    Текст этого приложения можно взять здесь.

       
    На следующем шаге мы рассмотрим компоненты TNMStrm и TNMStrmServ.



    Вы можете оставить комментарий, или Трекбэк с вашего сайта.

    Оставить комментарий