使用双重查询字符串在地址栏中发送邮件

Using Double Query Strings to Send Mail in Address Bar

我有一个非常简单的 Node.js 视频聊天,我用它来给我的朋友打电话。我希望它直接与 Mail 交互(打开 Mail 并加载模板)。到目前为止我有这个:

let obsPass = /* helpers.generateObsPassword() < randomly generated char */ 'zH1mA4pR2hF7wJ5'
var text = location.href + '&obs=' + obsPass;
window.open(`mailto:?subject=Join%20meeting&body=${text}`);

有效!这个邮件的正文应该是https://example.com?room=myroom&obs=zH1mA4pR2hF7wJ5,但是,当我用它打开邮件时,正文不是https://example.com?room=myroom&obs=zH1mA4pR2hF7wJ5,而是https://example.com?room=myroom。我认为这与我拥有的双查询字符串(mailto:? 和 example.com?)有关,这导致浏览器认为 &obs=zH1mA4pR2hF7wJ5 正在应用于更大的“网站”, mailto:.

有解决办法吗?我可以手动发送电子邮件,但我希望将其集成到我的网站中。谢谢!

您需要对邮件正文中的URL进行编码。

而不是写作

window.open(`mailto:?subject=Join%20meeting&body=${text}`);

window.open(`mailto:?subject=Join%20meeting&body=${encodeURIComponent(text)}`);

没有这个,你的 mailto: URL 最终会变成

mailto:?subject=Join%20meeting&body=https://example.com?room=myroom&obs=zH1mA4pR2hF7wJ5

在URL查询字符串中,&表示一个参数值的结尾和下一个参数的开始。因此,这个mailto:URL在查询字符串中有三个参数,subjectbodyobsbody参数的值是 https://example.com?room=myroom.

如果你想让myroom之后的&字符成为body的值的一部分,那么你需要对其进行编码。对其进行编码可防止邮件程序中的 URL 解析器将其解释为 mailto: URL 中参数之一的结尾。然后,您的邮件程序应该解码它从 mailto: URL 中的 body 参数中提取的值,然后再将其放入电子邮件的消息正文中。