在ColdFusion中存储自动交易电子邮件模板的位置

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在ColdFusion中存储自动交易电子邮件模板的位置相关的知识,希望对你有一定的参考价值。

我正在开发一个电子商务应用程序,该应用程序通过电子邮件自然地与用户进行交流,例如:

  • 用户注册
  • 电子邮件验证
  • 密码重置
  • 订单确认
  • 发货确认
  • 评论通知

等等。

目前我只发送用户注册电子邮件,所以我设法将它们全部保存在一个名为email.cfc的组件中,并在application范围内保留一个实例,如<cfset APPLICATION.EmailSender = New email.cfc() />

email.cfc只有一堆方法可以发送不同的电子邮件,例如:

<cffunction name="NewUserRegistered">
  <cfmail type="html" to="#useremail#" subject="Welcome" >
    <h1>Thanks for registering #username#!</h1>
  </cfmail>
</cffunction>

<cffunction name="PasswordReset">
  <cfmail type="html" to="#useremail#" subject="Password Reset">
    <h1>Dear #username#, you requested a password reset...</h1>
  </cfmail>
</cffunction>

<cffunction name="OrderConfirmation">
  <cfmail type="html" to="#useremail#" subject="Order Confirmation #orderid#">
    <h1>Your order: #order_id# has been received...</h1>
  </cfmail>
</cffunction>

我刚刚意识到不同的电子邮件类型的数量即将大量增加,我最终可能会有大约50种不同类型的电子邮件,这些电子邮件必须根据事件的类型而发送。将所有这些电子邮件模板保留在应用程序范围内的单个CFC中似乎太容易了,这可能会填满服务器内存或导致其他可扩展性问题(无论可能是什么/意味着什么)

在ColdFusion中管理发送自动交易电子邮件的更好方法是什么?一些可能的解决方

  • 继续将所有电子邮件保存在一个CFC中,并从其他CFC / CFM页面访问它们
  • 将模板保存在需要它的CFC中,例如shoppingcart.cfc,它将在购物会话结束时触发订单确认电子邮件
答案

编辑:添加了占位符替换的示例。

我会建议用HTML写出模板,然后将HTML保存到数据库中。然后你可以创建一个函数,可以查询你的数据库然后填充和发送你的电子邮件。那将是非常轻量级的。

<cfscript>
    // Our mail function.
    public Void function genEmail ( required Numeric templateTypeID, required String userEmail, required Struct placeholder ) {

        // Created fake query of templates.
        emailTemplateQuery = queryNew(
            "templatetypeid,templatesubject,templatetext",
            "integer,varchar,varchar", 
            [ 
                { templatetypeid=1,templatesubject='Welcome',templatetext='<h1>Thanks for registering!</h1><p>[[p1]]</p><p>[[p2]]</p>' },
                { templatetypeid=2,templatesubject='Password Reset',templatetext='<h1>You requested a password reset.</h1><p>[[p1]]</p><p>[[p2]]</p>' },
                { templatetypeid=3,templatesubject='Another Email',templatetext='<h1>You did something.</h1><p>[[p1]]</p><p>[[p2]]</p><p>[[p3]]</p>' }
            ]
        ) ;
        ///////////////////////////////////

        // Build the query.
        local.sql = "SELECT templatesubject, templatetext FROM emailTemplateQuery WHERE templateTypeID = :templateTypeID" ;
        // Which template?
        local.params = { templateTypeID = arguments.templateTypeID };   
        // Query options?
        local.queryoptions = { 
            dbtype="query" 
            // datasource="myDSN" << Use your DSN for final query.
        } ;

        // Create a new query and execute it.
        local.emailQ = QueryExecute(local.sql, local.params, local.queryoptions ) ;

        local.finalEmailString = local.emailQ.templatetext ;

        // Let's inject our placeholder info into our email template
        for ( var p IN arguments.placeholder ) {
            local.finalEmailString = local.finalEmailString.replaceNoCase(
                "[[" & p & "]]" ,
                arguments.placeholder[p] ,
                "All"
            ) ;
        }

        // Create a new mail object.
        local.sendEmail = new mail() ;
        // Save mail body to a variable.
        savecontent variable="emailBody" {
            writeOutput(local.finalEmailString);
        }
          // Set From, To, Type, etc.
          sendEmail.setFrom("fromMe@domain.com");
          sendEmail.setTo(arguments.userEmail);
          sendEmail.setType("html");
          sendEmail.setSubject(local.emailQ.templatesubject);
          // Send the email. So uncomment next line to send.
          //sendEmail.send(body=emailBody); 

        // We don't have to return anything, but for this demo, we want to see what email will be sent.
        writeDump(local.emailQ.templatesubject);
        writeDump(local.finalEmailString);
    }



    // To send an email, just call genEmail() and pass the type and who to.
    genEmail(1,"bill@beexcellent.com",{"p1":"This is my first replacement.","p2":"This is my second replacement."}) ;
    writeoutput("<br><br>");
    genEmail(2,"ted@beexcellent.com",{"p1":"This is my third replacement.","p2":"This is my fourth replacement."}) ;
    writeoutput("<br><br>");
    genEmail(3,"rufus@beexcellent.com",{"p1":"This is my fifth replacement.","p2":"This is my sixth replacement.","p3":"This is my seventh replacement."}) ;
</cfscript>

这可以简化一点。我的大部分代码都是设置测试数据并使用Query Of Query。您需要使用常规调用数据源。您还可以在cfmail标记内更有效地使用查询结果。我强烈建议在允许任何内容从您的系统发送电子邮件之前进行大量过滤和验证。您还可以从电子邮件功能返回状态代码以验证成功(或其他信息)。

您可以将电子邮件进程保存到自己的CFC中,然后将其缓存以在整个应用程序中使用。

注意:对于大多数CF,我也更喜欢脚本到标签,但如果您愿意,我上面的逻辑可以转换回标签。

https://cffiddle.org/app/file?filepath=639e2956-a658-4676-a0d2-0efca81d7c23/ce5629c9-87e6-4bff-a9b8-86b608e9fc72/c8d38df7-f14d-481f-867d-2f7fbf3238f2.cfm

结果:通过上述测试,您将收到包含以下HTML的电子邮件。

genEmail(1,"bill@beexcellent.com",{"p1":"This is my first replacement.","p2":"This is my second replacement."})欢迎

Thanks for registering!

这是我的第一个替代品。

这是我的第二个替代品。

genEmail(2,"ted@beexcellent.com",{"p1":"This is my third replacement.","p2":"This is my fourth replacement."})

重设密码

You requested a password reset.

这是我的第三个替代品。

这是我的第四个替代品。

genEmail(3,"rufus@beexcellent.com",{"p1":"This is my fifth replacement.","p2":"This is my sixth replacement.","p3":"This is my seventh replacement."})

另一封电邮

You did something.

这是我的第五个替代品。

这是我的第六个替代品。

这是我的第七个替代品。

以上是关于在ColdFusion中存储自动交易电子邮件模板的位置的主要内容,如果未能解决你的问题,请参考以下文章

使用ColdFusion从Outlook .msg文件中提取附件

Netsuite / Freemarker - 访问电子邮件模板中的交易行级别数据

ColdFusion格式在电子邮件中丢失

在模板中找不到发送到 mandrill

两个表查询(SQL 和 ColdFusion)中的匹配值

为什么不能在Coldfusion中顺序调用同一组件的两个方法?