如何通过imaplib4访问无密码共享邮箱并下载未读邮件附件
无密码共享Outlook邮箱附件下载解决方案
首先明确:所谓的“无密码共享邮箱”并非真的不需要认证,而是本身没有独立的账号密码体系,依赖已经获得访问授权的个人账号完成身份校验。你可以选择以下两种Python实现方案:
方案1:沿用现有IMAP逻辑(修改登录参数即可)
Outlook的IMAP服务支持通过授权个人账号登录共享邮箱,仅需要调整登录时的用户名格式即可:
- 用户名填写格式:
{已授权的个人邮箱地址}\{共享邮箱地址},比如你个人账号是xxx@domain.com,共享邮箱是abc@domain.com,那用户名字段填xxx@domain.com\abc@domain.com - 密码字段填写你个人邮箱的登录密码,若个人账号开启了二次验证,需要到微软账号后台生成应用专用密码填入
修改后的可用代码如下:
from imap_tools import MailBox, AND files = [] # 注意修改以下占位参数为你的实际信息 PERSONAL_EMAIL = "你的个人邮箱地址" SHARED_EMAIL = "共享邮箱地址" PERSONAL_PWD = "你的个人邮箱密码/应用专用密码" SAVE_DIR = "./附件保存目录" # 需提前创建好该目录 with MailBox('imap.outlook.com').login(f"{PERSONAL_EMAIL}\{SHARED_EMAIL}", PERSONAL_PWD) as mailbox: for msg in mailbox.fetch(AND(seen=False)): for att in msg.attachments: print(att.filename, att.content_type) files.append(att.filename) # 注意要以二进制写模式打开文件,否则附件会损坏 save_path = f"{SAVE_DIR}/{att.filename}" with open(save_path, 'wb') as f: f.write(att.payload)
方案2:使用Microsoft Graph API(更适合企业合规场景)
如果企业禁用了IMAP协议,可以选择微软官方的Graph API实现,采用OAuth2身份认证,不需要明文传递密码:
- 先在Azure后台注册应用,开通
Mail.Read等对应权限,由管理员同意授权 - 使用
msgraph-core等SDK完成认证后,调用共享邮箱的邮件查询接口直接拉取未读邮件和附件,示例逻辑如下:
import base64 from msgraph.core import GraphClient # 用应用客户端ID、租户ID、客户端密钥完成认证 client = GraphClient(credential=(tenant_id, client_id, client_secret)) # 查询共享邮箱的未读邮件,附带附件信息 response = client.get(f"/users/{SHARED_EMAIL}/messages", params={"$filter": "isRead eq false", "$expand": "attachments"}) for msg in response.json()["value"]: for att in msg["attachments"]: if att["@odata.type"] == "#microsoft.graph.fileAttachment": save_path = f"{SAVE_DIR}/{att['name']}" with open(save_path, "wb") as f: f.write(base64.b64decode(att["contentBytes"]))
内容的提问来源于stack exchange,提问作者Annabelle79
相关产品推荐
相关产品推荐

