Почему 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 & "!"
);