首页 > 编程问答 >如何使用 IMAP 客户端仅从信封中获取发件人电子邮件?

如何使用 IMAP 客户端仅从信封中获取发件人电子邮件?

时间:2024-07-24 05:59:03浏览次数:14  
标签:python imapclient

我想扫描我的电子邮件以便能够找到最常发件人。我有这段技术上可行的代码:

My current code

`from other import username, password
from imapclient import IMAPClient
import pprint


with IMAPClient(host="outlook.office365.com", use_uid=True) as mb:
    mb.login(username, password)
    mb_info = mb.select_folder('INBOX')
    messages = mb.search("ALL")
    some_messages = messages[:10]
    response = mb.fetch(some_messages, 'ENVELOPE')

pprint.pprint(response)`

我在响应中获得了比我需要的更多的信息。我已经强调了我真正想要的唯一数据:

Output of my current code with bit I want underlined

我希望能够执行下面这样的操作,但这不起作用:

`response = mb.fetch(some_messages, 'ENVELOPE.from_')`

有谁知道我可以在 fetch 命令中放入什么来实现此目的?我一直在寻找参数传递到 fetch 方法的语法和规则,但我只看到过三个示例:“ENVELOPE”、“RFC822”和“INTERNALDATE”。

我可以访问我想要的数据稍后在代码中使用它来创建所有发件人的列表:

`from_list = [response[thing][b'ENVELOPE'].from_[0].name for thing in response.keys()]`

它有效,但我希望我的代码更加简洁。因此,如果我可以通过修改传递给 .fetch() 的内容来避免这样做,我肯定会更喜欢这样做。


不能使用 IMAP fetch 命令仅检索信封的 "from" 部分。 ENVELOPE RFC822 INTERNALDATE 等选项是预定义的数据项,不能进一步细化。

的选择是:

  1. 继续使用当前方法: 这可能不是最有效的方法,但它有效,并且代码易于理解。如果处理的邮件数量较少,这可能不是什么大问题。

  2. 使用 BODYSTRUCTURE 命令: BODYSTRUCTURE 命令返回邮件的结构化表示形式,包括信封信息。可以解析此响应以仅提取 "from" 地址。这将需要更复杂的代码,但可以减少传输的数据量,尤其是在处理大型邮件时。

以下是使用 BODYSTRUCTURE 命令的示例:

from imapclient import IMAPClient

with IMAPClient(host="outlook.office365.com", use_uid=True) as mb:
    mb.login(username, password)
    mb.select_folder('INBOX')
    messages = mb.search("ALL")
    some_messages = messages[:10]

    # 获取 BODYSTRUCTURE 信息
    response = mb.fetch(some_messages, 'BODYSTRUCTURE')

    # 提取每个邮件的 "from" 地址
    from_list = []
    for msg_id, data in response.items():
        envelope = data[b'BODYSTRUCTURE'][0]  # 假设是第一部分
        from_addr = envelope.from_[0]
        from_list.append(from_addr)

print(from_list)

这个代码片段首先获取所选邮件的 BODYSTRUCTURE 。然后,它遍历每个邮件的响应,并从 envelope 部分中提取 "from" 地址。

请记住,解析 BODYSTRUCTURE 响应可能很复杂,具体取决于邮件的结构。可能需要参考 RFC 3501 以了解 BODYSTRUCTURE 响应的完整格式。

标签:python,imapclient
From: 78785717

相关文章

  • 使用 Python-PlexAPI 获取 plex 上所有好友的关注列表
    有关如何接收我的plex服务器上所有用户的监视列表的任何提示。我正在根据一些规则创建自动删除,其中一个规则是,如果电影位于用户观看列表中,则不应删除该电影。我遇到了麻烦,因为所有与观看列表相关的内容都在MyPlexAccount上。lexapi.myplex.MyPlexAccount具有我的用......
  • 如何在 Python 中查看与 Azure OpenAI 助手关联的所有上传文件?
    我正在使用Python对文档中的问题进行基准测试,并在jupyter笔记本中实例化了我的助手。我想确认助手是否有我上传的文件,但似乎找不到有关此功能将使用什么功能的文档。使用适用于AzureOpenAI的最新版本的PythonAPI。目前,无法使用AzureOpenAI的PythonAPI直接查看......
  • 如何在Python中计算小数?
    我正在创建一个计算器来用python计算企业的利润,但到目前为止我只能使用整数。这是我的代码示例:Gross=int(input("PleaseentertotalGrossRevenuefortheFiscalYear"))NetTaxes=int(Gross)*0.1所以我将会计年度的总收入乘以按“税率”计算,但我只能使用......
  • 如何使用 Python 打开 Google Firestore 上的特定数据库?
    我正在使用Firebase并使用以下代码从Firestore设置/检索文档:importfirebase_adminfromfirebase_adminimportcredentials,firestorecred=credentials.ApplicationDefault()firebase_admin.initialize_app(cred,options={"projectId":"huq-jimbo"})fires......
  • 如何使用 Python 和 Numpy 重现 Matlab 文件读取以解码 .dat 文件?
    我有一个Matlab脚本,可以读取编码的.dat文件,对其进行解码并保存。我试图使用numpy将其转换为Python。我发现对于同一个文件,我得到不同的输出结果(python数字没有意义)。该代码最初作为从串行端口读取的脚本的一部分运行,因此是数据的结构。我首先认为位移是问题所在,因为......
  • 在Python中调整pdf页面大小
    我正在使用python裁剪pdf页面。一切正常,但如何更改页面大小(宽度)?这是我的裁剪代码:input=PdfFileReader(file('my.pdf','rb'))p=input.getPage(1)(w,h)=p.mediaBox.upperRightp.mediaBox.upperRight=(w/4,h)output.addPage(p)当我裁剪页面时,我也需要......
  • 如何使用 python 更改资源管理器窗口中的路径?
    没有人知道如何在不使用python打开新实例的情况下更改资源管理器窗口中的当前路径吗?例如,如果用户使用C:\Users\User打开资源管理器窗口。然后我必须将该路径更改为C:\Windows\System32例如。提前致谢。很遗憾,无法直接使用Python更改现有文件资源管理器窗口的......
  • python 以及将数组传递给函数的问题
    我需要求解一些常微分方程$\frac{dy}{dx}=f(x)=x^2ln(x)$并继续在限制0之间创建数组xpt。<=xpt<=2因为我必须小心xpt=0,所以我将函数定义如下deff(x):ifx<=1.e-6:return0.else:returnnp.square(x)*np.log(x)我的调用程序读取Np......
  • 如果 Python 脚本正在使用文件夹,如何在文件资源管理器中进行更改时防止 Windows 的“
    我有一个简单的脚本,显示在QTreeView中的QListView中选择的目录的内容,我想添加打开文件资源管理器的功能,以让用户编辑目录内的内容。但是,添加新的文件夹和文件可以,但删除或移动文件夹或文件会提示“文件夹正在使用”错误:此操作无法完成,因为该文件已在另一个程......
  • 如何使用 Python API 获取每个模型的活跃用户列表、最后登录信息
    我想通过PythonAPI获取我的dbt项目的所有模型中的活动或非活动用户列表。这可能吗?我尝试列出模型,但无法获取用户信息,如用户名、项目、以及上次活动或上次登录。不幸的是,dbt本身并不跟踪你所寻找的用户活动数据(最后登录、活跃用户等)。dbt的主要功能是转换数据,而不......