0 / 0 / 0
Регистрация: 09.08.2022
Сообщений: 16
1

Проверка письма на спам

09.08.2022, 20:32. Показов 3254. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Опять сложная задача
Есть задача, где нужно научить программу сортировать спам
Письмо относится к спаму, если:
mail_text состоит только из заглавных букв;
текст содержит ссылку, которая начинается на https или www;
содержит одно из стоп-слов: 'Без вложений', 'Скидки', 'Распродажа', 'Выгода', 'Гарантия'.
{'Отправитель': 'Текст письма'} помещается в отдельный список spam и не добавляется в mail_box, если письмо — спам. В остальных случаях письмо не относится к спаму и сортируется по тому же алгоритму, что был раньше.
Письмо проверяется на спам функцией is_spam(mail_text). Она возвращает True, если mail_text содержит спам, и False — если нет.
Врод как с проверкой строки на наличие стоп слова у меня всё ок и с проверкой текста письма тоже, но вот не получается проверить само письмо, подскажите пожалуйста, в чём может быть ошибка
Python
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
mail_box = {}   # тут хранятся проверенные письма
spam = []   # сюда складываем спам
 
# проверка строки на наличие стоп-слов, используется внутри is_spam()
def str_contains_stop_words(string):
    stop_words = ['Без вложений', 'Скидки', 'Распродажа', 'Выгода', 'Гарантия']
    for w in stop_words:
        if w in string:
            return True
    return False
 
# проверка текста письма на спам, используется внутри mail_checker
def is_spam(mail_text):
    if mail_text == mail_text.upper() or 'https' in mail_text or str_contains_stop_words(mail_text):
        return True
    else:
        return False
 
 
# функция для проверки письма
def mail_checker(mail_from, mail_to, mail_text):
    if str_contains_stop_words or is_spam == True:
        spam.append({mail_from : mail_text})
    else:
        mail_box[mail_to] = []
        mail_box[mail_to].append({mail_from : mail_text})
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.08.2022, 20:32
Ответы с готовыми решениями:

Письма к клиентам попадают в спам, проверка просит поменять SPF и DKIM, что делать?
Нужно как-то поменять SPF, но где это можно сделать? А также DKIM: "Пожалуйста, убедитесь, что...

Письма в спам
Как решить можно проблему поподания письма в спам? на домен.netmaster.lt = отправлялось всё ок,...

Lotus. Спам-письма
Приветствую! Есть корпоративный Lotus север, версия 8.5.3. В последнее время на него приходят...

Письма попадают в спам
Привет, использую вот такой скрипт для отправки почты. В gmail письма попадают в спам, что нужно...

zimbra письма уходят в спам
Добрый день, с zimbra письма уходят но недоходят до получателя по логам сообщение отклонено потом ...

7
4464 / 3216 / 1126
Регистрация: 21.03.2016
Сообщений: 7,956
09.08.2022, 21:39 2
# проверка строки на наличие стоп-слов, используется внутри is_spam()
Цитата Сообщение от Sergey_Tokarev Посмотреть сообщение
проверкой текста письма тоже, но вот не получается проверить само письмо
не совсем понятно. текст вы проверили. о какой проверке письма идет речь?
0
0 / 0 / 0
Регистрация: 09.08.2022
Сообщений: 16
09.08.2022, 22:04  [ТС] 3
У меня есть письма, которые приходят
Python
1
2
3
4
5
6
# полученные письма
mail_checker(mail_to='yoda_master@yandex.ru', mail_from='luke_skywalker@yandex.ru', mail_text='Магистр Йода, а в чём сила?')
mail_checker(mail_to='ilon_mask@yandex.ru', mail_from='trusted_mail@yandex.ru', mail_text='Скидки на акции Tesla, только у нас!')
mail_checker(mail_to='chandler_bing@yandex.ru', mail_from='ross_geller@yandex.ru', mail_text='Смотри, я открыл новый вид динозавра https://rossoceraptor.html')
mail_checker(mail_to='piter_parker@yandex.ru', mail_from='j_jonah_jameson@yandex.ru', mail_text='Паркер! Мне срочно нужны фото Паука!')
mail_checker(mail_to='neo@yandex.ru', mail_from='bad_matrix@yandex.ru', mail_text='РАСПРОДАЖА!!! ДВЕ КРАСНЫХ ТАБЛЕТКИ ПО ЦЕНЕ ТРЁХ СИНИХ')
В проверке текста я проверяю на наличие текста только из заглавных букв и содержит ли текст http и www и если такое есть в тексте, то поместить это письмо в спам.

