python获取outlook邮件

2021年10月16日 168点热度 0人点赞 0条评论

问题描述

最近想搞个 python 获取 outlook 邮箱邮件的程序,这里介绍 imap 客户端和使用 Microsoft Graph Api 两种获取outlook邮件的方法。方法2更优雅。注意本文中的操作需要全局管理员。

IMAP客户端

首先开启接收邮件账户的imap功能。

使用全局管理员登录 https://admin.microsoft.com/ ,左侧菜单选择用户、活跃用户,然后点击接收邮件的用户,右侧弹出面板中点击邮件、管理电子邮件应用。选中 IMAP 后保存(其他选中项不用关闭)。

编写 python 代码获取邮件,其中 mail_id 是由服务端提供,可以通过记录 mail_id 来判断是否为新邮件。

import imaplib
import email

imap_server = "outlook.office365.com"
username = ""
password = ""

client = imaplib.IMAP4_SSL(imap_server) #SSL
#conn = imaplib.IMAP4(imap_server)

client.login(user=username, password=password) #登录
client.select('INBOX') #选择目录
_, query = client.search(None, 'ALL') #查询邮件
mail_id_list = [item.decode('utf8') for item in query[0].split()] #获取邮件ID列表
for mail_id in mail_id_list:
    _, data = client.fetch(str(mail_id), '(RFC822)') #根据MailID获取邮件内容
    mail = email.message_from_string(data[0][1].decode()) #解析邮件为email对象
    print(mail) #然后可以从email对象中获取邮件信息,建议搜索文档查看

Microsoft Graph Api获取邮件

2.1 首先使用全局管理员登录 https://portal.azure.com/ ,进入 Azure Active Directory 控制面板,选择左侧菜单应用注册,点击新注册。填写名称并选择账户类型后点击注册。

2.2 回到应用概述可以查看应用程序(客户端) ID(client_id)。

2.3 点击左侧证书和密码、新客户端密码,选择截止期限、添加。

2.4 保存客户端密码的值(client_secret)。

2.5 点击左侧 API 权限,添加权限,Microsoft Graph,应用程序权限,搜索 Mail 后选中读取邮件相关权限。

2.6 然后点击 代表xxx授予管理员同意。

2.7 安装 Office365-REST-Python-Client 库。

pip install Office365-REST-Python-Client
pip install pytz

2.8 编写代码获取邮件。

import msal
from office365.graph_client import GraphClient

tenant_id='xxx.onmicrosoft.com' #工作账户系统分配的域名 xxx.onmicrosoft.com
client_id='' #2.2中获取的client_id
client_secret='' #2.4中保存的client_secret
mail_address='' #接收邮件的邮箱

def acquire_token():
    authority_url = f'https://login.microsoftonline.com/{tenant_id}'
    app = msal.ConfidentialClientApplication(
        authority=authority_url,
        client_id=f'{client_id}',
        client_credential=f'{client_secret}'
    )
    token = app.acquire_token_for_client(scopes=["https://graph.microsoft.com/.default"])
    return token

client = GraphClient(acquire_token)
messages = client.users[mail_address].mail_folders['INBOX'].top(10).messages.get().execute_query()

for mail in messages:
    print(mail.properties) #邮件内容

参考 Use query parameters to customize responses - Microsoft Graph | Microsoft Docs 配置筛选。

参考 Use query parameters to customize responses - Microsoft Graph | Microsoft Docs 配置排序。

修改 top(10) 来获取指定数量的邮件。

AIKAMINO

这个人很懒,什么都没留下