邮件客户端剥离角网址的一部分

时间:2015-10-19 04:38:05

标签: angularjs html-email

我发送了一封注册激活电子邮件,其中包含一个注册确认网址,其中包含指向角度前端应用的确认令牌:

...   <a href="https://domain.com/#/confirm-signup?token=1234...">Activate</a>   ...

请注意,令牌是JWT并且相当长。

这适用于大多数用户,但有些人点击该链接会将其带到https://domain/com,而不会confirm-signup?token=...

似乎邮件客户端可能会在#之后删除所有内容,但我无法找到其他人遇到此问题的任何证据,也无法重现它。

到目前为止,我最好的猜测是,有些邮件客户端正在看#,并以某种方式将尾随部分视为内部锚并剥离它......?

还有其他人遇到过这类问题吗?如果是这样,您是否找到了用其他东西替换整个机制的任何解决方案?

3 个答案:

答案 0 :(得分:1)

有些客户端处理哈希链接就好了。其他人没有。有一个关于Outlook在这里讨论这个问题的讨论:Outlook strips URL hash from email

我们在公司解决这个问题的方法就是在我们的服务器上创建一个重定向的处理程序。您的电子邮件链接将变为http://domain.com/email-link?url=https%3A%2F%2Fdomain.com%2F%23%2Fconfirm-signup%3Ftoken%3D1234,您的服务器端脚本将获取查询参数url并立即触发重定向。

您需要确保找到电子邮件中的所有链接并替换它们。这是一个PHP函数,但您可以使用您正在使用的任何后端语言执行此操作。这里的正则表达式至少可能有所帮助。

function replaceLinks($html,$hash) {
    return preg_replace_callback('/<a [^>]*href=[\"\']{1}(.+?)[\"\\\']{1}/', function($matches) use ($hash) {
        return str_replace($matches[1],"http://domain.com/email-link?url=".rawurlencode($matches[1]),$matches[0]);
  }, $html);
}

答案 1 :(得分:0)

是的我之前因为#而遇到过这个问题,我试图链接到目标网页上的锚点。我的解决方案最终使用了一个short.url服务来隐藏#html中的#,例如https://goo.gl/

答案 2 :(得分:0)

看起来你需要percent encoding

很多时候你的href被解析(在这种情况下是角度),它不会正确处理特殊字符,或剥离它们。找到问题字符并将其替换为%3F表示?,%26表示&amp;和%23表示#。其余的都在链接的图表中。

一旦编码的地址到达浏览器,网址将在您的网址栏中解码。