需要创建一个邮件生成器,为不同的邮件做模板
本文关键字:创建 一个 | 更新日期: 2023-09-27 18:04:38
我需要创建一个电子邮件生成器,使用不同类型的邮件模板。我做了一些非常简单的事情,在html上做替换,使用标签。它是有效的,但现在,我需要更普通的东西。让我再解释一下:我有不同的json,我用它来替换标签到html模板,例如:
{
"Minutes": 60,
"Machines": [
{
"Name": "Machine1",
"Id": "4768"
},
{
"Name": "Machine2",
"Id":"6502"
}
]
}
在本例中,我使用MINUTES作为主题,并且使用MACHINES数组,我使<href>
下面是另一个例子:
{
"Threshold": 12,
"Server": [
{
"Name": "Machine1",
"CpuUsage": 27,
"RamUsage": 62
},
{
"Name": "Machine2",
"CpuUsage": 25,
"RamUsage": 57
}
]
}
在这个,我需要做一个表的服务器。像这样,我有很多更多的json,应该替换成html模板。
这是使它通用的最好方法,所以,下次我需要创建另一个模板,应该很容易,只需使json格式,并根据做模板html,它应该自动工作,无需编码。谢谢!
我有同样的问题前一段时间,我已经解决了它使用SmartFormat (https://github.com/scottrippey/SmartFormat)。基本上你创建一些对象(或对象可以从反序列化json字符串创建),你将它传递给SmartFormat格式化你的文本。例如
var fmtObj = new
{
UserFullName = "...",
UserUserName = "...",
WebAppUrl = "...",
DownloadLink = "...",
UnsubscribeLink = "...",
};
可以是匿名的也可以是全类的。如果你有这样的HTML:
var htmlBody = "Hello, <b>{UserFullName}</b>," +
"<br><br>Your account has been created!" +
"<br><br>Go to {WebAppUrl} to login!";
您可以使用呼叫Smart。格式:
var formattedBody = Smart.Format(htmlBody, fmtObj);
在formattedBody
中,您有格式化的文本。它也适用于类本身的属性(例如User.FullName
)
最好的方法是创建一个视图(cshtml文件)并发送一个模型给它。这个视图就像一个模板,让你可以自由地创建一个漂亮的电子邮件:
- 创建视图
- 为视图创建一个模型(ViewModel)
-
在控制器中添加以下功能:
protected string RenderPartialViewToString(string viewName, object model) { if (string.IsNullOrEmpty(viewName)) viewName = ControllerContext.RouteData.GetRequiredString("action"); ViewData.Model = model; using (StringWriter sw = new StringWriter()) { ViewEngineResult viewResult = ViewEngines.Engines .FindPartialView(ControllerContext, viewName); ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw); viewResult.View.Render(viewContext, sw); return sw.GetStringBuilder().ToString(); } }
-
从你的动作中调用上面的函数:
var partialView = RenderPartialViewToString("_EmailView", new EmailViewModel() { Email = user.Email, UserName = user.UserName, ... });
-
partialView变量现在包含电子邮件的html正文,您可以发送它。完成了!