如何在Python中删除电子邮件?代码实现示例

2021年11月16日19:32:40 发表评论 2,013 次浏览
本文带你了解如何使用 IMAP 协议使用 Python 中的内置 imaplib 模块删除选定邮箱中电子邮件帐户中的特定邮件。 Python如何删除电子邮件?你是否曾经想删除邮箱中的电子邮件,但你知道手动操作会花费你大量的时间和精力吗? 如何在Python中删除电子邮件?在本教程中,你不仅将学习如何使用 Python 自动删除电子邮件,还将学习如何按日期、主题、发件人等过滤电子邮件,以便一次性删除它们。 Python删除电子邮件示例:我们将使用 Python 内置的imaplib模块,但如果你想使用某种 API,我们有一个关于如何使用 Gmail API的教程,其中展示了如何在 Python 中阅读、发送和删除电子邮件。 imaplib在 Python 中实现 IMAP 协议,IMAP是电子邮件客户端用于从邮件服务器检索和删除电子邮件的 Internet 标准协议。 让我们首先导入必要的模块并指定我们的帐户凭据:
import imaplib
import email
from email.header import decode_header

# account credentials
username = "youremailaddress@provider.com"
password = "yourpassword"
你当然应该输入你的帐户凭据。以下代码负责连接邮件提供商的 IMAP 服务器:
# create an IMAP4 class with SSL 
imap = imaplib.IMAP4_SSL("imap.gmail.com")
# authenticate
imap.login(username, password)
Python如何删除电子邮件?对于本教程的演示,我使用了一个演示 Gmail 帐户,这就是我指定imap.gmail.com服务器的原因。对于其他提供商,请查看此链接,其中包含最常用电子邮件提供商的 IMAP 服务器列表。 此外,如果你使用的是 Gmail 帐户并且上述代码引发错误,表明凭据不正确,请确保你的帐户设置中允许使用安全性较低的应用程序Python删除电子邮件示例:现在我们已经登录到我们的邮件帐户,让我们选择我们的目标邮箱:
# select the mailbox I want to delete in
# if you want SPAM, use imap.select("SPAM") instead
imap.select("INBOX")
所以我们使用的是选择邮箱使用imap.select()方法,我在本教程中选择了INBOX文件夹,你可以打印imap.list()帐户中可用的邮箱。 如何在Python中删除电子邮件?现在让我们进行 IMAP 搜索以搜索我们要删除的邮件:
# search for specific mails by sender
status, messages = imap.search(None, 'FROM "googlealerts-noreply@google.com"')
上面的行搜索从 Google Alerts 电子邮件发送的电子邮件,另一个示例可能是按SUBJECT搜索:
# to get mails by subject
status, messages = imap.search(None, 'SUBJECT "Thanks for Subscribing to our Newsletter !"')
或按日期搜索:
# to get mails after a specific date
status, messages = imap.search(None, 'SINCE "01-JAN-2020"')
# to get mails before a specific date
status, messages = imap.search(None, 'BEFORE "01-JAN-2020"')
或者,如果你想删除所有电子邮件:
# to get all mails
status, messages = imap.search(None, "ALL")
我给了你很多选择,你应该根据你的用例只选择一个搜索行。有关 IMAP 搜索条件的列表,请查看此链接。 Python如何删除电子邮件?该status包含字符串是否已成功执行搜索,messages返回为用空格分隔的邮件ID的单字节字符串列表,让我们把它转换成整数的列表:
# convert messages to a list of email IDs
messages = messages[0].split(b' ')
Python删除电子邮件示例 - 现在让我们遍历目标邮件并将它们标记为已删除:
for mail in messages:
    _, msg = imap.fetch(mail, "(RFC822)")
    # you can delete the for loop for performance if you have a long list of emails
    # because it is only for printing the SUBJECT of target email to delete
    for response in msg:
        if isinstance(response, tuple):
            msg = email.message_from_bytes(response[1])
            # decode the email subject
            subject = decode_header(msg["Subject"])[0][0]
            if isinstance(subject, bytes):
                # if it's a bytes type, decode to str
                subject = subject.decode()
            print("Deleting", subject)
    # mark the mail as deleted
    imap.store(mail, "+FLAGS", "\\Deleted")
如何在Python中删除电子邮件?正如上面的评论中所说,如果你想要性能,你可以删除内部的 for 循环,我从阅读电子邮件教程中获取它,它仅用于打印电子邮件的主题,所以我们知道我们要删除什么。 最后,我们执行imap.expunge()永久删除标记为已删除邮件的方法,我们也关闭邮箱并从帐户注销:
# permanently remove mails that are marked as deleted
# from the selected mailbox (in this case, INBOX)
imap.expunge()
# close the mailbox
imap.close()
# logout from the account
imap.logout()
太棒了,代码已经完成,为了测试这段代码,我将删除来自 Google Alerts 电子邮件的所有电子邮件: 如何在Python中删除电子邮件?代码实现示例
事实上,在我运行脚本之后,我得到了这个输出:
Deleting Alerte Google – Bitcoin
Deleting Alerte Google – Bitcoin
Deleting Alerte Google – Bitcoin
...<SNIPPED>...
Deleting Alerte Google – Bitcoin
对于此Python删除电子邮件示例演示中,所有电子邮件都具有相同的标题,因为我已按发件人电子邮件对其进行过滤,但是如果你运行不同的搜索条件,你当然会看到不同的输出。

结论

Python如何删除电子邮件?现在你已经掌握了使用Python 中的imaplib模块自动删除电子邮件的技能。 我建议你创建一个新的电子邮件帐户并在其上测试此代码,因为你可能会在主要电子邮件帐户上犯不可逆转的错误。
木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: