如何用Ruby结合OAuth 2.0通过IMAP访问Office 365邮箱
纯Ruby实现微软IMAP OAuth2认证(多邮箱读取)
前提确认
确保你的Azure应用已配置以下关键项:
- 添加应用权限:
IMAP.AccessAsUser.All(需全局管理员同意) - 生成客户端密钥(客户端密码)
- 记录租户ID、客户端ID、客户端密钥
步骤1:获取访问令牌
使用oauth2 gem实现客户端凭证流(适合后台无交互访问多邮箱),先安装依赖:
gem install oauth2
获取令牌的代码示例:
require 'oauth2' tenant_id = '你的租户ID' client_id = '你的客户端ID' client_secret = '你的客户端密钥' # 初始化OAuth2客户端 client = OAuth2::Client.new( client_id, client_secret, site: "https://login.microsoftonline.com/#{tenant_id}", token_url: '/oauth2/v2.0/token' ) # 获取客户端凭证类型的访问令牌 token = client.client_credentials.get_token(scope: 'https://outlook.office365.com/.default') # 实际使用时直接调用token.token即可获取令牌字符串
步骤2:使用令牌连接IMAP服务器
Ruby自带net/imap库,结合OAuth2令牌实现认证:
require 'net/imap' # 目标邮箱地址,循环替换即可访问多个邮箱 email = 'target_user@yourdomain.com' access_token = token.token # 用上一步获取的令牌 # 连接Outlook IMAP服务器 imap = Net::IMAP.new('outlook.office365.com', 993, true) # 执行XOAUTH2认证 imap.authenticate('XOAUTH2', email, access_token) # 示例:读取收件箱邮件 imap.examine('INBOX') imap.search(['ALL']).each do |message_id| msg = imap.fetch(message_id, ['ENVELOPE'])[0].attr['ENVELOPE'] puts "主题: #{msg.subject} | 发件人: #{msg.from[0].name}" end # 关闭连接 imap.logout imap.disconnect
关键注意事项
- 访问多邮箱时,只需循环替换
email变量,令牌有效期约1小时,过期后重新调用获取令牌的方法即可 - 必须确保Azure应用的权限已被全局管理员同意,否则会触发权限不足错误
- 客户端凭证流仅适用于Azure AD租户内的组织邮箱,若需访问外部邮箱,需改用授权码流(需用户手动登录授权)
内容的提问来源于stack exchange,提问作者BrandoN
相关产品推荐
相关产品推荐

