MjpDm 2023-10-13 16:38 采纳率: 66.7%
浏览 12
已结题

Python使用imaplib模块search条件传入时间和结果时间不匹配

Python使用imaplib模块search条件传入时间和结果时间不匹配

问题描述

在python中用impalib的search查询某些邮件如: ON 09-Oct-2023 结果返回的邮件msg.get('date') = 'Tue, 10 Oct 2023 00:25:08 +0800 (CST)'
我看RFC 3501 6.4.4上说这个search是忽略时区的,那我该如何获取msg.date = '09-Oct-2023'的数据呢

具体代码

def f_getmsg(search_dt :str):
    imap_address = "outlook.office365.com"
    imap_host = 993
    email_name = "1234567879@Outlook.com"
    email_pass = 12345678'
    V_DIR = 'Bill'
    msg_list = []
    conn = imaplib.IMAP4_SSL(imap_address, imap_host)
    conn.login(email_name, email_pass)
    conn.select(V_DIR, readonly=True)
    typ, data = conn.search(None, search_dt)
    messages = data[0].split()
    for msg_id in messages:
        typ, data = conn.fetch(msg_id, '(RFC822)')
        msg = email.message_from_string(data[0][1].decode('utf-8'))
        print ('search_dt:',search_dt,'||msg.get:',msg.get('date'))
        for part in msg.walk():
            if not part.is_multipart():
                msg_list.append(part.get_payload(decode=True).decode('utf8'))

    conn.logout()
    v_ldir = os.path.dirname(os.path.abspath(__file__))
    v_pathtmp = v_ldir + '\\tmp_bill_info.csv'

    with open(v_pathtmp,encoding='utf-8',mode='a+') as f:
        f.truncate(0)
    for i in msg_list:
        with open(v_pathtmp, encoding='utf-8', mode='a') as f:
            f.writelines(i + chr(10))

if __name__ == "__main__":
    f = f_getmsg('SENTON 09-Oct-2023')

#-----------------------------------------------------------
search_dt: SENTON 09-Oct-2023 ||msg.get: Mon, 9 Oct 2023 08:42:01 +0800 (CST)
search_dt: SENTON 09-Oct-2023 ||msg.get: Mon, 9 Oct 2023 12:22:09 +0800 (CST)
search_dt: SENTON 09-Oct-2023 ||msg.get: Mon, 9 Oct 2023 18:19:42 +0800 (CST)
search_dt: SENTON 09-Oct-2023 ||msg.get: Mon, 9 Oct 2023 20:30:23 +0800 (CST)
search_dt: SENTON 09-Oct-2023 ||msg.get: Mon, 9 Oct 2023 20:56:14 +0800 (CST)
search_dt: SENTON 09-Oct-2023 ||msg.get: Mon, 9 Oct 2023 22:12:34 +0800 (CST)
search_dt: SENTON 09-Oct-2023 ||msg.get: Tue, 10 Oct 2023 00:25:08 +0800 (CST)
search_dt: SENTON 09-Oct-2023 ||msg.get: Tue, 10 Oct 2023 00:40:17 +0800 (CST)
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-14 04:26
    关注

    【以下回答由 GPT 生成】

    首先,根据你提供的代码和描述,我注意到你在传递给search函数的字符串中使用了SENTON。这可能导致search函数返回不符合预期的结果。RFC 3501中并没有SENTON这个邮件搜索条件,你可能想使用ON来指定日期。

    另外,邮件的日期信息是以字符串形式返回的,因此你需要将查询条件的时间转换为字符串。在你的代码中,search_dt是一个字符串参数,但你直接将其传递给search函数。为了确保查询的准确性,你应该将search_dt转换为日期字符串。

    下面是更新后的代码示例:

    import datetime
    import imaplib
    import email
    
    def f_getmsg(search_dt: str):
        imap_address = "outlook.office365.com"
        imap_host = 993
        email_name = "1234567879@Outlook.com"
        email_pass = 12345678
        V_DIR = 'Bill'
        msg_list = []
        conn = imaplib.IMAP4_SSL(imap_address, imap_host)
        conn.login(email_name, email_pass)
        conn.select(V_DIR, readonly=True)
    
        # 将日期转换为日期字符串
        search_date = datetime.datetime.strptime(search_dt, "%d-%b-%Y").strftime("%d-%b-%Y")
    
        typ, data = conn.search(None, 'ON ' + search_date)
        messages = data[0].split()
        for msg_id in messages:
            typ, data = conn.fetch(msg_id, '(RFC822)')
            msg = email.message_from_string(data[0][1].decode('utf-8'))
            print('search_dt:', search_dt, '||msg.get:', msg.get('date'))
            for part in msg.walk():
                if not part.is_multipart():
                    msg_list.append(part.get_payload(decode=True).decode('utf8'))
    
        conn.logout()
        v_ldir = os.path.dirname(os.path.abspath(__file__))
        v_pathtmp = v_ldir + '\\tmp_bill_info.csv'
    
        with open(v_pathtmp, encoding='utf-8', mode='a+') as f:
            f.truncate(0)
        for i in msg_list:
            with open(v_pathtmp, encoding='utf-8', mode='a') as f:
                f.writelines(i + chr(10))
    
    if __name__ == "__main__":
        f_getmsg('09-Oct-2023')
    

    这样,将查询条件转换为日期字符串后,应该能够正确返回符合条件的邮件日期。请尝试运行更新后的代码,如果还有问题,请提供更多详细的信息。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月3日
  • 创建了问题 10月13日

悬赏问题

  • ¥15 angular开发过程中,想要读取模型文件,即图1的335行,会报404错误(如图2)。但我的springboot里配置了静态资源文件,如图3。且在该地址下我有模型文件如图4,请问该问题该如何解决呢?
  • ¥15 itunes恢复数据最后一步发生错误
  • ¥15 关于#windows#的问题:2024年5月15日的win11更新后资源管理器没有地址栏了顶部的地址栏和文件搜索都消失了
  • ¥100 H5网页如何调用微信扫一扫功能?
  • ¥15 讲解电路图,付费求解
  • ¥15 有偿请教计算电磁学的问题涉及到空间中时域UTD和FDTD算法结合的
  • ¥15 vite打包后,页面出现h.createElement is not a function,但本地运行正常
  • ¥15 Java,消息推送配置
  • ¥15 Java计划序号重编制功能,此功能会对所有序号重新排序,排序后不改变前后置关系。
  • ¥15 关于哈夫曼树应用得到一些问题