0

我正在为 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 的上下文验证错误。

我正在提出我的想法,但我找不到任何帮助文档。任何帮助或起点将不胜感激。

提前致谢。

4

2 回答 2

4

它必须是自定义标签吗?在我看来,这会更简单地包含在 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 中进行环境检测。

于 2016-02-18T16:14:27.647 回答
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>

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

于 2016-02-18T15:43:34.863 回答