电子邮件提供商设计

本文关键字:提供商 电子邮件 | 更新日期: 2023-09-27 18:09:34

我正在考虑使用提供者模式创建一个电子邮件提供者。我们的电子邮件系统很混乱。我们在同一个应用程序中有不同的区域,以及不同的应用程序使用自己的方式处理电子邮件。我想创建一个电子邮件提供商,因为信息全面大致相同。通过使用提供者模式,我可以使用我们的默认方式来处理电子邮件,但通过使用接口,我可以引入更具体/自定义的电子邮件处理。

所以我不太确定如何设置界面来处理每个区域的特定/自定义处理,并正在寻找一些指导。我将有我的抽象类来容纳默认设置/功能,然后有我的电子邮件提供程序,它将执行调用到sproc发送电子邮件。

现在不确定我将如何引入一个新的接口,以便如果另一个开发人员需要做一些与他所从事的领域相关的定制,他可以扩展提供者来处理他的更改。对这种方法有什么想法吗,或者建议其他方法?如果您喜欢提供者方法,并且知道如何实现我所建议的方法,那么一点点伪代码将是不错的选择。:)

public Interface IEmail   
abstract class EmailProviderBase : ProviderBase, IEmail
   //Default settings and methods
   public virtual SendEmail(){}

//Used to handle default implementation
public class EmailProvider : EmailProviderBase
//But want other classes to be used to handle other devs custom implementations
//I guess I could create another provider per say based on EmailProviderBase.
public class CustomEmail : EmailProviderBase
谁能告诉我他们是否喜欢这个方法?如果没有,您将如何使用接口来设计它?

谢谢,DND

电子邮件提供商设计

这可能只是我的看法,但在我看来,System.Net.Mail类在抽象细节方面已经做得很好,并且在可定制性和易用性之间取得了很好的平衡。如果您试图进一步简化,您将失去在需要时进行定制的能力。

我们开始沿着这条路做一些电子邮件,随着我们做了更多的项目,我们的需求发生了变化,我们最终不得不自定义我们的课程,以至于很明显整个练习都是在浪费时间。

然而,我理解你来自哪里,这是另一种统一你如何从你的应用程序发送电子邮件的可能性。这不是你要求的,而是根据我们团队的工作情况,提出了一种可能的解决问题的不同方法。

我们的决定完全基于我们最大的痛点,即我们的管理员每隔几年就会换掉Exchange服务器,或者他们会因为这样或那样的原因改变IP地址。每次发生这种情况,我们都必须重新编译一堆代码,这非常令人沮丧。

我们最终建立了一个具有电子邮件功能的web服务。现在,我们内部应用程序中的所有邮件都使用web服务。当我们的管理员在服务器上更改某些内容时,我们只需要调整web服务中的。config文件,而不必在每个发送电子邮件的应用程序中重新编译或编辑。config文件。

这对我们来说特别有效,因为我们能够将错误处理集成到我们的中央错误日志数据库中,所以我们所有的应用程序都只有几行代码来发送电子邮件。错误处理是免费的。

自从我们实现这一点以来,我们必须做的唯一调整是让web服务通过PickupDirectory发送电子邮件,而不是直接与Exchange服务器通信。这允许服务在Exchange服务器关闭(维护、重新启动以应用补丁等)时工作

web服务中的代码也相当简单,并使用Microsoft.Security.AntiXss组件处理卫生问题。

代码中对监督者系统的引用是对我们的中央错误记录数据库的引用。我不打算包括这段代码,因为这已经是一个太长的答案,所有它真正做的是记录错误到SQL数据库。

对不起,它是在VB中指定的c#,但如果你感兴趣,它应该很容易转换。

<WebMethod()> _
 Public Function SendEmailViaPickupDir(ByVal FromAddress As String, ByVal ToList As String, ByVal CcList As String, ByVal BccList As String, _
                    ByVal Subject As String, ByVal MessageBody As String, ByVal IsBodyHtml As Boolean) As Boolean
    Dim msg As System.Net.Mail.MailMessage = BuildMessage(FromAddress, ToList, CcList, BccList, Subject, MessageBody, IsBodyHtml)
    If Not msg Is Nothing Then
        Return SendMessageViaPickupDir(msg)
    Else
        Return False
    End If
End Function
Private Function BuildMessage(ByVal FromAddress As String, ByVal ToList As String, ByVal CcList As String, ByVal BccList As String, _
     ByVal Subject As String, ByVal MessageBody As String, ByVal IsBodyHtml As Boolean) As System.Net.Mail.MailMessage
    Dim msg As New System.Net.Mail.MailMessage
    Try
        msg.From = New System.Net.Mail.MailAddress(FromAddress)
        If Not ToList Is Nothing Then
            For Each Address As String In ToList.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
                msg.To.Add(New System.Net.Mail.MailAddress(Address.Trim()))
            Next
        End If
        If Not CcList Is Nothing Then
            For Each Address As String In CcList.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
                msg.CC.Add(New System.Net.Mail.MailAddress(Address.Trim()))
            Next
        End If
        If Not BccList Is Nothing Then
            For Each Address As String In BccList.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
                msg.Bcc.Add(New System.Net.Mail.MailAddress(Address.Trim()))
            Next
        End If
        msg.Subject = Microsoft.Security.Application.AntiXss.HtmlEncode(Subject)
        If (IsBodyHtml) Then
            msg.Body = Microsoft.Security.Application.AntiXss.GetSafeHtmlFragment(MessageBody)
        Else
            ' This was causing formatting issues...
            msg.Body = MessageBody
        End If
        msg.IsBodyHtml = IsBodyHtml
    Catch ex As Exception
        Dim s As New OverseerService
    s.WriteToSql(Convert.ToInt64(ConfigurationManager.AppSettings("OverseerWebSiteResourceid")), User.Identity.Name, _
     My.Computer.Name, ex.ToString(), MyCompany.Overseer.EventLogger.SeverityLevel.Critical)
        Return Nothing
    End Try
    Return msg
End Function
Private Function SendMessageViaPickupDir(ByVal msg As System.Net.Mail.MailMessage) As Boolean
    Dim ret As Boolean = False
    Try
        ' try to send through pickup dir
        Dim c1 As New System.Net.Mail.SmtpClient("localhost")
        c1.DeliveryMethod = Net.Mail.SmtpDeliveryMethod.PickupDirectoryFromIis
        c1.Send(msg)
        ret = True
    Catch ex As Exception
        Try
            ' log as a known error
            Dim s As New OverseerService
            s.WriteToSql(Convert.ToInt64(ConfigurationManager.AppSettings("OverseerWebSiteResourceid")), User.Identity.Name, _
             My.Computer.Name, "failed to write email to pickup dir " + ex.ToString(), MyCompany.Overseer.EventLogger.SeverityLevel.KnownError)
        Catch
            ' ignore error from writing the error
        End Try
    End Try
    Return ret
End Function

您查看过http://mailsystem.codeplex.com/了吗?这可能是codeplex上最复杂的OSS电子邮件工具。在codeplex上有一个更简单的产品,它更类似于你上面描述的,但我现在没有任何运气找到它。