C#Webアプリケーションから電子メールを送信するように設計するにはどうすればよいでしょうか?

私はすぐにライブになる予定のWebアプリケーションに取り組んでいます。アプリケーションから電子メールを送信するための最良の方法を見つけようとしています。私はMailMessageクラスとSmtpClientクラスを使用してアプリケーションから電子メールを送信する方法を完全に理解していますが、私の質問は異なる角度からです。このプロジェクトの前の私の仕事で私の主な目的は、私の時間の前に開発されていた古いアプリケーションのサポートでした。これらのアプリケーションでは、電子メールを送信する必要があるときに、実際のメッセージにすべてのメッセージをハードコードし、すべてのHTMLタグをC#コードに直接埋め込みました。

私が取り組んでいるアプリケーションには、一種のスタイリングコンテナとして電子メールを送信するためのテンプレートがあり、異なるメッセージがテンプレートのメインコンテンツdivに埋め込まれます。私はこのアプリケーションでこれらのテンプレートをハードコーディングしないようにしたいので、私は自分のプロジェクトをレイアウトする最良の方法を見つけようとしています。私はt4テンプレートを使用して、アプリケーションに異なるt4を読み込み、String.Formatを指定されたパラメータで適用して、送信するメッセージに名前/電子メールを追加することを考えました。しかし、私はこれが最良の方法であるとは確信していません。

私の他のアイデアは、メッセージの種類ごとにクラスを定義することでしたが、これはメッセージを再びハードコーディングすることになりました。

私の質問は、これまでどのようにあなたがこれに近づいてきたかです。何がうまくいったのですか?私はオンラインで全部を見てきましたが、その中の唯一のコンテンツがメッセージを送信する方法であるか、または私は適切なGoogleのパワーワードを使用していません。

7
あなたはチャットコードに関してあなた自身でこれまでに何を試していますか?あなたはここにいる誰かが見て、おそらくあなたを助けることができるように持っていますか? .NETがSystem.Net.Mailを使用するオプションやSystem.Web.Mailを使用するWebアプリケーションを使用して多くのオプションを提供して以来、電子メールの送信を実際に探していることは難しい作業ではありません。あなたは、このサイトまたはチェックアウトcodeproject.com上で検索し、研究することができます素晴らしい例の多く
追加された 著者 MethodMan,
データベースにアクセスできますか?各タイプのメッセージ、受信者、件名、本文などをデータベースに格納し、その上に簡単な保守ルーチンを作成することができます。また、電子メール本文の中にさまざまなタグを入力して、他のテキストのプレースホルダ(ユーザーの名前など)として機能させることもできます。私は前にこれをやったことがあり、それは合理的にうまくいく。
追加された 著者 hawkke,
主にすべてのコードがちょうど私の頭の中にあります。私はそれをコーディングする時間を割く前にこれを行う最善の方法について考えてみたいです。私はすでにこれを数時間研究しています。私はそれを行う方法を手にする必要はありません、何をすべきかだけです。私がこれまで考えていたアイデアは私の質問ですが、私が言ったように、それが問題に近づく最善の方法であるかどうかはわかりません。
追加された 著者 tostringtheory,
アプリケーションにはデータベースがあり、これは私が実際にやっていたことの一つです。メッセージをデータベースに保存する必要があるかどうかわからなかったので、まずこれを行うことについては気をつけましたが、いつでもメッセージを更新できることは間違いありません。受信者は、現在データベースにも格納されています。入力をありがとう、私は間違いなく他の誰かがそれをうまくやったことを私が確かにそれを考慮する。私はまだ良い方法があるかどうかは不思議です。
追加された 著者 tostringtheory,

2 答え

私はこのようにします:

  • ViewModelとRazorテンプレートで通常の方法でコードを記述します
  • 電子メールを作成するには、 http://razorengine.codeplex.com/ を使用してテンプレートを解析する
  • スレッドで電子メールを送信する場合は、HtmlやUrlヘルパーを使用しないでください。この場合、HttpContextに依存しているためです。必要に応じてあなた自身のヘルパーを構築してください。

たとえば、アプリケーションにViewModel Car がどこかに表示されている場合、このViewModelを電子メール用のRazor Templateで@modelとして使用することもできます。

