【问题标题】:How to avoid launching browser when a link within email message is clicked单击电子邮件中的链接时如何避免启动浏览器
【发布时间】:2016-09-17 00:36:52
【问题描述】:

目前,我的部分应用程序会向用户发送电子邮件,提醒他们注意事件或任务。单击电子邮件客户端中的 MarkComplete 链接时,会向我的 ActionHandler.ashx(一个 HTTPHandler)发出 HTTP Get 请求,其中 QueryString 参数是允许更新事件/任务。然后将新的电子邮件发送回客户端,发出完成信号。这行得通。

此 HTTP GET 对处理程序的不良副作用是浏览器的启动(即此时,不需要打开浏览器并且很麻烦)。

前提:当我研究 ASP.Net Web Api 时,我想我可以将 HTTPHandler 中的少量代码重构为 Web API 控制器中的 PUT 方法.我的理解是,在完成上述所需处理后,此控制器可能会以 void return(HTTP 状态代码 204)进行响应。

问题:上述方法在 Web API 控制器中新编写的 PUT 方法中是否可以返回 204,这会阻止浏览器完全启动吗?我希望最终用户单击他的第一封电子邮件中的链接,并且只获得新构建的电子邮件消息,表明“完成”(这里根本没有浏览器)。

2016 年 5 月 22 日澄清的编辑:

  • 我不需要“用户交互”。理想情况下,用户点击后,用户没有任何反应,只是收到新的“回复电子邮件”,表明任务已成功完成。
  • 下面建议的答案中列出的选项 2 已尝试失败,一些主要的电子邮件程序不允许这样做 - 请参阅:Submit to HttpHandler results in RequestType GET instead of POST
  • 请注意,当前发出的 HTML 电子邮件内容是否包含任何 HTML 表单标签,这些标签包含在邮件中的链接标签中。
  • 我真的还是没有选择吗?我已经读过 HTTP PUT 可以处理查询字符串(我只是还不知道具体该怎么做……)

