私有VLAN内后端服务器使用OAuth对接Office 365发送邮件问题咨询
方案可行性确认
这个方案完全可落地,私有VLAN部署不影响认证流程:OAuth认证只需要你的后端服务器能主动出站访问微软Azure AD的身份接口、Office 365 SMTP服务(smtp.office365.com 587端口)即可,不需要公网能主动访问你的后端服务,只要你的VLAN配置了出站NAT或者代理允许上述访问即可。
第一步:Azure AD 应用配置
你需要先在Azure AD中注册一个供后端服务使用的服务主体:
- 进入Azure Active Directory面板,新建应用注册,应用类型选无用户交互的服务端应用
- 注册完成后保存
客户端ID、租户ID两个参数 - 进入「证书和密码」页面,新建一个客户端密码,保存密码值(仅生成时可见,丢失需要重新生成)
- 进入「API权限」页面,添加Microsoft Graph的应用程序权限,勾选
SMTP.SendAsApp权限,提交后点击「授予管理员同意」完成权限激活 - 运行Exchange Online PowerShell命令,给你的发件邮箱授予应用访问权限:
Add-MailboxPermission -Identity "你的发件邮箱地址" -User "刚才的客户端ID" -AccessRights FullAccess -InheritanceType All
第二步:Node 后端代码实现
推荐使用nodemailer实现SMTP发送,搭配@azure/msal-node实现OAuth令牌获取:
- 安装依赖
npm install nodemailer @azure/msal-node - 核心实现示例
const msal = require('@azure/msal-node'); const nodemailer = require('nodemailer'); // MSAL 配置 const msalConfig = { auth: { clientId: "你之前保存的客户端ID", authority: "https://login.microsoftonline.com/你之前保存的租户ID", clientSecret: "你之前保存的客户端密码" } }; const cca = new msal.ConfidentialClientApplication(msalConfig); const tokenRequest = { scopes: ["https://outlook.office365.com/.default"] }; // 发送邮件函数 async function sendMail(to, subject, content) { // 获取访问令牌 const tokenResponse = await cca.acquireTokenByClientCredential(tokenRequest); const accessToken = tokenResponse.accessToken; // 配置SMTP传输器 const transporter = nodemailer.createTransport({ host: "smtp.office365.com", port: 587, secure: false, auth: { type: "OAuth2", user: "你的发件邮箱地址", accessToken: accessToken } }); // 发送邮件 const info = await transporter.sendMail({ from: "你的发件邮箱地址", to: to, subject: subject, html: content }); return info; }
注意事项
- 访问令牌默认有效期为1小时,建议在本地做令牌缓存,到期前重新获取即可,无需每次发邮件都请求新令牌,降低接口调用频率
- 如果你的私有VLAN需要配置代理才能访问公网,可以分别给msal客户端、nodemailer传输器添加代理配置参数
- 发件人地址必须是你已经授权了应用访问权限的Office 365邮箱,否则会触发权限错误
内容的提问来源于stack exchange,提问作者Americo Perez
相关产品推荐
相关产品推荐

