C# Asp.net电子邮件发送过程

C# Asp.net电子邮件发送过程,c#,asp.net,email,windows-services,n-tier-architecture,C#,Asp.net,Email,Windows Services,N Tier Architecture,我们有一些需要发送电子邮件的应用程序。但现在,我们在讨论如何正确发送它们。我们的应用程序实现了N层体系结构。在流程中,表示层调用业务逻辑层的发布方法。发布成功后,需要通过电子邮件通知许多用户 在这一点上,我们要讨论的是,这是业务逻辑层的责任,还是表示层的责任。如果业务层需要发送电子邮件,那么他的工作是构建电子邮件模板还是表示层的工作。逻辑层只是一个类库,它不能调用某种asp.net页面来提取html。有些电子邮件模板的内容是动态的 实现一个Windows服务从数据库中读取并提取需要与他的内容一起

我们有一些需要发送电子邮件的应用程序。但现在,我们在讨论如何正确发送它们。我们的应用程序实现了N层体系结构。在流程中,表示层调用业务逻辑层的发布方法。发布成功后,需要通过电子邮件通知许多用户

在这一点上,我们要讨论的是,这是业务逻辑层的责任,还是表示层的责任。如果业务层需要发送电子邮件,那么他的工作是构建电子邮件模板还是表示层的工作。逻辑层只是一个类库,它不能调用某种asp.net页面来提取html。有些电子邮件模板的内容是动态的

实现一个Windows服务从数据库中读取并提取需要与他的内容一起发送的电子邮件是否好

因此,在这一点上,我们不确定什么是正确和优雅的方式来实现电子邮件发送过程。我们在互联网上做了很多搜索来回答这个问题,但是没有成功

你能和我们分享一下你对这个案件的看法或经验吗

实现一个Windows应用程序好吗 从数据库中读取的服务,以及 提取需要删除的电子邮件 发送他的内容

视情况而定。如果您的核心逻辑是任务关键型的,并且不希望在应用程序与电子邮件服务器通信时延迟执行,那么您可以将责任委托给某种服务

如果这是承包商的责任 执行此任务的业务逻辑层或 到表示层。如果 业务层需要发送电子邮件 那么他的工作是建立电子邮件吗 模板或用户的作业 表示层

尽管您决定在同一个流程中执行此操作(而不是委托给win服务),但建议您在业务逻辑层执行此操作。这样,就可以在另一个应用程序/组件中重用此逻辑,而无需太多麻烦(可重用性)

逻辑层是 只是一个类库,它不能调用 要提取的某种asp.net页面 html

您不想访问UI来获取模板,因为您可以使用DB表来存储电子邮件模板


[更新]电子邮件是html。您可以获得设计师的帮助,创建一个外观美观的html,并将其保存为数据库中的模板。对于动态字段(例如header、body),您可以放置一个特殊标记({head}、{body}),并使用实际内容在业务逻辑中替换它们

> P>典型地,业务逻辑层处理这个,因为我考虑确定谁应该接收电子邮件作为逻辑的一部分。然后,我通常会让业务层构建消息并确定收件人,然后将所有消息排入线程池或其他异步发送电子邮件的方式


我要避免的一件事是从业务逻辑中使用对
SmtpClient.SendAsync
的普通调用。我遇到的问题是,如果SendAsync在很短的时间内被调用过多次,您可能会遇到与exchange或任何电子邮件服务器的并发连接数问题。因此,在我的例子中,我们的exchange服务器最多有50个并发连接,但如果我必须在批处理作业中发送300封电子邮件,我需要以不超过50封同时发送的方式对它们进行排队
ThreadPool
可以很好地实现这一点。

好的,我们希望将其保留在业务逻辑层,以防在其他应用程序中重用此逻辑。你对电子邮件模板有什么建议。基于表示层的应用程序之间的电子邮件模板样式是否会有所不同?我更新了答案来回答这个问题。好的回答,我们考虑过这种方法并使用MailDefinition对象。