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

How to avoid launching browser when a link within email message is clicked

目前,我的应用程序的一部分会向用户发送电子邮件,提醒他们事件或任务。在电子邮件客户端中单击 MarkComplete link 时,会向我的 ActionHandler.ashx (一个 HTTPHandler ) 其中 QueryString 参数是允许更新 event/task 的输入。然后将新电子邮件发送回客户端,表示完成。这行得通。

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

前提:当我在 ASP.Net Web Api 上学习时,我想我也许可以重构少量代码我的 HTTPHandler 到 Web API 控制器中的 PUT 方法。我的理解是这个控制器在完成上述所需的处理后可以用 void return (HTTP 状态代码 204)响应。

问题: 上述方法是否可以在 Web API 控制器中新编写的 PUT 方法中使用 return 204 这会阻止浏览器启动吗完全地?我希望最终用户在他的第一封电子邮件中单击 link,然后只收到新构建的电子邮件消息信号 "completion"(这里根本没有浏览器)。

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

简答:

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

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

这意味着您有两个选择:

  1. 在您的电子邮件中创建一个 link,这将导致对您的 Web 服务器的 GET 请求(这是您已经完成的)。当然,这会导致浏览器打开该页面。
  2. Create a HTML form inside your Email, with an hidden field containing your data, that will target a POST enabled endpoint inside your web server. This will also cause the web browser to be opened (and may also show a warning message in some scenarios),但可以让您更好地处理要发送的数据类型。 BUT 似乎这种方法与特定的客户端行为紧密相关(例如 Thunderbird 将每个表单提交变成一个 GET 请求),所以我认为它不可行。

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

204 响应

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

关于PUT方法:

在 HTML 形式 only GET and POST are allowed methods 中,任何类型的 <a href="... ">...</a> 标签总是会生成一个 GET 请求。这意味着您将无法在电子邮件中执行 PUT 方法(无论在何种环境下阅读电子邮件)。

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

还有其他方法可以处理此类应用程序,我们使用文本消息以及可以回复应用程序请求的 PDF 表单,只要客户端是您的基础结构的一部分,SharePoint 就会执行此操作。 Google 现在正在使用一种 RSVP 标记和突出显示电子邮件来执行此操作,但仅适用于将查看标记语言和 google 及其应用程序的客户。大多数电子邮件客户端将忽略 email.I 中的标记和脚本 真的不知道在今天这个时代没有人 phone,甚至我 75 岁的祖母也有一个单元格 phone.我建议使用 twilio and SignalR。另一种方法是设置一些您的应用程序将监控的电子邮件帐户,比如 accept@yourdomain.com 和 deniy@yourdomain.com。现在,当客户端接受时,它将向该电子邮件发送响应,您的应用程序可以查看 header 中的电子邮件地址以标记该帐户,如果客户端出现问题,这也会为您提供记录以供回顾.

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

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

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