Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.05.2012, 13:38   #11
Leximus
Пользователь
 
Регистрация: 18.09.2010
Сообщений: 85
По умолчанию

Давайте вернёмся к тому что есть...
Я сейчас хочу написать процедуру которая полноценно проверить на правильность E-mail....
Потом выложу её тут для обсуждения и критики!
Повторяю вопрос, какие символы допустимы при правильном E-mail:

'a'..'z', 'A'..'Z', '0'..'9', '_', '-', '.', '@'

Это все символы?
Leximus вне форума Ответить с цитированием
Старый 10.05.2012, 13:42   #12
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Просто пишу программу по рассылки новостей по клиентам, и на какомто клиенте ошибка встала...
ну так и делайте обработку ошибок! Всё равно корректный (формально) адрес вполне может ссылаться на несуществующий домен.
Вот при отправке и определите "битые" адреса.

а так вам хватит минимальной проверки, что в имени пользователя/домена не использованы недопустимые символы.

объяснение стандарт RFC 2822. на адреса тут:
Internet E-mail address format (RFC 822) explained
или тут:
http://tools.ietf.org/html/rfc2822#section-3.4.1

а ещё, возможно, полезные для вас ссылки:
How to Find or Validate an Email Address

Email address - Wikipedia, the free encyclopedia



p.s. я не уверен, что все почтовые web-сервисы строго следуют этим правилам!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.05.2012, 13:54   #13
Leximus
Пользователь
 
Регистрация: 18.09.2010
Сообщений: 85
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
ну так и делайте обработку ошибок! Всё равно корректный (формально) адрес вполне может ссылаться на несуществующий домен.
Вот при отправке и определите "битые" адреса.

а так вам хватит минимальной проверки, что в имени пользователя/домена не использованы недопустимые символы.

объяснение стандарт RFC 2822. на адреса тут:
Internet E-mail address format (RFC 822) explained
или тут:
http://tools.ietf.org/html/rfc2822#section-3.4.1

а ещё, возможно, полезные для вас ссылки:
How to Find or Validate an Email Address

Email address - Wikipedia, the free encyclopedia



