Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Проверка e-mail адреса на валидность. / 5 сообщений из 5, страница 1 из 1
29.06.2011, 02:36
    #37328070
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка e-mail адреса на валидность.
Ну, разумно
1) есть @собака, @собака одна и только одна
2) нет пробелов (или убирать их что ли?)

Всевозможными контролями согласно RFC типа чебурашка@mail.ru или %%%@mail.longextention =плохо заниматься не хочу, здесь можно переборщить.

Но:
a)Введенное в listbox столбиком будет храниться в формате
aaa@bk.ru;Василий Петрович<vasja@server.org>;;petr@itd.com
в поле БД mdb (как обсуждали видимо это будет мемо)
b) В этом же формате подаваться на вход CDO
c) Или возможно будет преобразовываться в формат
"aaa@bk.ru","Василий Петрович<vasja@server.org>;","petr@itd.com"
согласно требованиям командной строки альтернативного SMTP клиента.

Разумных кодов ошибок со стороны CDO/альтернативного SMTP клиента я не боюсь (принцип - от дурака не убережешься), но боюсь
к вылету программы ведущих ошибок со стороны ADODB , со стороны CDO/альтернативного SMTP клиента, ну и со стороны самой моей проги, интерпретирующей ";" как разделитель мыл.

Посему сразу наложил бы условия:

3) нет символа ; точка с запятой
4) нет символа , запятая
5) нет символа " кавычек

Есть еще соображения? (Избыточного контроля не надо!!!)

И, аналогично, контроль ИМЕНИ адресата.
1) нет символа ; точка с запятой
2) нет символа , запятая
Что-то еще? Задумался про кавычки...Разрешить или не разрешить? Если разрешить(проверил на OE что это допустимо), то сильно усложняется обработка...даже не знаю.
...
Рейтинг: 0 / 0
29.06.2011, 12:33
    #37328646
big-duke
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка e-mail адреса на валидность.
...
Рейтинг: 0 / 0
29.06.2011, 12:59
    #37328690
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка e-mail адреса на валидность.
big-duke,

регулярные выражения это конечно хорошо, хотя и не пробовал мутить такие конструкции с VB, но думаю то что там приводится это избыточно, я подобные топики уже читал до того как делать пост.

Задача: чтоб ничего не вылетело в проге, а не чтоб обязательно дослалось.
Microsoft-овские проги похоже проверяют только "один и только один собака@", да и то не всегда.
...
Рейтинг: 0 / 0
29.06.2011, 13:18
    #37328736
big-duke
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка e-mail адреса на валидность.
Дмитрий77,

там есть и простые выражения для проверки, например, вот это - \b[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b. Это вполне подходит под ваши требования.
...
Рейтинг: 0 / 0
29.06.2011, 23:10
    #37329747
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка e-mail адреса на валидность.
big-duke,

чтобы использовать эти выражения в VB, надо использовать объект из Scripting library, я эту штуку недолюбливаю.
Ну, пока, на этапе user-формы сделал так (своим обычным нудным методом):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
Private Sub CommandTo_Click()
    Dim text_to_add As String
    If Len(TextEmailAddress.Text) =  0  Then
        MsgBox "No e-mail address specified for adding to the Recipients list.", vbExclamation + vbOKOnly, "Enter e-mail address"
    ElseIf IsValidEmailAddress(TextEmailAddress.Text) = False Then
        MsgBox "The e-mail address you have entered is not a valid e-mail address.", vbExclamation + vbOKOnly, "Invalid e-mail address"
    ElseIf IsValidEmailName(TextEmailName.Text) = False Then
        MsgBox "The recipient name you have entered can not be used.", vbExclamation + vbOKOnly, "Invalid recipient name"
    Else
        If IsEmailAlreadyInTheList(ListEmailTo, TextEmailAddress.Text) Then
            MsgBox "The e-mail address you have entered is already in the Recipients list and can not be added.", vbExclamation + vbOKOnly, "E-mail address already added"
        Else
            If Len(Trim(TextEmailName.Text)) >  0  Then
                text_to_add = Trim(TextEmailName.Text) & "<" & TextEmailAddress.Text & ">"
            Else
                text_to_add = TextEmailAddress.Text
            End If
            ListEmailTo.ListItems.Add , text_to_add, text_to_add
            ListViewSetItemPicture ListEmailTo, ListEmailTo.ListItems(text_to_add).Index,  0 
        End If
    End If
End Sub

Public Function IsValidEmailAddress(str_email As String) As Boolean
    'проверяет e-mail на валидность
    Dim temp As String
    IsValidEmailAddress = False
    temp = str_email
    If Not (ChNum(temp, "@") =  1 ) Then Exit Function
    If InStr(temp, " ") >  0  Then Exit Function
    If InStr(temp, ";") >  0  Then Exit Function
    If InStr(temp, ",") >  0  Then Exit Function
    If (InStr(temp, "<") >  0 ) Or (InStr(temp, ">") >  0 ) Then Exit Function
    If InStr(temp, Chr( 34 )) >  0  Then Exit Function
    IsValidEmailAddress = True
End Function

Public Function IsValidEmailName(str_name As String) As Boolean
    'проверяет имя получателя на валидность
    Dim temp As String
    IsValidEmailName = False
    temp = str_name
    If InStr(temp, ";") >  0  Then Exit Function
    If InStr(temp, ",") >  0  Then Exit Function
    If (InStr(temp, "<") >  0 ) Or (InStr(temp, ">") >  0 ) Then Exit Function
    If InStr(temp, Chr( 34 )) >  0  Then Exit Function
    IsValidEmailName = True
End Function

Public Function IsEmailAlreadyInTheList(the_listview As ComctlLib.ListView, str_email As String) As Boolean
    Dim the_email_in_list As String
    Dim i As Integer
    For i =  1  To the_listview.ListItems.Count
        the_email_in_list = the_listview.ListItems(i).Text
        'вычленение email, если указано имя
        If InStr(the_email_in_list, "<") >  0  Then
            the_email_in_list = _
              Trim(Right(the_email_in_list, Len(the_email_in_list) - InStr(the_email_in_list, "<")))
        End If
        If InStr(the_email_in_list, ">") >  0  Then
            the_email_in_list = _
              Trim(Left(the_email_in_list, InStr(the_email_in_list, ">") -  1 ))
        End If
        'сравнение
        If the_email_in_list = str_email Then
            IsEmailAlreadyInTheList = True
            Exit Function
        End If
    Next i
    IsEmailAlreadyInTheList = False
End Function

Любые критические замечания с т.зр. озвученных критериев:CDO, mdb приветствуются.

Задумался над кавычками: одинарными и особенно двойными, но думаю в email двойные недопустимы, а в имени от их запрета хуже не будет...
Еще наверно...случай переноса строки надо отсекать: это когда юзер копирует в текстовое поле "строка+перенос", в текстбоксе незаметно, а потом из за этого вся структура настроек падает и гадаешь почему прога падает.
Хотя...от этого я себя застраховал, в классе "про потерю фокуса" есть такие строки

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Private Sub TextBox_Change()
    'защита от ввода символа перевода каретки(ибо этот символ суть разделитель)
    If InStr(TextBox.Text, Chr( 10 )) >  0  Then
        TextBox.Text = tochkaSTR(TextBox.Text, Chr( 10 ), "")
    End If
    If InStr(TextBox.Text, Chr( 13 )) >  0  Then
        TextBox.Text = tochkaSTR(TextBox.Text, Chr( 13 ), "")
    End If
End Sub
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Проверка e-mail адреса на валидность. / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]