我正在写自动电子邮件。它必须每X分钟扫描一次数据库,并通过电子邮件向人们发送提醒等。
我已准备好所有底层代码。我现在需要的只是格式化电子邮件。
C#中是否有预定义的模板系统,因此我可以使用不同的模板创建一个文件夹,例如。标签,例如{NAME}
,所以我只是找到并替换它。
我可以手动打开* .txt文档并替换那些特定的标签等,但有什么更聪明的吗?我不想重新发明轮子。
答案 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请求的上下文。
可以通过以下链接找到更多详细信息......
答案 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?