C#创建一个可用于发送电子邮件的模板

时间:2011-07-21 23:30:15

标签: c# templates

我正在写自动电子邮件。它必须每X分钟扫描一次数据库,并通过电子邮件向人们发送提醒等。

我已准备好所有底层代码。我现在需要的只是格式化电子邮件。

C#中是否有预定义的模板系统,因此我可以使用不同的模板创建一个文件夹,例如。标签,例如{NAME},所以我只是找到并替换它。

我可以手动打开* .txt文档并替换那些特定的标签等,但有什么更聪明的吗?我不想重新发明轮子。

7 个答案:

答案 0 :(得分:2)

我会看看使用StringTemplate:http://www.stringtemplate.org/

答案 1 :(得分:1)

You can do it with MVC 3's Razor templates, even in non-web applications

互联网搜索Razor templates non-web会有很多例子。

答案 2 :(得分:1)

从头开始写起来并不困难。我写了这个快速实用程序来完成您所描述的内容。它在模式{token}中查找标记,并将其替换为它从NameValueCollection检索的值。字符串中的标记对应于集合中的键,这些键将被替换为集合中键的值。

它还有一个额外的好处,就是它足够简单,可以根据需要进行自定义。

    public static string ReplaceTokens(string value, NameValueCollection tokens)
    {
        if (tokens == null || tokens.Count == 0 || string.IsNullOrEmpty(value)) return value;

        string token = null;
        foreach (string key in tokens.Keys)
        {
            token = "{" + key + "}";
            value = value.Replace(token, tokens[key]);
        }

        return value;
    }

用法:

    public static bool SendEcard(string fromName, string fromEmail, string toName, string toEmail, string message, string imageUrl)
    {

        var body = GetEmailBody();

        var tokens = new NameValueCollection();
        tokens["sitedomain"] = "http://example.com";
        tokens["fromname"] = fromName;
        tokens["fromemail"] = fromEmail;
        tokens["toname"] = toName;
        tokens["toemail"] = toEmail;
        tokens["message"] = message;
        tokens["image"] = imageUrl;


        var msg = CreateMailMessage();
        msg.Body = StringUtility.ReplaceTokens(body, tokens);

        //...send email
    }

答案 3 :(得分:0)

您可以使用nVelocity

string templateDir = HttpContext.Current.Server.MapPath("Templates");
string templateName = "SimpleTemplate.vm";

INVelocityEngine fileEngine = 
    NVelocityEngineFactory.CreateNVelocityFileEngine(templateDir, true);

IDictionary context = new Hashtable();

context.Add(parameterName , value);

var output = fileEngine.Process(context, templateName);

答案 4 :(得分:0)

如果您使用的是ASP.NET 4,可以从Nuget Gallery下载RazorMail。它允许使用Razor View Engine创建电子邮件,以及MVC http请求的上下文。

可以通过以下链接找到更多详细信息......

http://www.nuget.org/List/Packages/RazorMail

https://github.com/wduffy/RazorMail/

答案 5 :(得分:0)

我使用这个,插入一个Regex和一个根据匹配选择替换值的方法。

/// </summary>
/// <param name="input">The text to perform the replacement upon</param>
/// <param name="pattern">The regex used to perform the match</param>
/// <param name="fnReplace">A delegate that selects the appropriate replacement text</param>
/// <returns>The newly formed text after all replacements are made</returns>
public static string Transform(string input, Regex pattern, Converter<Match, string> fnReplace)
{
    int currIx = 0;
    StringBuilder sb = new StringBuilder();

    foreach (Match match in pattern.Matches(input))
    {
        sb.Append(input, currIx, match.Index - currIx);
        string replace = fnReplace(match);
        sb.Append(replace);
        currIx = match.Index + match.Length;
    }
    sb.Append(input, currIx, input.Length - currIx);
    return sb.ToString();
}

使用示例

    Dictionary<string, string> values = new Dictionary<string, string>();
    values.Add("name", "value");

    TemplateValues tv = new TemplateValues(values);
    Assert.AreEqual("valUE", tv.ApplyValues("$(name:ue=UE)"));


    /// <summary>
    /// Matches a makefile macro name in text, i.e. "$(field:name=value)" where field is any alpha-numeric + ('_', '-', or '.') text identifier
    /// returned from group "field".  the "replace" group contains all after the identifier and before the last ')'.  "name" and "value" groups
    /// match the name/value replacement pairs.
    /// </summary>
    class TemplateValues
    {
            static readonly Regex MakefileMacro = new Regex(@"\$\((?<field>[\w-_\.]*)(?<replace>(?:\:(?<name>[^:=\)]+)=(?<value>[^:\)]*))+)?\)");
            IDictionary<string,string> _variables;

            public TemplateValues(IDictionary<string,string> values)
            { _variables = values; }

            public string ApplyValues(string template)
            {
                return Transform(input, MakefileMacro, ReplaceVariable);
            }

            private string ReplaceVariable(Match m)
            {
                    string value;
                    string fld = m.Groups["field"].Value;

                    if (!_variables.TryGetValue(fld, out value))
                    {
                            value = String.Empty;
                    }

                    if (value != null && m.Groups["replace"].Success)
                    {
                            for (int i = 0; i < m.Groups["replace"].Captures.Count; i++)
                            {
                                    string replace = m.Groups["name"].Captures[i].Value;
                                    string with = m.Groups["value"].Captures[i].Value;
                                    value = value.Replace(replace, with);
                            }
                    }
                    return value;
            }
    }

答案 6 :(得分:0)

(即使你已经给出答案,以备将来参考) - 我对类似性质的问题得到了一些惊人的回答:Which approach to templating in C sharp should I take?