如何使用EWS/Office-JS等微软技术模拟SMTP向邮件头未列收件人发邮件
微软生态下取证隐写邮件的发送实现方案
针对你的核心需求,以下是对应技术栈的可落地方案:
1. 核心需求的通用实现逻辑
你要的「指定To/Cc邮件头、仅向目标Bcc地址投递、留存原件到已发送文件夹」的逻辑,在所有微软邮件技术栈中都可实现,通用逻辑为:
- 生成对应收件人的定制隐写邮件正文
- 手动设置邮件的
To、Cc互联网头为你想要展示的地址(不要将这些地址填入实际发送收件人列表) - 仅将目标投递地址(也就是你要模拟的Bcc收件人)填入实际发送收件人列表
- 如果仅需要留存一份统一原件到已发送文件夹,可单独生成一份标准邮件存入已发送,发送所有定制邮件时关闭「保存到已发送」开关,避免生成多份已发送记录
2. 各技术栈的具体实现
EWS(Exchange Web 服务)
EWS是最贴近你原有SMTP逻辑的方案,完全支持自定义所有邮件头、控制投递行为:
- 构造
EmailMessage对象后,通过InternetMessageHeaders属性手动添加To、Cc头,值为你要显示的地址 - 仅将目标投递地址添加到
ToRecipients属性 - 统一原件可单独构造后调用
Save()方法直接存入已发送文件夹,无需发送 - 定制邮件发送时调用
Send()方法(无需保存到已发送),循环执行逻辑和你原来调用多次RCPT TO的逻辑完全等价
Microsoft Graph API
微软目前更推荐使用Graph API替代EWS,兼容性更强,支持Linux端直接调用:
- 向Graph的发送邮件端点发送POST请求
- 请求体中
message.internetMessageHeaders数组添加To、Cc的自定义头 message.toRecipients仅填入你要实际投递的目标地址- 统一原件可单独调用接口存入已发送文件夹,定制邮件发送时将
saveToSentItems参数设为false即可
Office JS(Outlook 插件)
如果你的需求是在Outlook客户端/网页端插件中实现,可使用Office JS API:
- 通过
item.internetHeaders.setAsync()方法自定义To、Cc头 - 通过
item.to.setAsync()仅设置实际投递地址 - 统一原件可单独保存到已发送文件夹,定制邮件调用
item.sendAsync()发送时关闭保存到已发送的配置即可
3. 现有Linux代码复用方案
不存在「SMTP over EWS」这种标准协议,但是你现有Linux端的核心代码几乎可以全部复用:
- 原有生成隐写正文、构造邮件头的逻辑完全不需要修改
- 仅需要替换投递层代码:把原来的SMTP连接、
RCPT TO调用逻辑,替换为调用EWS SOAP接口或者Graph API HTTP请求即可 - EWS和Graph API都没有平台限制,Linux环境可以直接调用,不需要做额外适配
内容的提问来源于stack exchange,提问作者user16457328
相关产品推荐
相关产品推荐

