我正在为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的上下文验证错误。
我正在思考我的想法,但我没有找到任何帮助文档。任何帮助或起点都是最受欢迎的。
提前致谢。
答案 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>
我没有测试过这段代码,但我认为这是你必须要去的方向。