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

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

  1. можно проверить существование имени пользователя (адреса) на данном сервере.
  2. получить список адресов списка рассылки.

    Вид этой последней страницы нашего примера приведен на рисунке 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.




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