如何为电子邮件中的占位符编码?

时间:2012-04-20 09:59:05

标签: c# asp.net-mvc algorithm design-patterns

要求是在我正在处理的应用程序中,我可以编辑所有可用的电子邮件。

显而易见的解决方案是将所有消息存储在数据库中,并使用文本编辑器为用户编辑消息。

但是我想知道如何在电子邮件消息中设置占位符。

邮件的占位符也必须存储在数据库中。消息可以包含许多占位符。占位符可以包含在许多消息中。

我可以允许用户在插入占位符时从占位符列表中选择占位符。

电子邮件消息需要包含占位符标记,通常为{0},{1}等,但出于显示目的,这需要更加用户友好,例如$ WebsiteLink $。 一些占位符是直截了当的,例如指向网站的链接,该链接仅根据部署或登录用户的名称而更改。

其他占位符更复杂。它们依赖于在特定时间从数据库获取信息,例如选定的团队成员名称。 所以对于这个占位符而不是保存一些静态文本,我需要调用一个方法或事件来获取该信息。

我不清楚如何做到这一点。你能帮忙吗?

我希望规范是明确的,如果没有,请告诉我?

4 个答案:

答案 0 :(得分:3)

对于简单的String.Format替换,请查看Phil Haack的this blog post(和后续内容)。

那里的解决方案意味着您可以使用{name}{date}等命名占位符代替{0}

这并不能解决整个UI问题,但至少占位符更清晰。

答案 1 :(得分:1)

要么你可以像哥特所建议的那样去做(或者甚至看看this,我没有用它但看起来很甜),或者是另一种方式:

1.您构建了一个HTML模板,我们称之为mailTemplate.html

(小心,表......)

<table>
    <tr>
        <td> 
            <%MY_PLACEHOLDER%>
        </td>
    </tr>
</table>

2.然后您只需在方法中使用它,假设templatePath是模板文件的物理路径:

var mailDefinition = new MailDefinition
                         {
                              BodyFileName = templatePath,
                              IsBodyHtml = true,
                              From = ... // you'll have to fill that
                         };
string replacementForPlaceholder = "Look at me!";
var replacements = new ListDictionary { { "<%MY_PLACEHOLDER%>", replacementForPlaceholder }};

string recipients = ... // well, specify recipients
var message = mailDefinition.CreateMailMessage(recipients, replacements, new LiteralControl());

您的邮件已准备好发送。如果你不对HTML表格和其他东西太过疯狂,如果收件人禁用了HTML,邮件会优雅地降级为文本。

答案 2 :(得分:0)

上个月,我实现了以下基于模板的EmailModule,它使用了Razor语法。它应该适用于您的情况。它很容易实现。

http://kazimanzurrashid.com/posts/use-razor-for-email-template-outside-asp-dot-net-mvc

感谢Kazi Manzur Ra​​shid。

答案 3 :(得分:0)

C#现在支持插值。对于仍然担心这一点的人,请看一下here