На этом шаге мы рассмотрим пример использования компонента 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.