1

メールの本文を文字列としてデータベースに保存しています。次のようになります。

これは、さまざまな変数を含む電子メールの本文です。親愛なる#name#、<br/>詳細については#representativeName#にお問い合わせください。

ストアドプロシージャを使用してデータベースからこのフィールドを取得し、ColdFusion側で評価して、「#name#」の代わりにname変数の値を挿入するようにします。

私はevaluateを使ってみましたが、それは変数名しかない場合にのみ機能するようです。他のテキストが原因でエラーがスローされます。

(プレースホルダーとこのような検索/置換を使用することはできません-Coldfusion文字列内の変数を解決します。これをデータベースに保存することの全体的なポイントは、文字列の構築に使用される変数が動的であるということです。名前フィールドを「name」と呼ぶことができ、別の場合は「firstName」などと呼ぶことができます。)

4

5 に答える 5

2

各#variableName#参照をループして、評価されたバージョンに置き換えます。

正規表現はそれらすべてを見つけて、ループしてそれらすべてを調べ、それらを1つずつ評価することができます。

于 2011-11-09T10:03:02.520 に答える
1

それをファイルに書き込んでCFINCLUDEする必要があります。これにはコンパイルのオーバーヘッドが発生しますが、それは避けられません。

コードをファイルシステムに保存して、DB内のどこにあるかへの参照を保存することはできませんか?そうすれば、使用するたびにではなく、変更されたときにのみ再コンパイルされますか?

<!--- pseudo code --->
<cfquery name="q">
    SELECT fileContent // [etc]
</cfquery>
<cfset fileWrite(expandPath("/path/to/file/to/write/code.cfm"), q.fileContent)>
<cfinclude template="/path/to/file/to/write/code.cfm">
<cfset fileDelete(expandPath("/path/to/file/to/write/code.cfm"))>

これが基本的な考え方です。コードを取得し、コードを記述し、コードを含め、コードを削除します。ただし、作成されるファイルが他のファイルと衝突しないようにする必要があります(他の人の提案に従って、ファイル名などとしてUUIDを使用します)。

また、これを負荷テストする必要があります。私はそれが非常にうまくいくとは思えません。他の人は仮想ファイルシステムの使用を提案しましたが、そこに多くの利益があるかどうかはわかりません。実際のファイル操作ではなく、コンパイルプロセスに時間がかかります。しかし、調査する価値があります。

于 2011-11-09T09:34:38.780 に答える
0

ColdFusion 9またはRailoを使用していますか?はいの場合、メモリ内ファイルへの書き込みとインクルードは迅速で簡単な解決策になる可能性があります。CreateUUID()衝突を避けるために、のようなファイル名を生成するだけです。

于 2011-11-09T10:02:32.723 に答える
0

したがって、基本的に、答えを調べて読んだ後、これらは私の選択肢のようです。

  1. 変数ごとにテーブルに個別のフィールドを用意し、それらを個別に評価します。たとえば、nameVariable、reprNameVariableの場合、次のようなコードで本体を作成できます。

    This is an email body containing lots of different variables. Dear #evaluate(nameVariable)#, <br/> Please contact #evaluate(reprNameVariable)# for further details.

  2. すべてのテキストと該当するフィールド名を含む「emailBody」フィールドを用意し、それを一時ファイルに書き込んでcfincludeします。(アダムキャメロンによって提案されたように、そして私はそれがセルギイが得ているものだと思います)

  3. 「emailBody」フィールドを用意し、そのフィールドをループしてすべてのColdFusion変数を見つけ、それらを「評価済み」バージョンに置き換えるコードを記述します。(デールフレイザーによって提案されたように)

  4. レポートタイプごとに1つずつ、メール本文を含む小さなテンプレートファイルを用意し、含めるテンプレートを示すフィールド「emailBodyTemplate」を用意します。(アダムキャメロンによって提案されたように)

今、私はどちらを使用するかを決定する必要があります:)私がそうするとき、私はその方法を提案した人の答えを受け入れます(それが提案されなかった場合を除いて、私はおそらくこれを受け入れるでしょう、または誰かがもっと理にかなっている別の方法を思い付く)

于 2011-11-09T10:38:22.120 に答える
0

あなたがこれを投稿してからしばらく経ちましたが、それはまさに私がしていることです。他の何かを探しているときにあなたの質問を見つけました。

メールをデータベースに書き込むときに、変数の独自の単純な構文を作成しただけです。

Hello ~FirstName~ ~LastName~,

次に、送信するcfmファイルで、データベースから電子メールテキストを取得し、変数に保存します。

<cfset EmailBody = mydatabasequery.HTMLBody>

次に、(RecipientListと呼ばれる別のクエリから)変数を使用して独自の構文をすばやく削除します。

<cfset EmailBody = ReplaceNoCase(EmailBody, "~FirstName~", "#RecipientList.First#", "ALL")>
<cfset EmailBody = ReplaceNoCase(EmailBody, "~LastName~", "#RecipientList.Last#", "ALL")>

次に、メールを送信します。

<cfmail ....>#EmailBody#</cfmail>

なんとかこれを見ていただければ幸いです。電子メールメッセージの作成を管理している場合(これはあなたが行っていると思われます)、これはうまくいくはずです。

ラッセル

于 2012-01-04T22:39:40.943 に答える