понедельник, 12 апреля 2010 г.

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

   Доброе время суток. Я начинаю цикл статей которые направлены на работу по созданию почтового клиента с помощью компонент Indy.
   Для начала определимся с инструментарием: при написании программы я использовал Delphi 2010 (Delphi 2009) компоненты 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: Если есть пожелания - пишите, с удовольствием выслушаю и по возможности реализую.
Продолжение во 2-й части: Проверка почты средствами Delphi - часть 2

17 комментариев:

Анонимный комментирует...

Как это использовать на Yandex.ru ?

androschuk комментирует...

Очень просто нужно перейти на страницу яндекса и посмотреть настройки почты для Outlook. И так для каждого почтового сервера.
Для яндекса настройки следующие:

Адрес: ваш емейл
Пароль: пароль к вашей почте
POP3 сервер: pop.yandex.ru
Порт: 110

Сегодня проверял, все работает.

Анонимный комментирует...

На GMail не работает...(безопосное соединение на спец. порт).

androschuk комментирует...

Само собой, нужно дописать поддержку SSL. Сейчас очень занят, когда освобожусь обязательно опишу как и что делается в 2-й части статьи.

Подпишитесь на RSS и будете в курсе событий.

Анонимный комментирует...

А хде продолжение

androschuk комментирует...

Продолжение обязательно будет. Время выхода точно не скажу.

Анонимный комментирует...

Классика жанра - продолжения так и не последовало? :)

androschuk комментирует...

К сожалению нет, но надежда все таки есть

Анонимный комментирует...

Александр! Вы обещали продолжить! ГДЕ? КОГДА?

androschuk комментирует...

Напишите пожалуйста какое именно направление Вас интересует.

Unknown комментирует...

Поддержка SSl, хотя-бы. Минимальная база данных для нескольких почтовых ящиков, экономное поддержание актуального состояния почты. Лично мне интересно все :)

Анонимный комментирует...

добрый день. имею вопросик по программе проверки/отправки почты из delphi и чтение присобаченных файлов с занесением в таблицу oracle.
как можно связаться по e-mail иди через соц.сети?

Анонимный комментирует...

Oleksandr Androschuk, как можно с вами связаться по e-mail или соц.сети?

androschuk комментирует...

Google профиль:
http://www.google.com/profiles/107939711914675766908

androschuk комментирует...

Написал новую часть
http://androschuk.blogspot.com/2013/03/delphi-2.html

Анонимный комментирует...

Обещанного 7 лет ждут

androschuk комментирует...

Блог переехал, новый адрес mirsovetov.net