1

CFScriptCFCで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);

上記のコードを使用すると、3通のメールが届きます。各メールには、「こんにちはジョン。あなたの番号は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 Server2008R3でColdfusion9.0.1を使用しています。

4

4 に答える 4

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 に答える
1

クエリリストにメールを送信すると、1つのメールが大きなリストに送信されるだけだと確信しています。

したがって、1 つのメールで名前を変更することはできません。

自分がやろうとしていることをやりたい場合は、複数のメールを送信します。

クエリをループし、すべてのレコードに対して cfmail を実行すると、別のメールが生成されます。

于 2012-08-06T23:55:59.157 に答える
0

クエリの各レコードに 1 つのメールを送信しようとしている場合は、これをタグに記述します。このようにすればかなり簡単です

<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 に答える