我们有一些需要发送电子邮件的应用程序。但是现在,我们正在讨论发送它们的正确方法。我们的应用程序实现了N层架构。在一个过程中,表示层调用业务逻辑层的发布方法。发布成功后,需要通过电子邮件通知许多用户。
此时我们辩论要知道,如果这是业务逻辑层执行此工作或表示层的责任。如果业务层需要发送电子邮件,那么构建电子邮件模板或表示层的工作是他的工作。逻辑层只是一个类库,它不能调用某种asp.net页面来提取html。一些电子邮件模板内容是动态的。
实施Windows服务是否可以从数据库中读取并提取需要与其内容一起发送的电子邮件?
所以在这一点上,我们不确定实施电子邮件发送过程的正确和优雅方式是什么。我们在互联网上进行了大量搜索以回答这个问题,但没有成功。
您能否与我们分享您对此案的意见或经验?
答案 0 :(得分:2)
实施Windows是否合适? 服务从数据库中读取和 提取有必要的电子邮件 发送他的内容?
这取决于。如果您的核心逻辑是关键任务的,并且不希望在应用程序与电子邮件服务器通信时延迟执行,那么您可以将责任委派给某种服务。
如果这是责任 业务逻辑层来完成这项工作或 到表示层。如果 业务层需要发送电子邮件 然后建立电子邮件是他的工作 模板或工作 表示层。
虽然您决定在同一个过程中执行此操作(不委托win-service),但建议您在业务逻辑层中执行此操作。这样,就可以在另一个应用程序/组件中重用该逻辑而不会有太多麻烦(可重用性)。
逻辑层是 只是一个类库,它不能调用 某种asp.net页面提取 html。
您不想访问UI来获取模板,因为您可以使用DB-Table来存储电子邮件模板。
[更新] 电子邮件是html ..您可以获得设计师的帮助,创建一个漂亮的HTML,希望您的电子邮件看起来像并将其保存为数据库中的模板。对于动态字段(例如标题,正文),您可以使用特殊标记({head},{body})并使用实际内容替换它们在业务逻辑中。
答案 1 :(得分:0)
我通常有业务逻辑层处理这个,因为我考虑确定谁应该接收电子邮件作为逻辑的一部分。然后我通常会让业务层构建消息并确定收件人,然后将所有消息排队到ThreadPool或其他异步发送电子邮件的方式。
我要避免的一件事是使用来自业务逻辑的SmtpClient.SendAsync
的普通调用。我遇到的问题是,如果SendAsync在很短的时间内被调用太多次,您可能会遇到要交换的并发连接数或任何电子邮件服务器的问题。所以在我的情况下,我们的交换服务器最多有50个并发连接,但是如果我必须在批处理作业中发送300封电子邮件,我需要将它们排队,使得不超过50个同时发送。 ThreadPool
适用于此。