为什么CFMAIL在使用CFScript时会忽略查询的第一行以外的所有行?

时间:2012-08-06 21:27:56

标签: coldfusion coldfusion-9 cfmail

我正在尝试在CFScript CFC中使用CFmail。我希望CFMail迭代查询,并根据查询内容更改值。只要查询对象只有1行,它就可以了。如果它有多行(例如5行),它将发送5封电子邮件,但每封电子邮件将包含第一个查询行的值。我尝试了一些不同的东西。见下文:

查询对象:

Name    |     Email     |   Number
----------------------------------
John    |  john@foo.com |     12
Bill    |  bill@bar.com |     42
Ann     |  ann@bat.com  |     100

CFSCRIPT:

var mailerService = new mail();

mailerService.setQuery(nameEmailNumberQuery);
mailerService.setTo('eterps@sendtomefortesting.com');
mailerService.setFrom( 'noReply@example.com' );
mailerService.setSubject('Hi');
mailerService.setFailto('fail@foo.com');
mailerService.setType('html');
mailerService.setSpoolenable(true);

    savecontent variable="mailBody"{ 
    WriteOutput(
        "Hello " & Name & ". Your number is: " & Number & "!"
    );          
}   

mailerService.send(body=mailBody & tmpVariable);

使用上面的代码,我收到三封电子邮件。每封电子邮件都写着“你好约翰。你的号码是:12!”

我也试过了:

WriteOutput(
    "Hello " 
     & mailerService.getQuery().Name 
     & ". Your number is: " 
     & mailerService.getQuery().Number 
     & "!"
);

WriteOutput(
    "Hello " 
    & mailerService.getQuery().Name[mailerService.getQuery.CurrentRow] 
    & ". Your number is: " 
    & mailerService.getQuery().Number[mailerService.getQuery.CurrentRow] 
    & "!"
);
编辑:我尝试了几件事(一个是@invertedSpear建议的)

使用电子邮件正文中的查询文字:

WriteOutput(
    "Hello " 
    & nameEmailNumberQuery.Name 
    & ". Your number is: " 
    & nameEmailNumberQuery.Number
    & "!"
);

尝试使用增量计数器:

var counter = 1;
...
WriteOutput(
    "Hello " 
    & mailerService.getQuery().Name[counter] 
    & ". Your number is: " 
    & mailerService.getQuery().Number[counter]
    & "!" & evaluate('counter = counter++')
);

每次都有相同的结果--3封电子邮件,全部带有“John”和“12”。转储mailerService.getQuery().CurrentRow会为每封电子邮件生成“1”。我在Windows Server 2008 R3上使用Coldfusion 9.0.1。

4 个答案:

答案 0 :(得分:1)

我确信当您将邮件发送到查询列表时,它只会将一封邮件发送给大量人员。

因此,您无法在一封电子邮件中更改名称。

如果你想做你想做的事情,你会发送多封邮件。

遍历查询并为每条记录执行cfmail,这将生成一个单独的邮件。

答案 1 :(得分:0)

在这种情况下,您需要自己进行循环,并为循环中的每个项调用.send()方法。 MailService不会为您执行循环。所以你需要这样做:

var mailerService = new mail();

mailerService.setTo('eterps@sendtomefortesting.com');
mailerService.setFrom( 'noReply@example.com' );
mailerService.setSubject('Hi');
mailerService.setFailto('fail@foo.com');
mailerService.setType('html');
mailerService.setSpoolenable(true);

for (x = 1; x <= nameEmailNumberQuery.RecordCount; x=x+1) { 
    savecontent variable="mailBody"{ 
        WriteOutput(
            "Hello " & nameEmailNumberQuery.Name[x] & ". Your number is: " & nameEmailNumberQuery.Number[x] & "!"
        );          
    } 
    mailerService.send(body=mailBody & tmpVariable);
}

这将允许您配置一次基本电子邮件属性,然后为该行中的每个项目发送单独的电子邮件。如果每封电子邮件都应转到唯一的电子邮件地址,只需将setTo()方法移至循环中,并引用电子邮件地址的正确列。

答案 2 :(得分:0)

如果您尝试向查询中的每条记录发送一封电子邮件,我只会将其写入标签中。如果你那样做很简单

<cfmail query="nameEmailNumberQuery" 
  to="#nameEmailNumberQuery.Email#" from="noReply@example.com" 
  failto="fail@foo.com" subject="Hi" type="html">

  Hello #nameEmailNumberQuery.Name#. Your number is: #nameEmailNumberQuery.Number#!
</cfmail>

答案 3 :(得分:-2)

在我看到的基于标签的版本的示例中,他们按名称引用查询。你试过了吗?

WriteOutput(
 "Hello " & arguments.engagementQuery.Name & ". Your number is: " & arguments.engagementQuery.Number & "!"
);