【问题标题】:coldfusion cfmail not accepting to =Coldfusion cfmail不接受=
【发布时间】:2019-08-23 03:31:18
【问题描述】:

我正在设置一组电子邮件,并从 MySql 表中提取信息开始

<cfoutput>
<cfset headls ='PersonFn,PersonLn,PersonEmail1'>
<cfquery name = "sord" datasource = "whatever">
  select distinct PersonID,#headls# from PersonRepDb        
</cfquery>
</cfoutput>

这会产生正确的输出。然后,我遍历查询结果,向每个人发送一封电子邮件。

  <cfset sordlen = sord.recordcount>
  <cfloop from = "1" to = "#sordlen#" index = 'j'> 
  <cfmail 
          from     = "#session.user#"  
          to       = "#sord['PersonEmail1'][j]#"          
          password = "#session.password#"
          username = "#session.user#"             
          server   = "localhost"                            
          replyto  = "#txt['replyto']#"
          subject  = "#txt['repsubject']#"               
          type     = "html"   >     

     ...stuff
 </cfmail>
 </cfloop>

当我尝试运行此程序时,我收到一条错误消息:“必须定义以下属性之一 [to, cc, bcc]”。显然“to”在那里,如果我用特定的电子邮件替换变量,如“joan@gmail.com”,错误消息就会消失。所以显然'to'之后的变量没有被解码。

我尝试将变量 sord['PersonEmail1'][j] 拆分为 @ 之前和之后的部分

<cfset preml = GetToken("#sord['PersonEmail1'][j]#",1,'@')>
<cfset posml = GetToken("#sord['PersonEmail1'][j]#",2,'@')>

然后将其设置为

 to = "#preml#@#posml#" 

但这并没有帮助。

谁能告诉我如何解决这个问题?

【问题讨论】:

  • 什么版本的CF?
  • 你需要使用动态列名吗?任何时候你有一个动态的 SQL 语句,你都有注入的风险。如果您可能需要多个列,最好选择所有需要的列并稍后过滤它们。
  • 您的代码似乎没有任何问题。您的其他变量是否返回了您的预期?此外,您不需要cfloop,您可以指定query="sord" 属性,它会为您逐步检查查询结果。然后你就用.....to=sord.PersonEmail1.....
  • 我更喜欢 cfoutput query = 'sord' ,但输出标签似乎会导致 cfmail 标签出现问题。你知道我可以将它与 cfmail 标签一起使用吗?我有多个人,每个人都必须收到他/她自己的 cfmail 标签,因为电子邮件具有动态内容。你是对的,我的变量没有返回我的想法。现在似乎一切正常。
  • 那么当错误发生时#sord['PersonEmail1'][j]#的实际值是多少呢?显然要清理名称和域。

标签: coldfusion cfmail


【解决方案1】:

这应该是您需要做的所有事情。如果您尝试使数据库中的列列表动态化,则可能不需要。只需在发送前验证电子邮件列的内容是有效的电子邮件格式。

<cfquery name="sord" datasource="whatever">
    select distinct 
        PersonID,
        PersonFn,
        PersonLn,
        PersonEmail1
    from 
        PersonRepDb        
</cfquery>

<cfloop query="sord">
    <cfif isValid("email", sord.PersonEmail1)>
        <cfmail 
            from     = "#session.user#"
            to       = "#sord.PersonEmail1#"
            password = "#session.password#"
            username = "#session.user#"
            server   = "localhost"
            replyto  = "#txt['replyto']#"
            subject  = "#txt['repsubject']#"
            type     = "html">

        ...stuff
    </cfmail>
</cfloop>

【讨论】:

  • 围绕 cfmail 的查询循环而不是使用查询属性有什么好处?查询属性不会与邮件服务器建立一个连接,然后批量假脱机电子邮件吗?不确定。
  • 另外,isValid() 可能会变得不稳定,并且会错误地验证某些地址。特别是在旧版本中。不确定这是哪个版本。尽管它可能会在大多数系统中达到绝大多数所需的地址。
  • 在查询中添加where clause 以便它只返回有效的电子邮件地址将允许您使用 cfmail 标记的查询属性。具体取决于尚未确定的 RDBMS。
  • @DanBracuk 我会 100% 同意这一点,并且我认为您不应该在代码中过滤查询结果;它应该在查询本身中完成。唯一的例外是,如果您需要在多个位置使用该基本查询结果来处理代码中的多个内容。然后,它仍然取决于。 :-)
  • Dan,我来看看 cfmail 标签的查询属性。了解这些东西很有帮助。
猜你喜欢
  • 2012-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-30
  • 1970-01-01
  • 2022-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多