Задача: Расширить возможности программы проверки почты, и добавить возможность проверять почту с использованием SSL (Secure Sockets Layer — уровень защищённых сокетов). И так определимся с заданиями которые расширят программу проверки почты:
- Добавить поддержку SSL для безопасного соединения.
- Проверить работоспособность почтовой программы на gmail.com (там используется SSL) и ukr.net (Без шифрования)
Инструментарий: Delphi XE, компоненты INDY v10, Библиотеки libeay32.dll и ssleay32.dll
Решение:
Предыдущая часть:
Проверка почты средствами Delphi — часть 1
В первой части мы создали программу, которая проверяет почту напрямую без поддержки шифрования. В данной части мы интегрируем поддержку шифрования. Приступим к реализации.
Для того чтобы была возможность использовать SSL соединение нужно в папку с проектом скопировать два файла libeay32.dll и ssleay32.dll , в них уже реализован тот функционал который нам необходим. Библиотеки libeay32.dll и ssleay32.dll можно скачать тут.
Открываем проект, который создан в первой части. Открываем главную форму и перемещаем на неё компонент IdSSLIOHandlerSocketOpenSSL (Рис. 1). Также перемести на форму еще несколько дополнительные элементов управления и настроим их в соответствии с табл. 1.
Установим следующие параметры:
Табл. 1
Компонент | Свойство | Значение | Описание |
IdSSLIOHandlerSocketOpenSSL | Name | SSLHandler | |
CheckBox | Name | chkUseSSL | Если переключатель включен – используем SSL соединение |
Caption | Использовать SSL | ||
ComboBox | Name | cbSSLType | В нем будет сохраняться тип SSL подключения sslvTLSv1 , sslvSSLv2… |
Items | sslvSSLv2 sslvSSLv23 sslvSSLv3 sslvTLSv1 |
||
ItemIndex | 0 | ||
Button | Name | btnTest | Кнопка для мгновенной проверки почты, исключительно для тестирования, запускает процедуру CheckMail, которая осуществляет подключение к серверу и проверяет наличие почты. |
В результате у нас получилась следующая форма Рис.2, Рис. 3
Переходим в редактор кода и добавляем процедуру настройки SSL соединения, назовём ее SetupSSL. Код реализации приведен ниже:
procedure TfrmMain.SetupSSL;
begin
if chkUseSSL.Checked then //если включена опция использовать SSL
begin
IdPOP3.IOHandler := SSLHandler; //устанавливаем SSL Handler для IdPOP3
IdPOP3.UseTLS := utUseImplicitTLS; //использовать неявный TSL
//Устанавливаем тип SSL
case cbSSLType.ItemIndex of
0: SSLHandler.SSLOptions.Method := sslvSSLv2;
1: SSLHandler.SSLOptions.Method := sslvSSLv23;
2: SSLHandler.SSLOptions.Method := sslvSSLv3;
3: SSLHandler.SSLOptions.Method := sslvTLSv1;
else
raise Exception.Create('Выберите тип SSL');
end;
end
else
begin
IdPOP3.IOHandler := nil; //если не используем SSL - устанавливаем все по умолчанию
IdPOP3.UseTLS := utNoTLSSupport;
end;
end;
Добавляем объявление процедуры в секцию private класса главной формы:
private
…
function CheckMail(IP: TIdPOP3; User, Pass, Host: string; Port: Integer): String;
procedure SetupSSL;
public
Для того чтобы наша процедура SetupSSL заработала в существующем коде – нужно добавить ее вызов в функцию CheckMail, которую мы написали в первой части.
…
IP.Port:=Port; // порт
SetupSSL; // настройка SSL соединения
IP.Connect; // подключаемся
…
Дальше запускаем и проверяем работоспособность.
Проверяем почту на gmail.com со следующими настройками:
POP3: pop.gmail.com
Порт: 995
А также для аккаунта gmail.com должна быть включена возможность получать почту с помощью сторонних программ через POP3. На Рис.4,Рис.5 представлена работоспособность программы.
PS: Программа проверки почты на Delphi теперь работает с поддержкой SSL. Тут есть одна неопределенность. Программа показывает общее количество писем, а не количество новых. Если будет время опишу как проверить количество новых писем.
Библиотеки libeay32.dll и ssleay32.dll можно скачать тут.
Исходники программы можно скачать на GitHub
Продолжение в 3-й части: Проверка почты средствами Delphi — часть 3
Добрый вечер, подскажите пожалуйста постоянно возникает ошибка "Ошибка подключения! Could not load SSL library." Как это можно исправить?
Добрый вечер. Вам нужно скопировать в папку с программой файлы libeay32.dll и ssleay32.dll. В начале статьи есть ссылка на скачивание.
Не выходит. Делфи ругается на IdPOP3.UseTLS := utUseImplicitTLS;
Говорит незадекларированный идентификатор: UseTLS. Что делать?
Две dll скачал в папку с проектом.
Возможо вы используете другую версию версию компоентов, посмотрите по там должно быть другое подходящее свойство.
Подскажите пожалуйста, можно ли читать сообщения только из конкретной папки?
По сути если мы говорим об одном и том же, тогда это не совсем папки а ярлыки, и скорее всего что в полученном сообющении должна быть какая то информация об этом. Но фильтровать на клиенте тоже не вариант.
По теме нашел только как вычитать сами ярлыки (gmail labels):
http://rest-examples.chilkat.io/gmail/delphiDll/chilkat_302.cshtml
Спасибо за ответ. Для уточнения: письма приходят во «входящие». Я хочу добавить папку, например, «work». Из «входящих» перетащить руками письма в «work» и программой обрабатывать письма только из «work», но не трогать письма во «входящие».
Код из Вашей ссылки помогает определить эти самые «входящие» и «work»?
да, он вернет только список всех «папок». Но нужно смотреть в сторону заголовков самих писем, они должны содержать информацию в какой «папке» они находятся. Если вы используете Gmail, тогда лучше использовать rest api. https://developers.google.com/gmail/api/guides/?hl=RU