如何通过Office.js为Outlook添加符合RFC5322的超长折叠邮件头?
问题:通过Office.js添加超长折叠自定义邮件头失败
我正尝试通过Office.js(搭配ScriptLab)开发Outlook插件,需要添加一个符合RFC5322规范、长度超过998字符的折叠自定义邮件头,但遇到以下问题:
- Office.js会对所有邮件头强制做998字符长度校验,无论是否已按规范折叠
- 手动移除Office.js库中的校验后,Outlook客户端会报错(不同版本返回2006格式错误或无响应)
折叠邮件头示例
my-type="urn:my:test:which:is:longer:than:998:1:0"; my-param*0="PG1iOadpbmRpbmdJbmZvcm1hdGlvbiB4bWxuczp4c2k9Imh0dH"; my-param*1="A6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNl"; my-param*2="IiB4bWxdfgg4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE"; my-param*3="1MU2NoZW1hIiB4bWxuczpkcz0iaHR0cDovL3d3dy53My5vcmcv"; my-param*4="MjAwMC8wOS94bWxkc2lnIyIgeG1sbnM6eG1pbWU9Imh0dHA6Ly"; my-param*5="93d3cudzMub3JnLzIwMDUvMDUveG1sbWltZSIgeG1sbnM6bWI9"; my-param*6="InVybjpuYXR934dfgfdhZzo0Nzc4OmJpbmRpbmdpbmZvcm1hdG"; my-param*7="lvbjoxOjAiPjxtYjpNZXRhZGF0YUJpbmRpbmdDb250YWluZXI+"; my-param*8="PG1iOk1ldGFkYXRhQmluZGluZz48bWI6TWV0YWRhdGE+PHNsYW"; my-param*9="I6b3JpZ2luYXRvckNvbmZpZGVudGlhbGl0eUxhYmVsIHhtbG5z"; my-param*10="OnNsYWI9InVybjpuYXRvOnN0YW5hZzo0Nzc0OmNvbmZpZGVudG"; my-param*11="lhbGl0eW1ldGdfgfdgfdagfdaggTowIj48c2xhYjpDb25maWRl"; my-param*12="lhbGl0eW1ldGdfgfdgfdagfdaggTowIj48c2xhYjpDb25maWRl"; my-param*13="lhbGl0eW1ldGdfgfdgfdagfdaggTowIj48c2xhYjpDb25maWRl"; my-param*14="lhbGl0eW1ldGdfgfdgfdagfdaggTowIj48c2xhYjpDb25maWRl"; my-param*15="lh1sdffW1ldGFkYXRhbGFiZWw6MTowIj48c2xhYjpDb25maWRl";
当前设置邮件头的代码
function setCustomHeaders() { console.log("start"); Office.context.mailbox.item.internetHeaders.setAsync({ "my-header": data }, function(asyncResult) { if (asyncResult.status === Office.AsyncResultStatus.Succeeded) { console.log("Successfully set headers"); } else { console.log("Error setting headers: " + JSON.stringify(asyncResult.error)); } }); }
该问题在Outlook 2016、搭配本地Exchange的MS 365、云版MS 365等环境中均存在,可通过ScriptLab导入测试用例复现。
更新:使用VSTO插件可实现该功能。
解决方案
目前Office.js的internetHeaders.setAsync方法本身存在硬编码的998字符长度限制,且即使绕过该校验,Outlook客户端的邮件头处理逻辑也会报错,因此没有直接通过Office.js添加超长折叠头的合法途径,以下是可行的折中方案:
1. 拆分多个自定义邮件头
将超长的折叠头内容拆分为多个独立的自定义邮件头,接收端再拼接这些头信息。这种方法符合RFC规范(允许存在多个同前缀的自定义头),且避开了单头的长度限制。
示例代码:
function splitAndSetHeaders() { // 拆分原折叠头为多个片段 const headerFragments = [ 'my-type="urn:my:test:which:is:longer:than:998:1:0";', ' my-param*0="PG1iOadpbmRpbmdJbmZvcm1hdGlvbiB4bWxuczp4c2k9Imh0dH";', ' my-param*1="A6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNl";', // 按需要添加剩余片段... ]; // 构造拆分后的头对象 const headers = {}; headerFragments.forEach((fragment, index) => { headers[`my-header-part${index}`] = fragment; }); // 设置邮件头 Office.context.mailbox.item.internetHeaders.setAsync(headers, function(asyncResult) { if (asyncResult.status === Office.AsyncResultStatus.Succeeded) { console.log("拆分后的邮件头设置成功"); } else { console.log("设置失败: " + JSON.stringify(asyncResult.error)); } }); }
2. 直接调用EWS(Exchange Web Services)
如果插件具备足够权限,可以绕过Office.js,直接调用EWS的UpdateItem操作来添加自定义邮件头。这种方法能避开Office.js的校验,但需要处理EWS的认证流程和请求构造,同时要确保符合Exchange服务器的邮件头规则。
3. 使用Microsoft Graph API(仅云版MS 365)
针对云版MS 365环境,可通过Graph API的messages端点更新邮件的互联网头。需要提前配置应用权限(如Mail.ReadWrite),并处理OAuth2认证流程。
内容的提问来源于stack exchange,提问作者Arikael
相关产品推荐
相关产品推荐

