单击电子邮件中的 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 日:
- 我不需要 "user interaction"。理想情况下,用户单击并且用户没有任何反应,只是一个新的 "answering email" 表明任务成功完成。
- 下面建议的答案中列出的选项 2 已经尝试失败,一些主要的电子邮件程序不允许这样做 - 请参阅:
- 请注意,当前发送的 HTML 电子邮件内容 不 包含任何 HTML 表单标签,其中包含 link 标签消息。
- 我真的还是别无选择吗?我读过 HTTP PUT 可以处理查询字符串(我只是还不知道具体怎么做...)
简答:否。
如果您需要用户交互,则无法在不打开浏览器的情况下从电子邮件客户端执行 HTTP 请求。
大多数电子邮件客户端(包括网络邮件)do not allows you to execute JavaScript 代码,因此您无法选择在后台执行某些操作。
这意味着您有两个选择:
- 在您的电子邮件中创建一个 link,这将导致对您的 Web 服务器的
GET
请求(这是您已经完成的)。当然,这会导致浏览器打开该页面。
- 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" 并告诉用户要按原样回复此电子邮件,这将向您发送一封电子邮件,其中包含您发送给用户的原始主题,接下来您可以配置您的应用程序以接收此类传入电子邮件,并通过发送第二封电子邮件对此事件做出反应。您将获得与第一封电子邮件中包含的用户信息一样多的信息,这可用于配置第二封电子邮件。
目前,我的应用程序的一部分会向用户发送电子邮件,提醒他们事件或任务。在电子邮件客户端中单击 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 日:
- 我不需要 "user interaction"。理想情况下,用户单击并且用户没有任何反应,只是一个新的 "answering email" 表明任务成功完成。
- 下面建议的答案中列出的选项 2 已经尝试失败,一些主要的电子邮件程序不允许这样做 - 请参阅:
- 请注意,当前发送的 HTML 电子邮件内容 不 包含任何 HTML 表单标签,其中包含 link 标签消息。
- 我真的还是别无选择吗?我读过 HTTP PUT 可以处理查询字符串(我只是还不知道具体怎么做...)
简答:否。
如果您需要用户交互,则无法在不打开浏览器的情况下从电子邮件客户端执行 HTTP 请求。
大多数电子邮件客户端(包括网络邮件)do not allows you to execute JavaScript 代码,因此您无法选择在后台执行某些操作。
这意味着您有两个选择:
- 在您的电子邮件中创建一个 link,这将导致对您的 Web 服务器的
GET
请求(这是您已经完成的)。当然,这会导致浏览器打开该页面。 - 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" 并告诉用户要按原样回复此电子邮件,这将向您发送一封电子邮件,其中包含您发送给用户的原始主题,接下来您可以配置您的应用程序以接收此类传入电子邮件,并通过发送第二封电子邮件对此事件做出反应。您将获得与第一封电子邮件中包含的用户信息一样多的信息,这可用于配置第二封电子邮件。