А в проверке мне нужно отсортировать письма по получателям.
Это должно работать так:
На вход функции подаются три параметра: mail_to, mail_from, mail_text.
Функция обрабатывает письмо и добавляет его в словарь mail_box.
0
0 / 0 / 0
Регистрация: 09.08.2022
Сообщений: 16
10.08.2022, 08:51  [ТС] 4
В общем, на данный момент у меня получилось вот такое решение, но оно всёравно не верное)
Я пока не могу сообразить, как мне в проверке письма обратиться к проверке письма на спам и наличие стоп слов)
Python
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
mail_box = {}   # тут хранятся проверенные письма
spam = []   # сюда складываем спам
 
# проверка строки на наличие стоп-слов, используется внутри is_spam()
def str_contains_stop_words(string):
    stop_words = ['Без вложений', 'Скидки', 'Распродажа', 'Выгода', 'Гарантия']
    for w in stop_words:
        if w in string:
            return True
    return False
 
# проверка текста письма на спам, используется внутри mail_checker
def is_spam(mail_text):
    if mail_text == mail_text.upper() or 'https' in mail_text or str_contains_stop_words(mail_text):
        return True
    else:
        return False
 
 
# функция для проверки письма
def mail_checker(mail_from, mail_to, mail_text):
    
    if mail_to in mail_box:
        mail_box[mail_to].append({mail_from : mail_text})
    else:
        mail_box[mail_to] = []
        mail_box[mail_to].append({mail_from : mail_text})
    return spam.append({mail_from : mail_text})
 
# полученные письма
mail_checker(mail_to='yoda_master@yandex.ru', mail_from='luke_skywalker@yandex.ru', mail_text='Магистр Йода, а в чём сила?')
 
mail_checker(mail_to='ilon_mask@yandex.ru', mail_from='trusted_mail@yandex.ru', mail_text='Скидки на акции Tesla, только у нас!')
 
mail_checker(mail_to='chandler_bing@yandex.ru', mail_from='ross_geller@yandex.ru', mail_text='Смотри, я открыл новый вид динозавра https://rossoceraptor.html')
 
mail_checker(mail_to='piter_parker@yandex.ru', mail_from='j_jonah_jameson@yandex.ru', mail_text='Паркер! Мне срочно нужны фото Паука!')
 
mail_checker(mail_to='neo@yandex.ru', mail_from='bad_matrix@yandex.ru', mail_text='РАСПРОДАЖА!!! ДВЕ КРАСНЫХ ТАБЛЕТКИ ПО ЦЕНЕ ТРЁХ СИНИХ')
 
print(mail_box)
# Будет выведено:
# '''
# {
#   'yoda_master@yandex.ru': [
#           {'luke_skywalker@yandex.ru': 'Магистр Йода, а в чем сила?'}
#   ],
#   'piter_parker@yandex.ru': [
#           {'j_jonah_jameson@yandex.ru': 'Паркер! Мне срочно нужны фото Паука!'}
#   ]
# }
# '''
 
print(spam)
# Будет выведено:
# '''
# [
# {'trusted_mail@yandex.ru': 'Скидки на акции Tesla, только у нас!'},
# {'ross_geller@yandex.ru': 'Смотри, я открыл новый вид динозавра https://rossoceraptor.html'},
# {'bad_matrix@yandex.ru': 'РАСПРОДАЖА!!! ДВЕ КРАСНЫХ ТАБЛЕТКИ ПО ЦЕНЕ ТРЕХ СИНИХ'}]
# '''
После выполнения программы я получаю вот такой ответ
{'yoda_master@yandex.ru': [{'luke_skywalker@yandex.ru': 'Магистр Йода, а в чём сила?'}], 'ilon_mask@yandex.ru': [{'trusted_mail@yandex.ru': 'Скидки на акции Tesla, только у нас!'}], 'chandler_bing@yandex.ru': [{'ross_geller@yandex.ru': 'Смотри, я открыл новый вид динозавра https://rossoceraptor.html'}], 'piter_parker@yandex.ru': [{'j_jonah_jameson@yandex.ru': 'Паркер! Мне срочно нужны фото Паука!'}], 'neo@yandex.ru': [{'bad_matrix@yandex.ru': 'РАСПРОДАЖА!!! ДВЕ КРАСНЫХ ТАБЛЕТКИ ПО ЦЕНЕ ТРЁХ СИНИХ'}]}
[{'luke_skywalker@yandex.ru': 'Магистр Йода, а в чём сила?'}, {'trusted_mail@yandex.ru': 'Скидки на акции Tesla, только у нас!'}, {'ross_geller@yandex.ru': 'Смотри, я открыл новый вид динозавра https://rossoceraptor.html'}, {'j_jonah_jameson@yandex.ru': 'Паркер! Мне срочно нужны фото Паука!'}, {'bad_matrix@yandex.ru': 'РАСПРОДАЖА!!! ДВЕ КРАСНЫХ ТАБЛЕТКИ ПО ЦЕНЕ ТРЁХ СИНИХ'}]

