首页 > 其他分享 >简单实现邮件模板功能

简单实现邮件模板功能

时间:2024-03-06 19:58:31浏览次数:28  
标签:string Value 模板 template 简单 var null 邮件 match

系统中经常有需要发送提醒邮件的需求,而且邮件类型和内容往往又不同,有些还需要跟业务字段做关联。这种情况下,就需要用到邮件模板功能,可以通过在模板中定义业务字段标记,通过模板引擎或自定义代码来实现这些字段的填充。

下面是一个自己写的简单的,字符串替换方式实现的邮件模板功能。代码如下:

public class DynamicTemplateBinder
{
    /// <summary>
    /// 邮件模板替换
    /// </summary>
    /// <param name="template"></param>
    /// <param name="model"></param>
    /// <returns></returns>
    public static string RanderTemplate(string template, object model)
    {
        string content = template;
        if (string.IsNullOrEmpty(template))
        {

        }

        // 获取对象的类型
        Type type = model.GetType();
        var properties = type.GetProperties();


        // 匹配$$FieldName$$
        Regex regex = new Regex(@"\$\$([a-zA-Z_\.][a-zA-Z0-9_\.]*)\$\$");
        var matches = regex.Matches(template);
        foreach (Match match in matches)
        {
            // Console.WriteLine(match.Groups[1].Value); // 输出不含大括号的字段名
            string propertyName = match.Groups[1].Value;
            var propertyInfo = type.GetProperty(propertyName);
            var propVal = string.Empty;
            if (propertyInfo != null)
            {
                var propertyValue = propertyInfo.GetValue(model, null);
                if (propertyValue != null)
                {
                    propVal = propertyValue.ToString();
                }
            }
            content = content.Replace(match.Value, propVal);
        }

        return content;
    }

    string RanderLoop(string template, object model)
    {
        // 获取对象的类型
        Type type = model.GetType();

        string content = template;
        Regex regex = new Regex(@"<<LoopStart[^>]*data=(.*?)>>(.*)<<LoopEnd>>");
        var matches = regex.Matches(template);
        foreach (Match match in matches)
        {
            string loopContent = string.Empty;
            var matchVal = match.Value;
            var loopPropertyName = match.Groups[1].Value;
            var loopPropertyInfo = type.GetProperty(loopPropertyName);
            if (loopPropertyInfo != null)
            {
                var loopProperyValue = loopPropertyInfo.GetValue(model, null);
                if (loopProperyValue != null && loopProperyValue is IEnumerable)
                {
                    string loopTemp = string.Empty;
                    foreach (var item in loopProperyValue as IEnumerable)
                    {
                        var itemType = item.GetType();
                        loopTemp = match.Groups[2].Value;
                        if (loopTemp != null)
                        {
                            string itemContent = loopTemp;
                            // 匹配$$FieldName$$
                            Regex fieldReg = new Regex(@"\$\$([a-zA-Z_\.][a-zA-Z0-9_\.]*)\$\$");
                            var fieldMatches = fieldReg.Matches(loopTemp);
                            foreach (Match fm in fieldMatches)
                            {
                                string propertyName = fm.Groups[1].Value;
                                var propertyInfo = itemType.GetProperty(propertyName);
                                var propVal = string.Empty;
                                if (propertyInfo != null)
                                {
                                    var propertyValue = propertyInfo.GetValue(item, null);
                                    if (propertyValue != null)
                                    {
                                        propVal = propertyValue.ToString();
                                    }
                                }
                                itemContent = itemContent.Replace(fm.Value, propVal);
                            }
                            loopContent += itemContent;
                        }
                    }
                }
            }
            content = template.Replace(matchVal, loopContent);
        }

        return content;
    }
}
  

  模板支持单层字段和简单列表绑定。

标签:string,Value,模板,template,简单,var,null,邮件,match
From: https://www.cnblogs.com/studyever/p/18057393

相关文章

  • Python中那些简单又好用的特性和用法
    Python作为我的主力语言帮助我开发了许多DevOps运维自动化系统,这篇文章总结几个我在编写Python代码过程中用到的几个简单又好用的特性和用法,这些特性和用法可以帮助我们更高效地编写Python代码1.链式比较x=5y=10z=15ifx<y<z:print("xislessthanyandy......
  • three.js简单实践
    1.引入yarnaddthree2.vue页面引入 <divid="container"></div>import*asTHREEfrom'three'import{OrbitControls}from'three/examples/jsm/controls/OrbitControls.js'import{createMultiMaterialObject}from&......
  • Maven安装本地的jar包和创建带模板的自定义项目
    Maven安装本地的jar包如果没配置Maven的环境变量,需要先CD到maven的安装目录,因为没配置环境变量,mvn命令是无法在maven安装目录以外的目录运行。cdC:\Maven\apache-maven-3.6.3\bin然后执行下面命令格式如下:mvninstall:install-file//固定格式,maven的语法-Dfile=ali......
  • shell邮件功能-2
    场景:应用服务域名对应多台负载机,当某台出现CPU或RAM资源阻塞时,如果服务器并未死机,根据负载策略(类似ping或telnet),服务器可能仍然是可用的,新的访问仍然有分配到这台机器处理的可能,但实际又不可用,体验不好,且不能及时发送故障通知。新的负载策略是访问指定页面(类似curl命令),检查返......
  • shell邮件功能-2
    场景:应用服务域名对应多台负载机,当某台出现CPU或RAM资源阻塞时,如果服务器并未死机,根据负载策略(类似ping或telnet),服务器可能仍然是可用的,新的访问仍然有分配到这台机器处理的可能,但实际又不可用,体验不好,且不能及时发送故障通知。新的负载策略是访问指定页面(类似curl命令),检查返回结......
  • Qt QMessageBox的简单用法
    效果思路1//创建一个question弹出对话框,添加两个按钮:Yes和No2QMessageBox*box=newQMessageBox(QMessageBox::Question,"提示","确认删除''的信息吗?",QMessageBox::Yes|QMessageBox::No,this);3box->button(QMessageBox::Yes)->se......
  • 二分搜索模板
    目录最基本的二分搜索寻找左边界的二分搜索寻找右边界的二分搜索统一记忆为闭区间,只需要修改nums[mid]==target时收缩哪边边界,以及越界情况最基本的二分搜索defbinary_search(nums:List[int],target:int):left=0right=len(nums)-1while(left<=right):......
  • 简单懂点k8s网络(4)K8S对外暴露方案
       ......
  • Blender Shader Node简单记录
    不知道为什么之前找到的某个教程已经消失了,干脆自己总结算了(生气)以下所有内容均由自己辅助着官网手册进行总结。很是头大啊......基本前提Blender内用以下颜色对应坐标轴:颜色坐标轴红色X轴绿色Y轴蓝色Z轴就和一般uv颜色一样,所有负数区域都是黑色的,毕竟......
  • P 问题和 NP 问题的简单理解
    P/NP问题|维基百科P问题P问题的定义是:所有可以由一个确定型图灵机在多项式表达的时间内解决的问题P代表Polynomial-time(adj.多项式时间)简单理解:答案可以很快被计算出来的问题NP问题NP问题的定义是:所有可以在多项式时间内验证它的解是否正确的决定问题N代表......