2
追加された
もちろん、ハードコーディングはありません。各電子メールには、1つのcshtmlファイルがあります。したがって、これをアプリケーションの電子メールプレビューとして使用することもできます。
追加された 著者 Marc,
そして、これがすでに構築されている MvcMailer を見ることができます。しかし、私はあなたが多分それを持つスレッドでメールを送ることができないと思う。
追加された 著者 Marc,
それは単にデータを格納する場所なので、私は決してデータベース内のアプリケーションロジックを実行しません。データベースを削除し、アプリケーションコードを失うことなく再開することができるはずです。さもなければ、あなたは連鎖しています。しかし、それはプログラマーが議論を始めるポイントです:)あなたはどこで休憩をしますか?アプリケーションコード全体をDBにロードして実行して、より簡単に更新できるようにしてください。どういう意味ですか? :)
追加された 著者 Marc,
Razorテンプレートを更新するだけの場合は、アプリケーションを再起動する必要はありません。
追加された 著者 Marc,
リンクありがとう。これは私が何とかして探していたものに確かに近いです。実際の別のファイルとしてテンプレートを持っていると仮定して正しいのでしょうか、ホームページに表示されているようにハードコーディングしていますか?
追加された 著者 tostringtheory,
うーん..これは、メッセージをプレビューできる明確なプラスです。私は真剣にこの機能の考えが好きです。
追加された 著者 tostringtheory,
私はこれを考慮しましたが、Webアプリケーション側ではなく、アプリケーションのサービス側から電子メールを送信するので、これを使用することには注意が必要でした。このサイトはWindows Azure上で実行されるため、送信を行うためにサービスとWebサイトの間の電子メールとユーザー情報の前後を最小限に抑えたいと考えています。これは、電子メールをデータベースに保存することがうまくいく理由の1つです。アプリケーションを更新するのは長いプロセスです。
追加された 著者 tostringtheory,
アプリケーションをすべて再デプロイしないか、またはAzureがcshtmlページのみが変更されたと判断するためにComparizonを実行しますか?入力をありがとう、私はまだ小学校レベルの仕事でプログラミングするのは初めてですが、私が学ぶことは、私はよくそれを学びたい、うまくいけば正しい方法です。それでは、あなたが言及したように、多くの場合、「正しい」方法が主観的になる可能性があります。
追加された 著者 tostringtheory,

私はこれを数回行う必要がありました。私は当初、Rick Strahlのブログ記事をベースにASP.Netテンプレートエンジンを使用しました。それはうまくいったけど、いつも何か問題があった。

私は、 NVelocity テンプレートエンジンを使用することに切り替えました。電子メールテンプレートの作成と管理多数の他のテンプレートエンジンがあります。次回は剃刀を深刻に見ている可能性があります エンジン

テンプレートに値をマージするコード:

private string Merge(ManualTypeEnum manualType, Object mergeValues)
{
    var body = "";
    var templateFile = string.Format("{0}MailTemplate.vm", manualType);
    var velocity = new VelocityEngine();
    var props = new ExtendedProperties();
    props.AddProperty("file.resource.loader.path", Config.EmailTemplatePath);
    velocity.Init(props);
    var template = velocity.GetTemplate(templateFile);
    var context = new VelocityContext();
    context.Put("Change", mergeValues);
    using (var writer = new StringWriter())
    {
        template.Merge(context, writer);
        body = writer.ToString();
    }
    return body;
}

マージする値は匿名オブジェクトとして渡され、リストなどを含むさまざまなタイプを含めることができます。

var emailBody = Merge(newDocument.ManualType, new
{
    ManualType = newDocument.ManualType.ToString(),
    Message = change.Message,
    NewTitle = newDocument.Title ?? "",
    NewVersion = newDocument.Version ?? "",
    Contact = From,
    Changes = change.ToList(),
});
0
追加された
それはすべてコンテキストに関するものです。上記のコードを使用するアプリは、私がそれを手に入れた時点で古くてクールなものでした。テンプレートを格納するためにデータベースを使用すると、送られる電子メールの量や複雑さが過度に高すぎるでしょう。テンプレートは単なる文字列であり、その文字列をファイルやデータベースに格納することができます。いずれの場合でもアプリケーションには意味があります。 Razorテンプレートを使用する利点の1つはVisual Studioのサポートです。したがって、構文の色付けなどが得られます。データベースに保存する場合は、変更するたびに抽出、変更、更新などの追加ステップが追加されます。
追加された 著者 David Clarke,
うーん..ファイルでこれを行うことができるように見えますが、Razorエンジンとデータベースを組み合わせて、データローから情報を取得し、それを変換することができます。懸念の分離はどうですか?これがあまりにも混じっていると思いますか?
追加された 著者 tostringtheory,
本当です。しかし、それをデータベースに格納することはおそらく私の状況では簡単になります。私はもちろん、自分のPCにファイルを持っていて、必要なときにコードを使ってdbを更新することができます。紺碧への変更を展開するのは永遠に必要です。そのような小さな変化に対してのみ再展開することには躊躇します。
追加された 著者 tostringtheory,