如何保存由JavaScript代码生成的HTML以便通过电子邮件发送?

3
我想将我写的C# API转换成使用AngularJS,它生成(静态)HTML页面(主要用于呈现数据表),目的是更好地分离数据和HTML,允许互动性(例如按列排序)/重复使用数据,这超出了静态HTML页面所能提供的范围。
问题在于,一旦我使用JS生成页面的一部分,我就不能直接通过电子邮件发送HTML文档,因为JS在电子邮件客户端中无法执行。然而,这是我的API的一个有用功能。
有没有什么解决办法?
我记得曾经听说过一个虚拟浏览器(在node.js中?),可以执行所有的JavaScript(没有GUI),然后将HTML转储到文件中。
否则,我唯一能想到的解决办法是让C#生成表格,在HTML中硬编码值(与当前情况相同),并使AngularJS仍然进行所有的JSON后处理,以允许用户与数据交互。麻烦的是,这将需要在C#和JS中重复一些表格构造逻辑,这不是很好。

你可以使用点语法或Razor直接完成这个任务。看一下这个链接,可能会有所帮助:http://dotliquidmarkup.org/try-online - brduca
我认为dotliquid不如angular强大。 我需要的不仅仅是模板,例如JSON查询。 - joelhoro
Dot Liquid 是一个模板渲染引擎,而 Angular 是一个 MVVC 框架 :-) - brduca
2个回答

1
如果您想发送电子邮件,则在Angular中实现一个服务,调用一些服务器端函数来发送电子邮件。数据应作为某种视图模型传递。在ASP.NET中,此服务器端函数通常通过Web API或通用处理程序(.ashx)公开。
如果您希望用户能够直接从页面上下载文件,请查看单击HTML按钮或JavaScript时如何触发文件下载
应该注意的是,直接使用面向网页的HTML通常不是将其包含在电子邮件中的好主意。电子邮件客户端中的HTML解析器差异很大,您可能只需使用HTML功能的一小部分以确保兼容性。面向浏览器的HTML还经常包含一些不适合电子邮件的额外内容(例如导航菜单)。

@joelhoro 好的,没问题。但是你仍然需要一个服务器来处理邮件。它可以托管在ASP.NET或WCF甚至只是一个自定义控制台应用程序中。或者你可以使用一些商业可用的东西,比如SendGrid。关键是,如果你想发送电子邮件,你需要一个服务器端组件。 - mason
关于下载文件的能力,这正是我想转向Angular的原因。但这并不能解决我的问题,即如果用户已经可以看到HTML,他们也可以使用浏览器中的“保存”按钮来保存文档。如果我通过电子邮件发送给他们此页面,则链接将无法工作。当然,我可以发送到Web服务器的链接,但目前该服务器无法从Intranet外部访问,这意味着人们将无法从其邮件客户端或智能手机读取HTML页面的内容,他们需要远程连接到我们的系统。 - joelhoro
感谢澄清,但目前我们确实拥有一个邮件服务器,我的 API 依赖它。关键问题是生成将放入电子邮件中的静态 HTML。 - joelhoro
@joelhoro 我已经解释过了。你将一个视图模型传递给服务器,然后服务器负责生成电子邮件并将其发送到邮件服务器。 - mason
@joelhoro 如此处所述,您无法在电子邮件客户端中运行JavaScript。使用flotjs根本行不通。您可以在客户端生成HTML并将其发送到服务器而不是视图模型。但是,您的HTML仍然可能需要不同,这意味着您需要不同的代码来生成它。 - mason
显示剩余4条评论

1
使用邮件API是值得考虑的吗?在这种情况下,您可以获取内容并使用Angular将其发送到例如Sendgrid。

谢谢,但问题不在邮件API上,我已经有了。问题是如何获取由JavaScript生成的HTML。 - joelhoro
你可以使用Angular的元素API(https://docs.angularjs.org/api/ng/function/angular.element)来检索HTML内容。但这不会包括任何样式。 - Julia Will
是的,但是如何在浏览器之外使用这个API呢? - joelhoro
哦,也许我误解了问题。所以你需要能够在不看页面的情况下生成它(就像定期报告一样)?在这种情况下,您应该将代码生成移动到单独的Javascript类中,以便您可以在服务器端和前端都使用它。 - Julia Will
没错。我认为Node是正确的选择,但似乎这比我预想的要更广泛。也就是说,如果我可以安装一个满足我的需求的node.js实用程序,那就没问题了,但我不想开始安装一个node服务器并维护它。 - joelhoro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接