|
|
@@ -0,0 +1,68 @@ |
|
|
|
# 删除lolipop邮箱中早于指定日期的邮件 |
|
|
|
# 使用imaplib库连接到lolipop邮箱,并删除早于指定日期的邮件 |
|
|
|
# python 3.10+ |
|
|
|
# 运行 python app.py |
|
|
|
|
|
|
|
import imaplib |
|
|
|
import time |
|
|
|
from datetime import datetime |
|
|
|
|
|
|
|
IMAP_HOST = "imap.lolipop.jp" # 邮箱服务器地址 |
|
|
|
EMAIL = "" # 邮箱地址 |
|
|
|
PASSWORD = "" # 邮箱密码 |
|
|
|
MAX_RETRIES = 5 # 最多重试 5 次 |
|
|
|
|
|
|
|
# 设置截止日期 |
|
|
|
# 格式:2025,04,20 前的邮件进行删除不包含2025,04,20 |
|
|
|
date_cutoff = datetime(2025, 4, 20).strftime("%d-%b-%Y") |
|
|
|
|
|
|
|
def connect_with_retry(): |
|
|
|
for attempt in range(1, MAX_RETRIES + 1): |
|
|
|
try: |
|
|
|
imap = imaplib.IMAP4_SSL(IMAP_HOST) |
|
|
|
imap.login(EMAIL, PASSWORD) |
|
|
|
print(f"✅ 第 {attempt} 次尝试连接成功") |
|
|
|
return imap |
|
|
|
except imaplib.IMAP4.error as e: |
|
|
|
if b"Maximum number of connections" in str(e).encode(): |
|
|
|
print(f"⚠️ 第 {attempt} 次连接失败(连接数超限),等待 30 秒后重试...") |
|
|
|
time.sleep(30) |
|
|
|
else: |
|
|
|
raise # 其他错误直接抛出 |
|
|
|
raise Exception("❌ 多次连接失败,请稍后重试。") |
|
|
|
|
|
|
|
imap = None |
|
|
|
try: |
|
|
|
imap = connect_with_retry() |
|
|
|
|
|
|
|
status, count_bytes = imap.select("INBOX") |
|
|
|
if status != "OK": |
|
|
|
print("❌ 无法选择邮箱文件夹") |
|
|
|
exit() |
|
|
|
|
|
|
|
total_mail_count = int(count_bytes[0]) |
|
|
|
print(f"📬 当前邮箱邮件总数:{total_mail_count}") |
|
|
|
|
|
|
|
status, data = imap.search(None, f'(BEFORE {date_cutoff})') |
|
|
|
if status == "OK": |
|
|
|
mail_ids = data[0].split() |
|
|
|
print(f"🗑️ 找到 {len(mail_ids)} 封待删除邮件(早于 {date_cutoff})") |
|
|
|
|
|
|
|
for i, num in enumerate(mail_ids, start=1): |
|
|
|
print(f" ➤ 正在删除第 {i} 封邮件(ID: {num.decode()})") |
|
|
|
imap.store(num, '+FLAGS', '\\Deleted') |
|
|
|
|
|
|
|
imap.expunge() |
|
|
|
print("✅ 删除完成") |
|
|
|
else: |
|
|
|
print("❌ 搜索失败") |
|
|
|
|
|
|
|
except Exception as e: |
|
|
|
print(f"发生异常:{e}") |
|
|
|
|
|
|
|
finally: |
|
|
|
try: |
|
|
|
if imap is not None: |
|
|
|
imap.logout() |
|
|
|
except: |
|
|
|
pass |