Почему CFMAIL игнорирует все, кроме первой строки запроса, при использовании CFScript?

Я пытаюсь использовать CFmail в CFScript CFC. Я хочу, чтобы CFMail перебрал запрос и изменил значения в зависимости от содержимого запроса. Это прекрасно работает, если объект запроса имеет только 1 строку. Если он имеет несколько строк (например, 5 строк), он отправит 5 электронных писем, но каждое электронное письмо будет содержать значения из первой строки запроса. Я пробовал несколько разных вещей. Увидеть ниже:

Query 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" для каждого электронного письма. Я использую Coldfusion 9.0.1 на Windows Server 2008 R3.

4 ответа

Решение

В этом случае вам нужно сделать цикл самостоятельно и вызвать .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() метод в цикл и ссылка на соответствующий столбец для адреса электронной почты.

Я уверен, что когда вы отправляете письмо в список запросов, это просто отправка одного письма в большой список людей.

Таким образом, вы не можете изменить имя в одном письме.

Если вы хотите сделать то, что пытаетесь сделать, отправьте несколько писем.

зациклите запрос и сделайте cfmail для каждой записи, это сгенерирует отдельную почту.

Если вы пытаетесь отправить одно письмо на каждую запись в запросе, я просто напишу это в тегах. Довольно просто, если вы сделаете это таким образом

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

В примерах, которые я вижу для версии на основе тегов, они ссылаются на запрос по имени. Ты пытался:

WriteOutput(
 "Hello " & arguments.engagementQuery.Name & ". Your number is: " & arguments.engagementQuery.Number & "!"
); 
Другие вопросы по тегам