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 шт):

Автор решения: y0nkers

Не уверен, в чём именно была ошибка, но вот что я исправил:

  1. Поменял pop3_server с localhost на 127.0.0.1
  2. При подключении к серверу привёл pop3_port к типу int
  3. Получаю каждое письмо построчно, если декодированная строка равна имени заданного адресата, то номер письма помещается в messagesToDelete, сразу перехожу к следующему письму.
  4. Разворачиваю список, чтобы при удалении не возникло ошибок, удаляю письма из ящика.
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')

→ Ссылка