p.s. я не уверен, что все почтовые web-сервисы строго следуют этим правилам!
Обработка ошибок может срабатывать на разные моменты, на тот случай если не правильно адрес указан, то хочется чтобы моя программа сработала нормально, без обработчика, чтобы потом указать о неправильности E-mail адреса.
Leximus вне форума Ответить с цитированием
Старый 10.05.2012, 13:57   #14
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Как-то встретил супер-пупер регулярное выражение для проверки правильности адреса (http://www.ex-parrot.com/~pdw/Mail-RFC822-Address.html). Не проверял, но объем и сложность впечатлили
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 10.05.2012, 21:03   #15
Leximus
Пользователь
 
Регистрация: 18.09.2010
Сообщений: 85
По умолчанию

Выкладываю тут свою функцию на обозрение!!!
По поводу проверки домена сразу скажу, что намеренно не стал требовать символов . и допускаю например название sss@ddd
Так как в локальной сети такой адрес может теоретически быть, есть кто то сервер поднимет
А всё остальное вроде учтено!

Код:
function CheckEmail(email: string) : boolean;
var
  user,domen: string;
  i: Integer;
begin
  Result := False;
  //CheckEmail := false;
  {Проверка на недопустимые символы}
  for i:= 1 to Length(email) do
    begin
      if not (email[i] in ['a'..'z', 'A'..'Z', '0'..'9', '_', '-', '.', '@']) then
        Exit;
    end;
  {Конец проверки на недопустимые символы}

  {Проверка на наличие разделителя символа @}
  if (Pos('@',email)=0) then
    Exit;



  user := Copy(email, 1, Pos('@',email)-1);
  domen := Copy(email, Pos('@',email)+1, Length(email) - Pos('@',email));

  {Имя пользователя должно быть не меньше 1 символа}
  if Length(user)=0 then
    Exit;

  {Имя сервера должно быть не меньше 4 символа}
  if Length(domen)=0 then
    Exit;

  {Проверка на допустимые символы в имени пользователя}
  for i:= 1 to Length(user) do
    begin
      if not (user[i] in ['a'..'z', 'A'..'Z', '0'..'9', '_', '-', '.']) then
        Exit;
    end;

  {Проверка на допустимые символы в домене}
  for i:= 1 to Length(domen) do
    begin
      if not (domen[i] in ['a'..'z', 'A'..'Z', '0'..'9', '-', '.']) then
        Exit;
    end;

  {Имя пользователя не может начинаться с точки}
  if (user[1] = '.') then
    Exit;
  {Имя домена не может начинаться с точки}
  if (domen[1] = '.') then
    Exit;
  {Имя домена не может заканчиваться точкой}
  if (domen[Length(domen)] = '.') then
    Exit;
  {В домене не может быть две точки подряд}
  if (Pos('..', domen) <> 0) then
    Exit;
   Result := true;
end;
Leximus вне форума Ответить с цитированием
Старый 10.05.2012, 21:31   #16
Valio
Сливочное масло
Участник клуба
 
Аватар для Valio
 
Регистрация: 01.01.2011
Сообщений: 1,149
По умолчанию

Бредово както написано, можно проще всё делать.

Вся проблема заключается в том, что мы проверяем адрес на соответсвие некоторых правил, которые нужно соблюдать при его написание. Но это недаёт никакой гарантии, что даже "правильный" адрес может существовать.

Есть ли смысл проверять этот адрес: valio@best.ru
Нету, ибо его не существует и на него нельзя ничего отправить.

PS:

Цитата:
Имя
Должно начинаться с буквы/цифры
Не дожно содержать символов кроме [0-9a-zA-Z\-\_\.]
Не должно содержать двух точек подряд
Должно заканчиваться на букву/цифру

С доменом всё аналогично. Последняя часть доменного имени (com, info ...) должна состоять из 2-6 буквенных символов.
Доменное имя можеть быть вида my.cool.sub.domain.com
И ещё раз повторю, что самый лучший способ проверки это отправить письмо.
Сливочное масло Valio - компиляция как по маслу
Valio вне форума Ответить с цитированием
Старый 10.05.2012, 21:41   #17
Leximus
Пользователь
 
Регистрация: 18.09.2010
Сообщений: 85
По умолчанию

Цитата:
Сообщение от Valio Посмотреть сообщение
Бредово както написано, можно проще всё делать.

Вся проблема заключается в том, что мы проверяем адрес на соответсвие некоторых правил, которые нужно соблюдать при его написание. Но это недаёт никакой гарантии, что даже "правильный" адрес может существовать.

Есть ли смысл проверять этот адрес: valio@best.ru
Нету, ибо его не существует и на него нельзя ничего отправить.

PS:



И ещё раз повторю, что самый лучший способ проверки это отправить письмо.
Как выяснилось имя может начинаться и с _ и с __!
Оно может быть даже такого вида __.@aaa.ru
Понятно что у некоторых почтовых серверов могут стоять ограничения, но что такой адрес может быть это факт!

У меня при отправке на некоторые адреса возникала ошибка! После данной проверки ни одной ошибки нету! Она конечно может быть в другом, в том что адрес не существует но это уже проблема сервера. А до этого у меня сервер просто отказывался принимать не правильные адреса. Тоесть те которые просто быть не могут!
Leximus вне форума Ответить с цитированием
Старый 10.05.2012, 22:47   #18
=master=
Форумчанин
 
Регистрация: 26.03.2012
Сообщений: 665
По умолчанию

Да, велосипед с квадратными колесами както не оч. ездит.
=master= вне форума Ответить с цитированием
Старый 10.05.2012, 22:57   #19
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Наверное, самый надежный - спросить у DNS-сервера.
s-andriano вне форума Ответить с цитированием
Старый 10.05.2012, 23:01   #20
Leximus
Пользователь
 
Регистрация: 18.09.2010
Сообщений: 85
По умолчанию

Цитата:
Сообщение от =master= Посмотреть сообщение
Да, велосипед с квадратными колесами както не оч. ездит.
Вот тут бы я паспорилбы! Отправил на более чем на 45 тысяч адресов и всё нормально. Функция отлично отсеяла неправильные адреса и отправка произошла без одной ошибки.
Leximus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проверить правильность E-mail адресса Holzz Общие вопросы Delphi 6 02.08.2011 12:08
Проверить на правильность задачу sam5213 Паскаль, Turbo Pascal, PascalABC.NET 0 23.12.2010 18:28
DateEdit из Библиотеки RX. Как проверить правильность даты? Vit@L Компоненты Delphi 2 22.02.2010 11:11
Как проверить дескриптор (указатель) на правильность? TwiX Общие вопросы Delphi 11 13.02.2010 22:10
MailItemPtr или IMessage как получить e-mail адрес? Iskuzer Общие вопросы C/C++ 0 26.10.2008 14:27