我正在尝试在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。
答案 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 & "!"
);