Delphi — проверка почты (Часть 1)

Задача: Написать приложение с помощью которого будет возможность проверять наличие почтовых сообщений. Для начала решим следующие подзадачи:

  1. Проверка почты на наличие сообщений;
  2. Возможность задания периода проверки почты;
  3. Вывод уведомлений при наличии каких либо сообщений;

Инструментарий: Delphi, компоненты INDY

Решение:

Я начинаю цикл статей которые направлены на работу по созданию почтового клиента с помощью компонентов Indy.

При написании статьи я использовал Delphi 2010 компоненты Indy v10
В данной части мы выполним следующие задания:

  1. Проверка почты на наличие сообщений;
  2. Возможность задания периода проверки почты;
  3. Вывод уведомлений при наличии каких либо сообщений;

Раз определились с планом действий — приступим к следующему этапу — созданию. Создаем новый проект, и размещаем на форме компонент idPOP3, который находиться на закладке IndyClients.

Для того чтобы проверить почту нам необходимо передать компоненту idPOP3 некоторые параметры для подключения, а именно:

UserName – адрес электронной почты в формате (xxx@xxx.xx)
Password – пароль к данному почтовому ящику
Host – POP3 сервер (pop.mail.ru; pop3.ukr.net)
Port – порт (по умолчанию 110)

Размещаем на форме компонент GroupBox из вкладки Standard – для группирования полей. Для того чтобы программа была более «гибкой» — поместим 4 компонента Edit и Label, они находятся на закладке Standard. Установим свойства компонентов, как показано в Табл.1.

Табл.1.

Компонент  Свойство  Значение  Описание
 Form1  Name  MainForm
 GroupBox1  Caption  Настройки ящика
 Name  SettingsGroupBox
 Label1  Caption  Адрес
 Name  AdressLabel
 Label2  Caption  Пароль
 Name  PassLabel
 Label3  Caption  POP3 сервер
 Name  Pop3Label
 Label4  Caption  Порт
 Name  PortLabel
 Edit1  Text  Адрес
 Name  AdressEdit
 Edit2  Text  Пароль
 Name  PassEdit
 PasswordChar  *
 Edit3  Text  POP3 сервер
 Name  Pop3Edit
 Edit4  Text  Порт
 Name  PortEdit
NumbersOnly  True Можно вводить только числа
 idPop31  Name  idPop31

Результат можно просмотреть на Рис.1.

Отправка почты - Дизайн формы

Рис. 1 Отправка почты — Дизайн формы

Что касается 2-го задания. Нам необходимо еще разместить на форме компонент Timer, который находиться на закладке System. Для задания интервала проверки, нам необходимо добавить на форму поле ввода Edit (панель Standard), компонент Memo для вывода системных сообщений и кнопку (Button на панели Standard) для подтверждения введенной информации. Установим для них следующие свойства (Табл. 2):

Табл. 2

Компонент Свойство Значение
 Button1  Caption  Установить
 Name  OkBtn
 Memo1  Lines
 Name  ResultMemo
 Edit5  Text
 Name  IntervalEdit
 NumbersOnly  true
 Timer1  Enabled  false
 Name  CheckTimer

В результате мы получим следующий вид окна (Рис.2.):

Отправка почты - Дизайн формы

Рис. 2 — Отправка почты — Дизайн формы

Напишем функцию присвоения значений таймера, его активацию и вывод соответствующих сообщений в ResultMemo.

function TMainForm.StartTimer(T:TTimer;int:Integer):string;
var
sec:Integer; // объявляем переменную для записи в неё количество мсек.
begin
  T.Enabled:=false; //остановка таймера
  sec:=int*60000; // определяем интервал проверки
  T.Interval:=sec; // задаём интервал проверки
  T.Enabled:=true; //запускаем таймера
  Result:='Почта будет проверена через '+IntToStr(int)+' мин.'; // передача обратно оповещения
end;

Обьявим данную функцию в приватной секции главной формы:

private
  { Private declarations }
  function StartTimer(T:TTimer;int:Integer):string;

Данная функция задает настройки таймера и возвращает строку с сообщением, через какой период будет проверена почта.

Дальше создадим код для события onClick кнопки OkButton (для того чтобы создать данное событие необходимо два раза кликнуть на кнопку, или перейти в Object Inspector, открыть закладку Events, и два раза кликнуть по пустому полю возле названия onClick): После создания события автоматически сгенерируется следующий код:

procedure TMainForm.OkBtnClick(Sender: TObject);
begin
end;

Используем ранее написанную функцию, для этого передадим необходимые параметры:

procedure TMainForm.OkBtnClick(Sender: TObject);
begin
  ResultMemo.Lines.Add(StartTimer(CheckTimer,StrToInt(IntervalEdit.Text)));
end;

Рассмотрим более детально: ResultMemo.Lines.Add(); — добавляем запись в ResultMemo которую возвращает написанная нами процедура

StartTimer(CheckTimer,StrToInt(IntervalEdit.Text)).

Всё очень просто мы останавливаем таймер, в том случае если он запущен, определяем время его срабатывания, записываем данное время в интервал и запускаем таймер.
Теперь перейдём непосредственно к таймеру. Два раза кликаем левой кнопкой мыши на компонент Timer, после чего вы перейдёте в редактор кода, при этом автоматически генерируется обработчик события OnTimer:

procedure TMainForm.CheckTimerTimer(Sender: TObject);
begin
end;
Дальше реализуем процедуру для получения писем:
function TMainForm.CheckMail(IP:TIdPOP3;User,Pass,Host:string;Port:Integer):String;
var
NumOfMsgs:Integer; // Количество писем
begin
  try
    IP.Username:=User; // адрес электронной почты в формате (xxx@xxx.xx)
    IP.Password:=Pass; // пароль к данному почтовому ящику
    IP.Host:=Host; // POP3 сервер (pop.mail.ru; pop3.ukr.net)
    IP.Port:=Port; // порт
    IP.Connect; // подключаемся
    if IP.Connected then // если подключение прошло успешно
    begin
      // записываем в NumOfMsgs количество писем
      NumOfMsgs := IP.CheckMessages;
      // Возвращаем результат
      Result:='Подключение прошло успешно!'+#13#10;
      Result:=Result+'У вас '+IntToStr(NumOfMsgs)+' сообщений';
    end
  except // Если произошла ошибка- возвращаем текст ошибки
    on E:Exception do Result:='Ошибка подключения! '+E.Message;
  end;
  IP.Disconnect; // Отключаемся
end;

И объявим ее в приватной секции главной формы:

private
  ...
  function CheckMail(IP:TIdPOP3;User,Pass,Host:string;Port:Integer):String;

Переходим в обработчик события OnTimer и компонента CheckTimer и пишем следующий код для того чтобы почта проверялась при активации таймера:

procedure TMainForm.CheckTimerTimer(Sender: TObject);
begin
  ResultMemo.Lines.add(CheckMail(IdPOP31,AdressEdit.Text,PassEdit.Text,Pop3Edit.Text,StrToInt(PortEdit.Text)));
end;

Теперь посмотрим что же получилось, заполняем все поля (настройки для получения почты можно взять на почтовых серверах, где у вас зарегистрирован почтовый ящик) (Рис.3):

Отправка почты - Дизайн формы

Рис. 3 — Отправка почты — Дизайн формы

Тестирование прошло успешно. Сегодня попробую протестировать на других почтовых серверах.

PS: Если есть пожелания — пишите, с удовольствием выслушаю и по возможности реализую.
Продолжение:
Проверка почты средствами Delphi — часть 2

Проверка почты средствами Delphi — часть 3

Исходники программы можно скачать на GitHub

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *