Задача: Написать приложение с помощью которого будет возможность проверять наличие почтовых сообщений. Для начала решим следующие подзадачи:
- Проверка почты на наличие сообщений;
- Возможность задания периода проверки почты;
- Вывод уведомлений при наличии каких либо сообщений;
Инструментарий: Delphi, компоненты INDY
Решение:
Я начинаю цикл статей которые направлены на работу по созданию почтового клиента с помощью компонентов Indy.
При написании статьи я использовал Delphi 2010 компоненты Indy v10
В данной части мы выполним следующие задания:
- Проверка почты на наличие сообщений;
- Возможность задания периода проверки почты;
- Вывод уведомлений при наличии каких либо сообщений;
Раз определились с планом действий — приступим к следующему этапу — созданию. Создаем новый проект, и размещаем на форме компонент 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.
Что касается 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.):
Напишем функцию присвоения значений таймера, его активацию и вывод соответствующих сообщений в 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):
Тестирование прошло успешно. Сегодня попробую протестировать на других почтовых серверах.
PS: Если есть пожелания — пишите, с удовольствием выслушаю и по возможности реализую.
Продолжение:
Проверка почты средствами Delphi — часть 2
Проверка почты средствами Delphi — часть 3
Исходники программы можно скачать на GitHub