使用Python3获取IMAP的邮件
使用Python3获取IMAP的邮件
#-*- coding:UTF-8 -*- import imaplib, email def email_header_decode(str): dh = email.header.decode_header(str)[0] if dh[1] == None: return dh[0] return dh[0].decode(dh[1]) def email_get_timestamp_by_rfc2822(date): return email.utils.mktime_tz(email.utils.parsedate_tz(date)) def email_get_timestamp_by_msg(msg): if msg['Date']: return email_get_timestamp_by_rfc2822(msg['Date']) try: aReceived = msg['Received'].split("\r\n") Date = aReceived[len(aReceived) - 1].split('; ')[1] return email_get_timestamp_by_rfc2822(Date) except: print(msg) return None def imap_fetch(srvaddr, srvport, is_ssl, account, password, limit): #1:连接服务器 try: if is_ssl: M = imaplib.IMAP4_SSL(srvaddr, srvport) else: M = imaplib.IMAP4(srvaddr, srvport) except imaplib.IMAP4.error as err: return 500, None, err #2:使用账号密码进行登录 try: M.login(account, password) except imaplib.IMAP4.error as err: return 400, None, err #3:选择收件箱 try: M.select('INBOX', False) except imaplib.IMAP4.error as err: return 410, None, err #4:搜索邮件 try: typ, data = M.search(None, 'ALL') except imaplib.IMAP4.error as err: return 420, None, err #5:对搜到的邮件依次进行HEADER获取 count = 0 rows = [] for msg_num in data[0].split()[::-1]: count = count + 1 try: message_parts = '(UID BODY.PEEK[HEADER])' typ, datas = M.fetch(msg_num, message_parts) text = datas[0][1].decode('utf8') msg = email.message_from_string(text) #print('msg_num:%s\r\nmsg:%s\r\n' % (msg_num, msg)) #print(msg['Return-Path']) #print(msg['Delivered-To']) row = {} row['account'] = account row['msg_num'] = int(msg_num) From = email.utils.parseaddr(msg['From']) row['from_name'] = email_header_decode(From[0]) row['from_addr'] = From[1] row['to_addr'] = msg['To'] row['subject'] = email_header_decode(msg['Subject']) row['timestamp'] = email_get_timestamp_by_msg(msg) rows.append(row) except imaplib.IMAP4.error as err: print("M.fetch error: {0}".format(err)) #except: # print("M.fetch error: Unknown") if count >= limit: break M.close() M.logout() return 200, rows, None status, rows, err = imap_fetch('imap.126.com', 993, True, 'test@126.com', 'test', 1) print(status) print(rows) print("OS error: {0}".format(err))
本文来自博客园,作者:项希盛,转载请注明原文链接:https://www.cnblogs.com/xiangxisheng/p/14300835.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)