18 июля 2011

Проверка корректности адреса электронной почты

   Проверить корректность адреса электронной почты очень просто (не только синтаксис, но и его реальное существование). Для этого можно воспользоваться компонентой clEmailValidator из библиотеки Clever Internet Suite. Напишем с ее использованием простую функцию:

Function ValidateMail(const sAddress: String): Boolean;
Var
  clEV: TclEmailValidator;
begin
  clEV := TclEmailValidator.Create(nil);
  Try
    clEV.ValidationLevel := vlMailbox;
    clEV.DnsServer := '8.8.8.8';
    Result := clEV.Validate(sAddress) = vrMailboxOk
  Finally
     clEV.Free;
  End;
end;

Я задал всего лишь два свойства clEmailValidator (остальные можно пропустить). Первое и основное, это ValidationLevel - метод (уровень) проверки правильности адреса, их пять:
  1. vlBlacklist - проверка на вхождение адреса в ваш "чёрный список" (чёрный список хранится у clEmailValidator в свойстве BlackList типа TStrings);
  2. vlSyntax - проверка синтаксиса (проверяется при помощи шаблона RegEx);
  3. vlDomain - проверка существования домена (проверяется запросом DNS-информации для почтового домена);
  4. vlSmtp - проверка доступности почтового сервера (проверяется попыткой установления SMTP-соединения с хостом, указанным в MX-записи DNS);
  5. vlMailbox - проверка существования почтового ящика (проверяется попыткой отправить SMTP-запрос почтовому серверу с указанием проверяемого адреса в поле "RCPT TO").
   Я расположил эти значения в списке по очереди (в порядке) выполнения. Т.е. если вы хотите проверить существование домена, то clEmailValidator выполнит проверки нижнего уровня - сначала на вхождение в чёрный список, потом проверку синтаксиса адреса, а уж затем проверку существования домена.
   Проверка корректности с уровнем vlDomain и выше требует активного internet-подключения и у clEmailValidator необходимо задать значение свойству DnsServer. DnsServer - это IP-адрес name-сервера вашего internet-провайдера. В примере выше я использовал адрес Google Public DNS.
   При желании для уровня vlSmtp (и выше) можно задать имя которое используется в команде "SMTP HELO" (свойство HostName). А для уровня vlMailbox можно задать еще и адрес электронной почты, который используется в SMTP-запросе свойство EmailFrom). Я написал "при желании", т.к. у меня проверка корректности работает и без них.
   Метод Validate возвращает уровень, до которого проверка адреса электронной почты выполнилась корректно (vrBlacklistOk, vrSyntaxOk, vrDomainOk, vrSmtpOk, vrMailboxOk) или, если вы совсем ерунду подсунули clEmailValidator, то "vrInvalid".

06 июля 2011

Описание у службы Windows

   При написании очередной службы для MS Windows, меня посетила мысль: "А почему у TService нет свойства "Description"?". При этом из своего опыта знаю, что подобное свойство есть у аналогичных компонент: у TNtService из библиотеки SvCom и даже у бесплатной компоненты TDDService от Arno Garrels, а у стандартного TService его нет даже под Delphi XE. Я понимаю, что описание - это не важно, но служба без описания выглядит на фоне других как-то неполноценно.
   Метода для установки описания у TService я не нашел, поэтому ничего другого не оставалось, как добавить описание службе самому.
   Оказалось, у MS Windows для этого есть специальная функция - ChangeServiceConfig2 (в advapi32.dll), которая изменяет дополнительные параметры конфигурации службы. Вместо реализации вызова ChangeServiceConfig2 на Delphi я сделал проще – в событии TService.ServiceAfterInstall записал описание службы напрямую в реестр:

procedure TxyzSvc.ServiceAfterInstall(Sender: TService);
begin
  With TRegistry.Create(KEY_READ or KEY_WRITE) do
    Try
      RootKey := HKEY_LOCAL_MACHINE;
      If OpenKey('\SYSTEM\CurrentControlSet\Services\' + Name, False) then
        begin
          WriteString('Description', 'XYZ Service');
          CloseKey;
        end;
    Finally
      Free;
    End;
end;