1

我正在尝试在 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

CF 脚本:

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

4 回答 4

1

我敢肯定,当您向查询列表发送邮件时,它只是将一封邮件发送给一大群人。

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

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

循环查询并对每条记录执行 cfmail,这将生成单独的邮件。

于 2012-08-06T23:55:59.157 回答
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()方法移动到循环中并引用电子邮件地址的正确列即可。

于 2012-08-07T13:15:29.387 回答
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>
于 2012-08-07T14:37:42.420 回答
-2

在我看到的基于标签的版本的示例中,它们按名称引用查询。你有没有尝试过:

WriteOutput(
 "Hello " & arguments.engagementQuery.Name & ". Your number is: " & arguments.engagementQuery.Number & "!"
); 
于 2012-08-06T22:29:24.807 回答