【问题标题】:Encoding of URL query params in HTML mailHTML 邮件中 URL 查询参数的编码
【发布时间】:2026-01-21 05:20:15
【问题描述】:

我的应用程序发送一封带有超链接的 HTML 电子邮件。用户应该能够单击邮件客户端中的链接,并且浏览器会打开该页面。容易……我想。

但现在链接在查询参数中包含特殊字符。例如。第二个查询参数的值是id=1234/pid=1000,生成的java.net.URLEncoder.encode()d URL 变为

http://example.com/path/?key1=value1&key2=id%3D1234%2Fpid%3D1000

这就是嵌入到 HTML 邮件中的内容:

<html ...
<head>
<meta http-equiv=Content-Type content="text/html; charset=unicode">
...
<body lang=EN-US ...
<a href="http://example.com/path/?key1=value1&ampkey2=id%3D1234%2Fpid%3D1000">link text</a>
...

(至少这可以在接收客户端的原始邮件内容中看到)。

问题是当点击链接时,浏览器会打开,但查询参数是双重编码的: http://example.com/path/?key1=value1&amp;key2=id%253D1234%252Fpid%253D1000

并且该链接不再起作用。有趣的是,如果将链接复制/粘贴到浏览器中,则会省略额外的编码(如预期的那样)。 将鼠标悬停在链接上时,URL 显示为已解码: http://example.com/path/?key1=value1&amp;key2=id=1234/pid=1000(用 Outlook 和 Thunderbird 测试,两者的行为相同)。

所以我的问题是,这里有什么问题?

  • 这是我的第一次编码,我应该跳过它吗?
  • 这是我的第一次编码,我做错了吗?
  • 是邮件客户端的错吗?

我可以找到大量关于 URL 编码如何工作以及应该完成的信息,但不知道在哪些用例中使用哪种编码。 谢谢。

【问题讨论】:

    标签: java html email url encoding


    【解决方案1】:

    终于解决了。它与邮件或邮件客户端中的编码无关,但服务器会进行即时重定向并更改查询参数 -> mod_rewrite urlencoding an already urlencoded query string parameter - any way to disable this? 的副本。

    应该真的尝试 example.com 来解决这个问题,但我什至无法想象这是网络服务器的问题。

    【讨论】: