单击电子邮件中的链接时如何避免启动浏览器

时间:2016-05-19 22:16:41

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

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

此HTTP GET对处理程序的不必要的副作用是启动浏览器(即此时,浏览器的打开是不必要的并且令人讨厌)。

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

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

EDIT澄清2016年5月22日:

  • 我不需要“用户互动”。理想情况下,用户点击并没有发生任何事情,而不是新的“回复电子邮件”表示成功完成任务。
  • 以下建议答案中列出的选项2已经尝试失败,一些主要的电子邮件程序不允许这样做 - 请参阅:Submit to HttpHandler results in RequestType GET instead of POST
  • 请注意,当前发出的HTML电子邮件内容 NOT 包含将消息中的链接标记括起来的任何HTML表单标记。
  • 我还有没有选择吗?我已经读过HTTP PUT可以处理一个查询字符串(我只是不知道该怎么做...)

3 个答案:

答案 0 :(得分:4)

简短回答:

如果您需要用户交互,则无法在不打开浏览器的情况下从电子邮件客户端执行HTTP请求。

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

这意味着您有两个选择:

  1. 在您的电子邮件中创建一个链接,该链接将导致向您的网络服务器发出GET请求(这是您已经完成的操作)。当然,这会导致浏览器打开该页面。
  2. Create a HTML form inside your Email,包含您的数据的隐藏字段,将定位您的网络服务器中启用POST的端点。这也将导致Web浏览器打开(and may also show a warning message in some scenarios),但可以让您更好地处理要发送的数据类型。 但是似乎这种方法与特定的客户端行为紧密相关(例如Thunderbird将每个表单提交为GET请求),所以我不相信它是可行的。
  3. 除了这两个选项,我相信你没有可能。这背后的原因纯粹与安全性有关:如果您能够在电子邮件消息中执行JavaScript代码,那将是非常不安全的。

    204响应

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

    关于ActionMethod方法:

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

首先,为了发送任何HTTP请求而不管你使用的动词(GET,POST,PUT,DELETE,HEAD等),你需要一个外部程序(浏览器,shell等)来做到这一点,因为电子邮件客户端不会这样做。

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