Process finished with exit code 0
0
Эксперт Python
2866 / 1484 / 273
Регистрация: 18.01.2021
Сообщений: 2,879
10.08.2022, 09:48 5
Sergey_Tokarev, проверка на стоп-слова у вас не проходит из-за регистра

Добавлено через 1 минуту
Цитата Сообщение от Sergey_Tokarev Посмотреть сообщение
как мне в проверке письма обратиться к проверке письма на спам и наличие стоп слов
Вызвать функцию is_spam?
0
4464 / 3216 / 1126
Регистрация: 21.03.2016
Сообщений: 7,956
10.08.2022, 13:36 6
Лучший ответ Сообщение было отмечено Sergey_Tokarev как решение

Решение

Python
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
# функция для проверки письма
def is_spam(mail_text): 
    if mail_text.isupper(): # если текст из заглавных завершаем функцию
        return False
    mail_text = mail_text.lower()# приводим текст к одному нижнему регистру
    for stop_ in stop_words:
        if stop_  in mail_text: # проверяем на наличие стоп слов
            return False
    for text in mail_text.split(): # делим текст по пробелу:
        if text.startswith('https') or text.startswith('www'): # проверяем на ссылки
            return False
    return True       
    
# функция для cсортировки писем
def mail_checker(mail_from, mail_to, mail_text):
    if is_spam(mail_text):
        mail_box[mail_to] = []
        mail_box[mail_to].append({mail_from : mail_text})
        return
    spam.append({mail_from : mail_text})
    
 
 
stop_words = ('без вложений', 'скидки', 'распродажа', 'выгода', 'гарантия')
mail_box = {}   # тут хранятся проверенные письма
spam = []   # сюда складываем спам
# полученные письма
mail_checker(mail_to='yoda_master@yandex.ru', mail_from='luke_skywalker@yandex.ru', mail_text='Магистр Йода, а в чём сила?')
mail_checker(mail_to='ilon_mask@yandex.ru', mail_from='trusted_mail@yandex.ru', mail_text='Скидки на акции Tesla, только у нас!')
mail_checker(mail_to='chandler_bing@yandex.ru', mail_from='ross_geller@yandex.ru', mail_text='Смотри, я открыл новый вид динозавра https://rossoceraptor.html')
mail_checker(mail_to='piter_parker@yandex.ru', mail_from='j_jonah_jameson@yandex.ru', mail_text='Паркер! Мне срочно нужны фото Паука!')
mail_checker(mail_to='neo@yandex.ru', mail_from='bad_matrix@yandex.ru', mail_text='РАСПРОДАЖА!!! ДВЕ КРАСНЫХ ТАБЛЕТКИ ПО ЦЕНЕ ТРЁХ СИНИХ')
print(*mail_box, sep ='\n')    
print('spam')
print(*spam, sep ='\n')
>>> %Run
yoda_master@yandex.ru
piter_parker@yandex.ru
spam
{'trusted_mail@yandex.ru': 'Скидки на акции Tesla, только у нас!'}
{'ross_geller@yandex.ru': 'Смотри, я открыл новый вид динозавра https://rossoceraptor.html'}
{'bad_matrix@yandex.ru': 'РАСПРОДАЖА!!! ДВЕ КРАСНЫХ ТАБЛЕТКИ ПО ЦЕНЕ ТРЁХ СИНИХ'}
>>>

Добавлено через 21 минуту
сразу не обратил внимания на вашу функцию mail_checker которая перезаписывает значение ключа на новый список. в вашем примере это не видно но когда к одному получателю придет несколько писем то в итоге в списке останется последнее. исправил
Python
1
2
3
4
5
6
# функция для cсортировки писем
def mail_checker(mail_from, mail_to, mail_text):
    if is_spam(mail_text):
        mail_box.setdefault(mail_to, []).append({mail_from : mail_text})
        return
    spam.append({mail_from : mail_text})
