You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 04:40:25