MS Teams自适应卡片Action中Mailto链接重复打开邮件窗口问题
问题背景
在MS Teams中配置入站Webhook,通过自适应卡片的Action.OpenUrl动作调用mailto链接实现邮件回复功能,点击卡片按钮时,Outlook 365会打开两个邮件撰写窗口;但将相同的mailto链接复制到MS Word中作为超链接点击,仅打开一次窗口。
可能的根源分析
Teams对mailto协议的双重处理逻辑
Teams客户端处理自适应卡片的Action.OpenUrl动作时,可能同时触发了两种行为:一是调用系统默认的mailto协议处理(打开Outlook),二是Teams自身的外部链接跳转机制再次触发mailto协议,导致重复打开窗口。而Word仅触发系统层面的协议处理,不会出现重复。超长mailto链接的解析异常
你的mailto链接包含大量转义后的换行、引用内容和特殊字符(如%C3%96%C3%B5),整体长度较长。Teams的链接解析模块可能对超长链接的处理存在bug,解析过程中重复执行了打开操作;而Word的超链接解析对长链接兼容性更好,不会触发重复。按钮事件的重复绑定
Teams的UI渲染层可能对自适应卡片的按钮点击事件做了重复绑定,比如卡片核心逻辑和Teams外层UI各监听一次点击事件,导致两次执行OpenUrl动作。链接编码错误
原链接中存在编码错误(如Sender%A4%3A里的%A4是错误编码,正确的冒号编码应为%3A),这种错误可能导致Teams解析链接时出现异常,进而触发重复打开。
验证与修复建议
简化链接测试
先替换为极简的mailto链接测试,比如:"url": "mailto:name-email@test.com?subject=Test"如果点击后仅打开一次窗口,说明原长链接的内容/长度是问题根源;若仍打开两次,排除长度因素,转向其他排查方向。
改用后端中转触发邮件
放弃直接用Action.OpenUrl调用mailto,改用Action.Submit将邮件内容提交到你的后端服务,由后端通过SMTP发送邮件,或者后端返回一个仅触发一次的跳转指令。这种方式绕过Teams对mailto的直接处理,避免重复触发。修正链接编码
核对并修正mailto链接中的编码错误:- 冒号统一编码为
%3A,替换原链接中的%A4 - 换行符统一使用
%0D%0A,避免混合其他换行格式 - 确保特殊字符的UTF-8编码准确,避免解析异常
- 冒号统一编码为
更新Teams客户端
确保使用最新版的Teams桌面/网页客户端,旧版本可能存在自适应卡片Action的已知bug,更新后大概率修复重复触发问题。
修正编码后的示例代码
{ "type": "message", "attachments": [ { "contentType": "application/vnd.microsoft.card.adaptive", "contentUrl": null, "content": { "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", "type": "AdaptiveCard", "version": "1.2", "msteams": { "width": "Full" }, "body": [ { "type": "TextBlock", "wrap": "true", "text": "This is a bit longer message. This is a bit longer message. This is a bit longer message. This is a bit longer message. This is a bit longer message. This is a bit longer message. \nIt contains a line break.\n\nThere are also empty lines.\n\nSee you. test@test.com. Testing some glyphs: - Öõ." }], "actions": [ { "type": "Action.OpenUrl", "url": "mailto:name-email@test.com?subject=VS%3A%20Message&body=Hi%21%0d%0aThank%20you%21%0d%0a%0a%0aSender%3A%20name-email%40test.com%0D%0AAbout%3A%20Test%0D%0AWe%3A%20testing%20%28this%40test.com%29%0D%0A%0D%0A%3E%20This%20is%20a%20bit%20longer%20message.%20This%20is%20a%20bit%20longer%20message.%0D%0A%3E%20This%20is%20a%20bit%20longer%20message.%20This%20is%20a%20bit%20longer%20message.%0D%0A%3E%20This%20is%20a%20bit%20longer%20message.%20This%20is%20a%20bit%20longer%20message.%0D%0A%3E%20%0D%0A%3E%20It%20contains%20a%20line%20break.%0D%0A%3E%20%0D%0A%3E%20There%20are%20also%20empty%0D%0A%3E%20lines.%0D%0A%3E%20%0D%0A%3E%20See%20you.%20test%40test.com.%20Testing%20some%20glyphs%3A%20%2D%0D%0A%3E%20%C3%96%C3%B5.", "title": "Send" } ] } } ] }
内容的提问来源于stack exchange,提问作者Patill

