web-dev-qa-db-ja.com

メールテンプレートc#でメールを送信する方法

顧客の詳細と注文の詳細を記載したメールを顧客に送信する必要があるとします。 htmlファイルにテンプレートhtmlデータがあります。顧客データがあり、注文の詳細も同じhtmlテンプレートファイルにあります。私のhtmlは次のように見えます

<html>
<body>
Hi {FirstName} {LastName},

Here are your orders: 
{foreach Orders}
    Order ID {OrderID} Quantity : {Qty} <strong>{Price}</strong>. 
{end}

</body>
</html>

ここで、{}で囲まれたすべてのサンプルキーワードを実際の値で埋め、さらに注文を反復して埋めたいと考えています。

私はグーグルを検索し、Microsoftがメール本文を動的に生成できるMailDefinitionというクラスを提供していることを発見しました。私もサンプルコードを手に入れました

MailDefinition md = new MailDefinition();
md.From = "[email protected]";
md.IsBodyHtml = true;
md.Subject = "Test of MailDefinition";

ListDictionary replacements = new ListDictionary();
replacements.Add("<%Name%>", "Martin");
replacements.Add("<%Country%>", "Denmark");

string body = "
Hello <%Name%> You're from <%Country%>.";


MailMessage msg = md.CreateMailMessage("[email protected]", replacements, body, new    System.Web.UI.Control());

上記のコードにより、疑似値を実際の値に置き換えることができますが、注文の詳細をどのように繰り返して注文データを入力するのかわかりません。

そのため、MailDefinitionクラスを使用できる場合は、ループで反復して注文の詳細の本文を生成する方法をコードで教えてください。

23
Thomas

MailDefinitionの代替として、RazorEngine https://github.com/Antaris/RazorEngine をご覧ください。

RazorEngineは、ASP.NET MVC3とWebページの両方で使用される、Microsoftの新しいRazor解析エンジンを中心に構築された簡易テンプレートフレームワークです。 RazorEngineは、解析エンジンを中心に構築されたラッパーと追加サービスを提供し、解析技術を他のプロジェクトタイプで使用できるようにします

ASP.NET MVCの外でカミソリテンプレートを使用して、次のようなものを記述できます(not testing):

string template =
@"<html>
<body>
Hi @Model.FirstName @Model.LastName,

Here are your orders: 
@foreach(var order in Model.Orders) {
    Order ID @order.Id Quantity : @order.Qty <strong>@order.Price</strong>. 
}

</body>
</html>";

var model = new OrderModel {
    FirstName = "Martin",
    LastName = "Whatever",
    Orders = new [] {
        new Order { Id = 1, Qty = 5, Price = 29.99 },
        new Order { Id = 2, Qty = 1, Price = 9.99 }
    }
};

string mailBody = Razor.Parse(template, model);
44
David Tischler

このような「複雑な」ロジックをデフォルトの置換要素で実行することはできません(プレースホルダー処理は、名前や値などの単純な変数にのみ使用されるように作られています)。

あなた自身で構文解析を行う必要があります。複雑さ(ループを伴うループなど)によっては、これには少し注意が必要です。

あなたがそのようなことを望んでいないか、必要としないなら、それはもっと簡単です。例えば。正規表現\{foreach (.*?)\}(.*?)\{end\}を使用してこのようなループを見つけ、必要に応じてコンテンツ/一致したグループを解析します。その部分が完了したら、他の値を置き換えるか、デフォルトの置換機能を使用できます。

このアプローチの欠点は、各受信者のメールを再作成する必要があるということです(つまり、MailDefinitionを使用して大量のメールを送信することはできません)。

1
Mario