为什么使用CFSCRIPT时CFMAIL忽略所有,但查询的第一行?(Why is CFMAIL ig

2019-09-20 21:41发布

我想在CFSCRIPT CFC使用CFMAIL。 我想CFMAIL通过查询迭代,并更改基于查询的内容价值。 它这样做就好了,只要查询对象只有1行。 如果有多个行(例如,5行),它将发送5封电子邮件,但每个电子邮件将包含从第一个查询行的值。 我已经尝试了一些不同的东西。 见下文:

查询的OBJ:

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封电子邮件,都用“约翰”和“12”。 倾倒mailerService.getQuery().CurrentRow结果在'1',每封电子邮件。 我使用Windows Server 2008 R3 ColdFusion风格9.0.1。

Answer 1:

在这种情况下,你需要做自己的循环,并调用.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()方法进入循环并引用适当的列中的电子邮件地址。



Answer 2:

我敢肯定,当你发送邮件到查询列表,它只是一个发送邮件的人的大名单。

因此,你不能在一个电子邮件更改名称。

如果你想要做什么你试图做的,您发送多个邮件。

遍历所有的查询,并为每个记录做CFMAIL,这将产生一个单独的邮件。



Answer 3:

如果你想给一个电子邮件发送给每个记录查询,我只想在标签中注明。 如果你这样做的很简单

<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>


Answer 4:

在我看到的这个标签基于版本的例子,他们通过名称来引用查询。 你有没有尝试过:

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


文章来源: Why is CFMAIL ignoring all but the first row of a query when using CFScript?