Coldfusion CFMAIL& CfMailPart自定义标签

时间:2016-02-18 15:32:51

标签: coldfusion cfmail

我正在为CFMAIL编写自定义标记。我需要以与标准CFMAIL不同的方式处理某些电子邮件。我使用以下帖子作为起点 - http://www.cfhero.com/2011/11/creating-environment-safe-wrapper-for.html

之前

<cfmail to="no@example.com" from="no@test.com" subject="This is only a test">
<cfmailparam name="Importance" value="high">
hello world</cfmail>

自定义标签后

<cf_email to="no@example.com" from="no@test.com" subject="This is only a test">
<cf_emailparam name="Importance" value="high">
hello world</cf_email>

一切正常用于自定义CFMAIL和CFMAILPARAM,但我的问题是如何处理“CFMAILPART”。在新标签中使用现有的CFMAILPART时,CF会抛出错误。

<cf_email to="no@example.com" from="no@test.com" subject="This is only a test">
<cf_emailparam name="Importance" value="high">
    <cfmailpart type="text">Text</cfmailpart>
    <cfmailpart type="html">HTML</cfmailpart></cf_email>
  

详细信息:标记必须嵌套在cfmail标记内。

     

消息:标记cfmailpart的上下文验证错误。

我正在思考我的想法,但我没有找到任何帮助文档。任何帮助或起点都是最受欢迎的。

提前致谢。

2 个答案:

答案 0 :(得分:3)

是否必须是自定义标签?在我看来,这将更简单地包含在CFC中。类似的东西:

<cfcomponent output="false">

    <cffunction name="init" access="public" returntype="any" output="false">
        <cfreturn this>
    </cfunction>

    <cffunction name="sendEmail" access="public" returntype="void" output="false">
        <cfargument name="to" required="true">
        <cfargument name="from" required="true">
        <cfargument name="subject" required="true">
        <cfargument name="importance" required="true">
        <cfargument name="htmlContent" required="true">
        <cfargument name="textContent" required="true">

        <!--- do a check here to see if in production something like--->
        <cfif ListFirst(CGI.SERVER_NAME, ".") neq "www">
            <!--- override the to email address or whatever here --->
            <cfset to = "foo@development.local">
        </cfif>

        <cfmail to="#to#" from="#from#" subject="#subject#">
            <cfmailparam name="Importance" value="#importance#">
            <cfmailpart type="text/plain">#textContent#</cfmailpart>
            <cfmailpart type="text/html">#htmlContent#</cfmailpart>
        </cfmail>
    </cffunction>

</cfcomponent>

然后你可以通过以下方式调用它:

<cfset Mailer = new Path.To.Component()>
<cfset Mailer.sendEmail(
    to="foo@somewhere.com",
    from="bar@somewhere.com",,
    subject="An Email",
    importance="high",
    htmlContent="<p>Hello!</p>,
    textContent="Hello!"
)>

Mailer实例可以是单例(每个应用程序只需要一个实例),然后您可以执行诸如将配置设置注入其中的操作,而不是在实际CFC中进行环境检测。

答案 1 :(得分:2)

编辑:虽然这可以使用自定义标签使其工作,但John Whish使用cfc的解决方案更灵活。

您可能需要创建cf_emailpart自定义代码,原因与您创建cf_emailparam代码的原因相同。 cfemailparam必须包含在cfmail代码

<cf_email to="no@example.com" from="no@test.com" subject="This is only a test">
    <cf_emailparam name="Importance" value="high">
    <cf_emailpart type="text">Text</cf_emailpart>
    <cf_emailpart type="html">HTML</cf_emailpart>
</cf_email>

<强> cf_emailpart

几乎与cf_emailparam相同。最后一部分将标记与cf_email

相关联
<cfif CompareNoCase(thisTag.hasEndtag,"YES") EQ 0 AND CompareNoCase(thisTag.executionMode,"END") EQ 0 >
    <cfexit method="exittag" />
</cfif>

<cfassociate basetag="cf_email" datacollection="emailPart">

然后,您需要在cf_email自定义标记文件中,在输出cfmailparam标记的部分之后以及cfmail标记内添加此内容。

<cfif isDefined("thisTag.emailPart")>
    <cfloop array="#thisTag.emailPart#" index="attrCol">
        <cfmailpart attributecollection="#attrCol#" >
    </cfloop> 
 </cfif>

我没有测试过这段代码,但我认为这是你必须要去的方向。