Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从C#web应用程序发送电子邮件的最佳方式是什么?_C#_Asp.net Mvc_Email_Architecture_T4 - Fatal编程技术网

从C#web应用程序发送电子邮件的最佳方式是什么?

从C#web应用程序发送电子邮件的最佳方式是什么?,c#,asp.net-mvc,email,architecture,t4,C#,Asp.net Mvc,Email,Architecture,T4,我正在开发一个即将上线的web应用程序,现在我正试图找出处理从该应用程序发送电子邮件的最佳方法。我完全理解如何使用MailMessage和SmtpClient类从应用程序发送电子邮件,但我的问题是从另一个角度提出的。在这个项目之前,我工作的主要目的是支持我之前开发的旧应用程序。在这些应用程序中,当他们需要发送电子邮件时,他们将任何消息硬编码到实际消息中,所有HTML标记直接嵌入到C代码中 我正在开发的应用程序将有一个用于发送电子邮件的模板,作为一种样式容器,不同的消息将嵌入到模板的主内容div中

我正在开发一个即将上线的web应用程序,现在我正试图找出处理从该应用程序发送电子邮件的最佳方法。我完全理解如何使用MailMessage和SmtpClient类从应用程序发送电子邮件,但我的问题是从另一个角度提出的。在这个项目之前,我工作的主要目的是支持我之前开发的旧应用程序。在这些应用程序中,当他们需要发送电子邮件时,他们将任何消息硬编码到实际消息中,所有HTML标记直接嵌入到C代码中

我正在开发的应用程序将有一个用于发送电子邮件的模板,作为一种样式容器,不同的消息将嵌入到模板的主内容div中。我想避免在这个应用程序中硬编码这些模板,所以我一直在努力找出布局我的项目的最佳方法。我曾想过使用t4模板,将不同的t4读入应用程序,并使用指定参数应用String.Format将姓名/电子邮件添加到要发送的邮件中。然而,我不确定这是最好的方法

我的另一个想法是为每种类型的消息定义一个类,但是这最终会再次硬编码消息,正如我所说的,我不想这样做

我的问题是,你过去是如何做到这一点的?什么有效,什么无效,原因是什么?我在网上到处找了找,但要么是关于如何发送消息的唯一内容,要么是我没有使用正确的Google power词语。

我这样做:

  • 使用ViewModel和Razor模板以常规方式对其进行编码
  • 通过创建电子邮件,使用加载和解析模板
  • 如果您想在线程中发送电子邮件,请注意不要使用Html和Url帮助器,因为它们依赖于HttpContext,而在这种情况下,您没有HttpContext。如果需要,构建自己的助手

例如,如果您的应用程序中有一个显示在某处的ViewModel
汽车
,您也可以将此ViewModel用作电子邮件的剃须刀模板中的@model。

我不得不在一些场合这样做。我最初使用ASP.Net模板引擎是基于Rick Strahl的一篇博客文章。它奏效了,但总有一些问题让我头疼

我转而使用模板引擎,发现它是创建和维护电子邮件模板的一种非常简单的方法。还有很多其他的模板引擎,我想下次我可能会认真研究一下

用于将值合并到模板中的代码:

private string Merge(ManualTypeEnum manualType, Object mergeValues)
{
    var body = "";
    var templateFile = string.Format("{0}MailTemplate.vm", manualType);
    var velocity = new VelocityEngine();
    var props = new ExtendedProperties();
    props.AddProperty("file.resource.loader.path", Config.EmailTemplatePath);
    velocity.Init(props);
    var template = velocity.GetTemplate(templateFile);
    var context = new VelocityContext();
    context.Put("Change", mergeValues);
    using (var writer = new StringWriter())
    {
        template.Merge(context, writer);
        body = writer.ToString();
    }
    return body;
}
要合并的值作为匿名对象传递,可以包括各种类型,包括列表等

var emailBody = Merge(newDocument.ManualType, new
{
    ManualType = newDocument.ManualType.ToString(),
    Message = change.Message,
    NewTitle = newDocument.Title ?? "",
    NewVersion = newDocument.Version ?? "",
    Contact = From,
    Changes = change.ToList(),
});

到目前为止,您自己在聊天代码方面做了哪些尝试,以便有人可以看到并可能帮助您。。?取决于您真正想要的是什么发送电子邮件不是一项困难的任务,因为.NET为您提供了许多使用System.NET.Mail或通过Web应用程序使用System.Web.Mail的选项。还有许多以前的示例,您可以在此网站或签出codeproject.com上搜索和研究很多伟大的示例主要是代码刚刚出现在我的脑海里。在我花大量时间编写代码之前,我想知道最好的方法。我已经试着研究了好几个小时了。我不需要手去抓怎么做,只需要手去抓应该做什么。到目前为止,我提出的想法仍在我的问题中,但正如我所说,我不确定这是解决这个问题的最佳方法。你有访问数据库的权限吗?您可以将每种类型的邮件、收件人、主题、正文等存储在数据库中,并在其上构建一个简单的维护例程。您还可以在电子邮件正文中输入各种标记,作为其他文本(如用户名)的占位符。我以前做过,它运行得相当好。应用程序确实有一个数据库,这是我实际上考虑过做的事情之一。一开始我对这样做有点担心,因为我不确定消息是否应该存储在数据库中,但消息可以随时更新,这绝对是一个专业。收件人当前也存储在数据库中。谢谢你的投入,我现在将更加明确地考虑到,我知道其他人做得很好。我仍然想知道是否有更好的方法。谢谢你的链接。在某种程度上,这与我所寻找的更接近。我是否正确地假设您将模板作为一个实际的单独文件,或者您是否按照他们在主页上显示的那样对其进行硬编码?当然,没有硬编码,对于每封电子邮件,我都有一个cshtml文件。因此,您也可以在应用程序中将其用作电子邮件预览。Hmmm。。这是一个明确的加号,能够预览一条消息。我真的很喜欢这个功能的想法。你可以看看它是在哪里建立的。但我认为你可能无法用这个线程发送邮件。我已经考虑过这个问题,但对使用这个问题很谨慎,因为我将从应用程序的服务端发送电子邮件,而不是web应用程序本身。此网站最终将在Windows Azure上运行,因此我希望尽可能减少服务和网站之间来回传递电子邮件\用户信息以进行发送。这就是将电子邮件存储在数据库中听起来不错的原因之一——更新应用程序可能是一个漫长的过程。。看起来我可以用一个文件来实现这一点,但我可以考虑将Razor引擎与数据库结合起来,从数据行获取信息,然后对其进行转换。分离关注点怎么样?你认为这会是一场混战吗