2011-12-19 3 views
6

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

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

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

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

+0

データベースにアクセスできますか?各タイプのメッセージ、受信者、件名、本文などをデータベースに格納し、その上に簡単な保守ルーチンを作成することができます。また、電子メール本文の中にさまざまなタグを入力して、他のテキストのプレースホルダ(ユーザーの名前など)として機能させることもできます。私は前にこれをやったことがあり、それは合理的にうまくいく。 – hawkke

+0

アプリケーションにはデータベースがありますが、これは私が実際にやっていたことの一つです。メッセージをデータベースに保存する必要があるかどうかわからなかったので、まずこれを行うことについては気をつけましたが、いつでもメッセージを更新できることは間違いありません。受信者も現在データベースに格納されています。入力をありがとう、私は間違いなく他の誰かがそれをうまくやったことを私が確かにそれを考慮する。私はまだ良い方法があるかどうかは不思議です。 – tostringtheory

+0

チャットコードに関して今まであなた自身で試したことがありますので、ここの行に誰かがあなたを見て、おそらくあなたを助けることができますか? .NETがSystem.Net.Mailを使用するオプションやSystem.Web.Mailを使用するWebアプリケーションを使用して多くのオプションを提供して以来、電子メールの送信を実際に探しているのは難しい作業ではありません。あなたはこのサイトまたは検索のcodeproject.comで偉大な例の多くを検索して研究することができます – MethodMan

答えて

2

私はそれをこのように実行しますに注意してくださいテンプレート

  • をロードして解析するhttp://razorengine.codeplex.com/を使用し、

    • コードも電子メールを作成することでのViewModelとカミソリテンプレート
    • との通常の方法をあなたがその場合に持っていないHttpContextに依存しているので、スレッドで電子メールを送信したい場合は、HtmlとUrlヘルパーを使用しないでください。必要に応じてあなた自身のヘルパーを構築してください。

    はたとえば、あなたがどこかに表示されているアプリケーションでのViewModel Carを持っている場合、あなたはまた、電子メール用カミソリテンプレートに@modelとして、このビューモデルを使用することができます。

  • +0

    リンクをありがとう。これは私が何とかして探していたものに確かに近いです。実際の別のファイルとしてテンプレートを持っていると仮定して正しいのでしょうか、ホームページに表示されるようにハードコーディングしていますか? – tostringtheory

    +0

    もちろん、ハードコーディングはありません。各電子メールには、1つのcshtmlファイルがあります。したがって、これをアプリケーションの電子メールプレビューとして使用することもできます。 – Marc

    +0

    Hmmm ..これは、メッセージをプレビューできる明確なプラスです。私は真剣にこの機能の考えが好きです。 – tostringtheory

    0

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

    私はNVelocityテンプレートエンジンを使用して、電子メールテンプレートを作成して維持する本当に簡単な方法を見つけました。多くの他のテンプレートエンジンがあります。次回は、Razorengineを深刻に見ている可能性があります。

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

    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

    Hmm ..ファイルでこれを行うことができるように見えますが、Razorエンジンとデータベースを組み合わせて、データローから情報を取得し、それを変換する方法があります。懸念の分離はどうですか?これがあまりにも混じっていると思いますか? – tostringtheory

    +0

    それはすべてコンテキストに関するものです。上記のコードを使用するアプリは、私がそれを手に入れた時点で古くてクールなものでした。テンプレートを格納するためにデータベースを使用すると、送信される電子メールの量や複雑さが過度に高くなっていました。テンプレートは単なる文字列であり、その文字列をファイルやデータベースに格納することができます。いずれの場合でもアプリケーションには意味があります。 Razorテンプレートを使用する利点の1つは、Visual Studioのサポートです。したがって、構文カラーリングなどが得られます。データベースに保存する場合は、変更するたびに抽出、変更、更新などの追加ステップが追加されます。 –

    +0

    非常に真です。しかし、それをデータベースに格納することはおそらく私の状況では簡単になります。私はもちろん、自分のPCにファイルを持っていて、必要なときにコードを使ってdbを更新することができます。紺碧への変更を展開するのは永遠に必要です。そのような小さな変化に対してのみ再展開することには躊躇します。 – tostringtheory

    関連する問題