如何使用Javascript通过Microsoft Graph API从指定非登录账户发送邮件
实现方案
首先明确前提:你需要提前持有目标发信账户的有效授权凭证(SMTP授权码、发信API密钥等),所有身份验证逻辑均基于有效凭证实现,不需要在目标发信账户内预先创建邮件,也和当前系统登录的其他账户无关联。
以下分两种常见JS运行环境给出实现方案:
场景1:Node.js 服务端实现(生产环境唯一推荐方案,无密钥暴露风险)
最常用的实现依赖nodemailer库,身份验证逻辑在创建发信传输器时同步完成,具体步骤:
- 先进入目标发信邮箱的后台设置,开启SMTP服务,获取专属SMTP授权码(注意不是邮箱的登录密码,绝大多数主流邮箱服务商都会单独生成SMTP授权码)
- 安装依赖:
npm install nodemailer - 完整实现代码示例:
const nodemailer = require('nodemailer'); // 创建发信传输器时,直接传入目标账户的验证信息完成身份校验 const mailTransporter = nodemailer.createTransport({ host: 'smtp.xxx.com', // 替换为对应邮箱服务商的SMTP地址,比如QQ邮箱为smtp.qq.com、Gmail为smtp.gmail.com port: 465, // SSL加密端口统一为465,非加密端口为587 secure: true, // 465端口填true,587端口填false auth: { user: '指定的发信邮箱完整地址', // 你要用来发信的目标账户地址 pass: '该邮箱的SMTP专属授权码' // 之前在邮箱后台拿到的授权码,不是登录密码 } }); // 可选校验身份是否有效,建议执行 mailTransporter.verify((error, success) => { if (error) { console.log('目标账户身份验证失败:', error); return; } // 验证通过后直接发信 mailTransporter.sendMail({ from: '指定的发信邮箱完整地址', to: '收信人邮箱地址', subject: '邮件主题', text: '邮件正文内容' }, (sendErr, info) => { if(sendErr) console.log('发信失败:', sendErr); else console.log('发信成功:', info.response); }); });
如果你的目标发信邮箱要求OAuth2验证(比如Gmail当前默认要求),只需要把auth参数替换为对应的OAuth2凭证(access_token、refresh_token、client_id、client_secret)即可,整体逻辑不变。
场景2:浏览器端实现(仅可用于本地测试,禁止生产环境使用,会泄露授权凭证)
浏览器端直接发信一般调用邮箱服务商提供的公开发信API,身份验证逻辑在请求头中传入目标账户的API密钥完成,示例代码:
fetch('替换为对应邮箱服务商的发信API接口地址', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer 目标发信账户的专属API密钥' // 此处完成身份验证 }, body: JSON.stringify({ from: '指定的发信邮箱完整地址', to: '收信人邮箱地址', subject: '邮件主题', content: '邮件正文内容' }) }).then(res => res.json()).then(res => console.log(res))
重要提醒:浏览器端所有请求参数对用户完全可见,直接在前端发信会导致授权凭证泄露,被不法分子盗用发送垃圾邮件,生产环境所有发信逻辑必须放在服务端处理。
注意事项
- 不同邮箱服务商的SMTP配置、验证规则存在差异,需要根据你使用的邮箱服务商的官方开发文档调整对应参数
- 如果没有目标发信账户的有效授权凭证,无法完成身份验证和发信操作
内容的提问来源于stack exchange,提问作者trungpq
相关产品推荐
相关产品推荐

