Python. POP3. Очистка ящика от сообщений заданного адресата
Задание: Очистка ящика от сообщений заданного адресата: при запуске программа удаляет все сообщения от определенного адресата.
main.py
import poplib
pop3_server = 'localhost'
pop3_port = '110'
box = poplib.POP3(pop3_server, pop3_port)
box.user('user1')
box.pass_('user1')
countOfMessages = len(box.list()[1])
print('total messages: ' + str(countOfMessages))
for i in range(countOfMessages, 0, -1):
msg = box.retr(i)[1]
if msg.find("<[email protected]>"):
box.dele(i)
box.quit()
input('Press enter to exit')
Идёт подключение к pop3 серверу, набираются команды user и pass (например заходим от имени user1 с таким же паролем). Далее я считываю количество сообщений в ящике user1. Получаю сообщения начиная с последнего с помощью retr() и проверяю, содержится ли строка [email protected] в полученном сообщении. Если содержится, то я удаляю это сообщение.
Но при запуске программа даже не доходит до участка подсчёта сообщений len(box.list()[1]). Но если заменить участок с циклом for на простое удаление последнего сообщения box.dele(countOfMessages), то программа отработает правильно и удалит 1 сообщение. В чём может заключаться проблема?
Ответы (1 шт):
Не уверен, в чём именно была ошибка, но вот что я исправил:
- Поменял pop3_server с localhost на 127.0.0.1
- При подключении к серверу привёл pop3_port к типу int
- Получаю каждое письмо построчно, если декодированная строка равна имени заданного адресата, то номер письма помещается в messagesToDelete, сразу перехожу к следующему письму.
- Разворачиваю список, чтобы при удалении не возникло ошибок, удаляю письма из ящика.
import poplib
pop3_server = '127.0.0.1'
pop3_port = '110'
box = poplib.POP3(pop3_server, int(pop3_port))
print("Connected to POP3 server")
user = input("Enter your login: ")
box.user(user)
password = input("Enter your password: ")
box.pass_(password)
print(f"Logged in as {user}")
print("Which user do you want to delete messages from? Example: <[email protected]> ")
userToDelete = input("Your input: ")
countOfMessages = len(box.list()[1])
print(f"There are {countOfMessages} messages in the {user}\'s mailbox")
messagesToDelete = []
for i in range(countOfMessages):
print(f"Retrieve msg #{i+1}")
for msg in box.retr(i+1)[1]:
decoding = msg.decode('utf-8')
if decoding == f"Return-Path: {userToDelete}":
print(f"Found message from {userToDelete}. Its message #{i+1}")
messagesToDelete.append(i+1)
break
messagesToDelete.reverse()
for x in range(len(messagesToDelete)):
print(f"Deleting message #{messagesToDelete[x]}...")
box.dele(messagesToDelete[x])
box.quit()
input('Press enter to exit')