0
Эксперт Python
2866 / 1484 / 273
Регистрация: 18.01.2021
Сообщений: 2,879
10.08.2022, 14:58 7
Лучший ответ Сообщение было отмечено Sergey_Tokarev как решение

Решение

Semen-Semenich, вы ящики перепутали)

Добавлено через 1 минуту
Python
1
    if not is_spam(mail_text):
Добавлено через 2 минуты
Извините, не заметил, что is_spam у вас возвращает False на спам. Коварно))
0
0 / 0 / 0
Регистрация: 09.08.2022
Сообщений: 16
10.08.2022, 14:59  [ТС] 8
Ребят, всем спасибо!)
Собрал всё в одно и верный код (который принял тренажёр) вот такой

Python
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
mail_box = {}   # тут хранятся проверенные письма
spam = []   # сюда складываем спам
 
# проверка строки на наличие стоп-слов, используется внутри is_spam()
def str_contains_stop_words(string):
    stop_words = ['Без вложений', 'Скидки', 'Распродажа', 'Выгода', 'Гарантия']
    for w in stop_words:
        if w in string:
            return True
    return False
 
# проверка текста письма на спам, используется внутри mail_checker
def is_spam(mail_text):
    if mail_text == mail_text.upper() or 'https' in mail_text or str_contains_stop_words(mail_text):
        return True
 
 
# функция для проверки письма
def mail_checker(mail_from, mail_to, mail_text):
    if not is_spam(mail_text):
        mail_box.setdefault(mail_to, []).append({mail_from : mail_text})
        return
    spam.append({mail_from : mail_text})
 
# полученные письма
mail_checker(mail_to='yoda_master@yandex.ru', mail_from='luke_skywalker@yandex.ru', mail_text='Магистр Йода, а в чём сила?')
 
mail_checker(mail_to='ilon_mask@yandex.ru', mail_from='trusted_mail@yandex.ru', mail_text='Скидки на акции Tesla, только у нас!')
 
mail_checker(mail_to='chandler_bing@yandex.ru', mail_from='ross_geller@yandex.ru', mail_text='Смотри, я открыл новый вид динозавра https://rossoceraptor.html')
 
mail_checker(mail_to='piter_parker@yandex.ru', mail_from='j_jonah_jameson@yandex.ru', mail_text='Паркер! Мне срочно нужны фото Паука!')
 
mail_checker(mail_to='neo@yandex.ru', mail_from='bad_matrix@yandex.ru', mail_text='РАСПРОДАЖА!!! ДВЕ КРАСНЫХ ТАБЛЕТКИ ПО ЦЕНЕ ТРЁХ СИНИХ')
 
print(mail_box)
# Будет выведено:
# '''
# {
#   'yoda_master@yandex.ru': [
#           {'luke_skywalker@yandex.ru': 'Магистр Йода, а в чем сила?'}
#   ],
#   'piter_parker@yandex.ru': [
#           {'j_jonah_jameson@yandex.ru': 'Паркер! Мне срочно нужны фото Паука!'}
#   ]
# }
# '''
 
print(spam)
# Будет выведено:
# '''
# [
# {'trusted_mail@yandex.ru': 'Скидки на акции Tesla, только у нас!'},
# {'ross_geller@yandex.ru': 'Смотри, я открыл новый вид динозавра https://rossoceraptor.html'},
# {'bad_matrix@yandex.ru': 'РАСПРОДАЖА!!! ДВЕ КРАСНЫХ ТАБЛЕТКИ ПО ЦЕНЕ ТРЕХ СИНИХ'}]
# '''
0
10.08.2022, 14:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.08.2022, 14:59
Помогаю со студенческими работами здесь

Письма попадают в спам (частично)
Добрый день друзья, отправляю письма с почтового сервера на хостинге и часть писем уходит в спам...

С сайта приходят пустые письма и спам
Здравствуйте, через PHPMailer сделал обратную форму связи, но очень много стало приходить пустых...

Письма созданные из SmtpClient попадают в спам
Добрый день Ситуация такая: Год все работало нормально а где то недели 2 назад письма...

Письма с моего домена улетают в спам
Купил домен, повесил на хостинг. На хостинге простенький сайт. Периодически веду рассылку 30-50...

Спам. Текст письма и его декодирование
Недавно на один из моих ящиков пришло довольно странное сообщение. (странное - для меня, ибо с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru