Django:SendGrid 点击跟踪服务阻止消息框架工作

Django: SendGrid Click Tracking service prevents messages framework from working

我正在尝试使用 SendGrid 作为电子邮件提供商,使用 Django 通过确认电子邮件实现注册,我的 'SignUpActivationView' 代码验证令牌,然后将用户重定向到主页,其中 success/error使用消息框架显示消息:

class SignUpActivationView(RedirectView):
    redirect_url = reverse_lazy('link_list')

    def dispatch(self, request, *args, **kwargs):
        ...
        # if token is valid:
        messages.error(self.request, 'Your account is now active.')
        return HttpResponseRedirect(self.redirect_url)
        # if token is invalid:
        messages.error(self.request, 'Your account could not be activated.')
        return HttpResponseRedirect(self.redirect_url)

到目前为止,只要我在浏览器中复制粘贴 link,我的方法就有效,如果我点击它,用户会被激活,但 成功消息不会显示 在我的申请中。我相信这是因为 SendGrid 的点击跟踪服务正在包装我的 link:

我找到的解决方法是通过添加 'clicktracking=off' HTML 属性告诉 SendGrid 不要跟踪 link,缺点是我只能告诉 SendGrid 不要跟踪links 在我的电子邮件的 HTML 版本中。如果用户的电子邮件客户端决定打开电子邮件的纯文本版本,则 link 仍将被包装。

 # solution: do not track clicks
 # caveat: only works in HTML, not in plain text emails
 <a clicktracking=off href="http://foo.bar">Confirmation link</a>

因此 Link 跟踪对于纯文本电子邮件来说是非常必要的。

有什么方法可以使消息框架与 Link 跟踪一起工作吗?

当 SendGrid 跟踪您的 link 时,"click" 转到 SendGrid,returns 一个 302 Found 重定向到您在原始文件中提供的 URL电子邮件,在 SendGrid 跟踪它之前。

因此,只要您在那里提供正确的 link,当 "click" 到达您的服务器时,它会返回到那个位置,并带有适当的令牌。
您可以在 Chrome 的开发人员工具中查看此行为,在 网络 选项卡下,这应该可以帮助您解决此处发生的问题。

此外,您可以在 设置:跟踪设置 部分下禁用所有 SendGrid 的点击跟踪,而不仅仅是 link-by-link .
默认情况下,SendGrid 不跟踪纯文本 links,因为它使它们变得更长。如果您希望它这样做,您必须在相同的设置下主动启用它。现在很少有收件人以纯文本形式查看,因此它对您的参与统计数据的贡献不大,因此通常不建议启用该功能。