【问题讨论】:

    标签: vb.net asp.net-mvc-4 http asp.net-web-api email-client


    【解决方案1】:

    首先,无论您使用何种动词(GET、POST、PUT、DELETE、HEAD 等),为了发送任何 HTTP 请求,您都需要一个外部程序(浏览器、shell 等)来执行此操作,因为电子邮件客户端不会这样做。

    如果您想避免使用网络浏览器,您可以考虑其他方法,例如将您发送给用户的第一封电子邮件配置为特定主题,例如:“约会确认”,并告诉用户回复此邮件按原样发送电子邮件,这将向您发送一封电子邮件,其中包含您发送给用户的原始主题,接下来您可以将您的应用程序配置为期待这种传入的电子邮件,并通过发送第二封电子邮件来对此事件做出反应。您将拥有与包含在第一封电子邮件中一样多的用户信息,这可用于配置第二封电子邮件。

    【讨论】:

      【解决方案2】:

      在电子邮件中执行操作需要打开网络浏览器。否则,这将是客户端的一个重大安全问题。如果这是一个选项,这将为垃圾邮件发送者打开大门,并且黑客可以在其中单击任意位置并自动下载应用程序的电子邮件(BIG SECURITY CONCERN)。

      还有其他方法可以处理此类应用程序,我们使用文本消息以及可以回复应用程序请求的 PDF 表单,只要客户端是您的基础架构的一部分,SharePoint 就会执行此操作。谷歌现在正在使用一种 RSVP 和突出电子邮件的标记来做到这一点,但仅适用于将查看标记语言和谷歌及其应用程序的客户。大多数电子邮件客户会忽略电子邮件中的标记和脚本。我真的不知道当今时代没有手机的人,即使我75岁的祖母也有手机。我建议使用twilioSignalR。另一种方法是设置一些您的应用程序将监控的电子邮件帐户,比如说accept@yourdomain.com 和deniy@yourdomain.com。现在,当客户接受时,它将向该电子邮件发送响应,并且您的应用程序可以查看标头中的电子邮件地址以标记该帐户,这也为您提供了记录,以便在客户出现问题时进行回顾。

      至于浏览器打开我不认为这是一件坏事,这会将它们发送回您的应用程序并迫使它们查看您发布的新信息、事件或任务(营销)。

      【讨论】:

      • 感谢您的回复,Rich。如果电子邮件消息中的 href URL 指向 webservice(处理 web 服务器上的数据)并返回 HTTP 状态 204,为什么需要打开浏览器?应用程序的一个组件控制“通知”电子邮件。链接的目标是一个网络服务(可以处理但不需要显示)。最终用户会“感到欣慰”,确认电子邮件很快就会到达电子邮件客户端的收件箱。你的整个第一段听起来很可怕。在某种程度上,你暗示这确实是可能的,但它有一种安全的味道。
      • 另外,我简要了解了 SignalR,但我看不出它如何响应电子邮件消息中的点击链接。也许您建议将其作为电子邮件的替代品?这可能意味着对我的应用程序进行大规模重写。
      • 抱歉回复晚了,至于浏览器打开,浏览器发送数据。如果没有浏览器,什么程序会将您的数据发回给您。现在您可以通过 telnet 执行此操作,但这意味着所有客户端都需要安装 telnet 客户端。
      • 另一种选择是为 Windows 和电话系统创建一个应用程序以提醒客户。有很多方法,但是由于您设置了代码,我只能建议设置电子邮件地址以接受来自客户端的返回,并将逻辑添加到您的应用程序以读取电子邮件标题。如上所述,在不遵守电子邮件法规的情况下,有很多正确的方法可以做到这一点,
      • 话虽如此,我不介意在浏览器上从电子邮件重定向到我的帐户信息以接受或拒绝我帐户上的信息,这会使客户记录保持更新,因为他们可能会更新他们的任何更改如果强制登录,则信息,如果他们永远不必登录,则客户端信息会过时。希望这对您有所帮助。
      【解决方案3】:

      简短回答:

      如果您需要用户交互,那么不打开浏览器就无法从电子邮件客户端执行 HTTP 请求。

      大多数电子邮件客户端(包括网络邮件)do not allows you to execute JavaScript 代码,因此您无法选择在后台执行某些操作。

      这意味着您有两种选择:

      1. 在您的电子邮件中创建一个链接,该链接将导致向您的网络服务器发出GET 请求(这是您已经完成的操作)。当然,这会导致浏览器打开该页面。
      2. Create a HTML form inside your Email,带有一个包含您的数据的隐藏字段,它将针对您的 Web 服务器内启用 POST 的端点。这也将导致 Web 浏览器被打开 (and may also show a warning message in some scenarios),但可以让您更好地处理要发送的数据类型。 但是这种方法似乎与特定的客户端行为密切相关(例如,Thunderbird 将每个表单提交都转换为 GET 请求),所以我不认为它是可行的。

      除了这两个选项,我相信你没有任何可能。这背后的原因纯粹与安全性有关:如果您能够在电子邮件消息中执行 JavaScript 代码,那将是非常不安全的。

      204 响应

      可以做的是将端点的响应转换为204(就像您建议的那样)。请注意,这也会导致您的浏览器打开,但它几乎会立即关闭以 204 响应的选项卡(具体行为取决于电子邮件客户端和 Web 浏览器的组合)。 我认为即使您不更改代码库并继续使用您的ActionHandler.ashx,这也可以轻松完成,但如果您愿意,当然可以通过ActionMethod 中的returning void 在 ASP.NET Web API 中轻松完成.

      关于PUT方法:

      在 HTML 表单中 only GET and POST are allowed methods,而任何类型的 <a href="... ">...</a> 标记将始终生成 GET 请求。这意味着您将无法在电子邮件消息中执行PUT 方法(无论在哪个环境中阅读电子邮件)。

      【讨论】:

      • 感谢您的周到回复。请在原帖底部查看我的编辑。
      • 我看到了您的编辑,即使在那之后我的答案仍然没有改变(除了似乎绑定到电子邮件客户端特定行为的 HTML 表单选项)。当我说用户交互时,我的意思正是您要问的:例如用户点击某物。这一种互动。另外我不知道你在哪里读到PUT 方法的差异,因为查询字符串参数可以从任何请求(GETPOSTPUTDELETEWHATEVER)中读取,因为它们是 URI 的一部分。
      • 关于上面的查询字符串问题,显然我无法访问 Request.Querystring("SomeKeyword") 来解析值,需要使用 FromURI 属性来分解查询字符串。如果我能学会如何做到这一点,我想我可以尝试将我的 HTTPhandler 代码移植到返回 HTTP 状态 204 的 Web 服务。
      • 也许你正在寻找Request.GetQueryNameValuePairs();
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-25
      • 2014-09-13
      • 2012-08-31
      • 2018-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多