寻找一种存储电子邮件模板的好方法

时间:2010-01-16 23:25:44

标签: asp.net templates email

我正在构建一个我们正在适当使用电子邮件模板的网站。在我们传递令牌的HTML模板中,如{UserName},{Email},{NameFirst}等。

就最佳实践而言,我正在努力将这些存储在哪里。我将首先展示我采取的方法,并且我很高兴听到一些专家的观点作为替代方法。

我在名为/ Templates /.

的文件夹中创建了HTML模板

我在服务层中调用静态方法,它接受以下参数:

  1. 用户名
  2. 用户ID
  3. 电子邮件
  4. TemplatePath(“〜/ Templates”)
  5. 电子邮件主题
  6. 在服务层中,我有我的静态方法SendUserEmail(),它使用Template类 - 它接受路径,将其作为字符串加载,并具有AddToken()方法。

    在我的静态SendUserEmail()中,我从方法签名中构建了令牌列表,然后发送电子邮件。

    这在我的实际使用中进行了很长的方法调用,特别是因为我从web.config调用了“TemplatePath”和“Email Subject”。我可以创建一个比ConfigurationManager.AppSettings更短的方法调用的实用程序,但我更关心的是我通常不会看到方法签名这么久,我觉得这是因为我做错了。

    这种技术非常适合我现在拥有的电子邮件,它们最多使用前3个令牌。但是将来我会有更多的令牌传递给我,我只是想知道采取什么方法。

    我是否创建了特定于需要发送的电子邮件的方法?即。 SendNewUserRegistration(),SendMarketingMaterial(),每个参数都有不同的签名?

    我使用的是ASP.NET Membership,它可能包含了我需要的所有字段的扩展。有三个主要对象,aspnet_User,aspnet_Mebership和aspnet_profile。如果它全部包含在一个对象中,我会把它传递进去。是否存在性能问题,传递所有3个,以获得我需要的所有字段?那只是传递aspnet_User.UserID,aspnet_User.Email等?

    我可以看到在字典中传递令牌条目,但我只是想知道这对于调用页面是否太过分了?

    有没有办法将它们粘贴在自己名为Templates.config的配置文件中,该文件的标签类似于 -

    <Templates>
    <EmailTemplate Name="New User Registration">
    <Tokens>
    <UserName>
    <UserID>
    <Email>
    </Tokens>
    <Message Subject="Hi welcome...">
       Hi {UserName}...
    </Message>
    </EmailTemplate>
    </Templates>
    

    我想我要问的主要原因是因为我很难确定责任应该在哪里确定使用什么模板,以及如何传递参数。如果调用页面必须构建TokenName,TokenValue的字典,这样可以吗?或者该方法应该将每个方法作为定义的参数?这在web.config中看起来不合适,因为我有2个条目,并且感觉它应该看起来更嵌套。

    谢谢。我可以用任何客观方法的技巧或建议来询问我的方法是否正常。

1 个答案:

答案 0 :(得分:2)

首先,我建议您使用NVelocity作为模板引擎。至于主要问题,我认为您可以创建一个抽象类 MailMessage ,并为每个需要的消息派生每个消息(使用唯一模板)。所以你将使用如下:

MailMessage message = new UserRegistrationMessage(tokens);
//some code that sends this message

通过这种方式,您可以强制每个具体的XXXMessage类负责存储模板并使用给定的标记填充模板。如何处理令牌?最简单的方法是在将字典传递给消息之前创建一个字典,这样每个具体的消息类都知道如何处理传递的字典以及它应该包含哪些标记,但是你还需要记住它应该包含哪些标记。另一种方式(我更喜欢它)是为每个所需的唯一令牌集创建一般抽象类型 TokenSet 和派生的一种。例如,您可以创建 UserMessageTokenSet:TokenSet 以及其中的几个属性:

UserNameToken
SomeUserProfileDataToken

等。因此,使用这种方式,您将始终知道,您应为每个令牌集设置哪些数据和
UserRegistrationMessage将知道从此tokenSet中获取的内容。

有很多方法可以去。如果你能更好地描述你的任务,我想我会尝试给你一些更具体的建议。但是上面列出了一般的想法。希望它有帮助=)