2012-05-30 11 views
11

私たちはASP.NET MVC 3 Razor Web Applicationから電子メールを送信します。HTTPコンテキストを必要としないMVC電子メールパッケージはありますか?

現在、私たちはActionMailer.NETを使用しています。

私はMvcMailerを見ました。

両方の問題は、実行するためにHttpコンテキストが必要であることです。

この問題は、私がメールを非同期で送信したいということです。今、私はあなたが非同期的に実際の送信(例えばSMTPコール)を行うことができます知っているが、私は例えば、非同期に電子メールを送信するプロセス全体をしたい:「doSomethingの」方法で

public ActionResult DoSomething(Something something) 
{ 
    _db.Save(something); 

    Task.Factory.StartNew(() => { 
     new MailController().DoSomething().Send(something); 
    }); 

    return RedirectToAction("Index"); 
} 

、私は問い合わせますデータベースをもう一度やり直したり、他のことをやったりします。私はこれをすべて非同期にすることを望んでいます。したがって、呼び出し全体がタスクにラップされています。逆にちょうど.SendAsync()を実行します。希望は意味をなさない。

上記の例はActionMailerで、HTTPコンテキストが生成されたスレッドでなくなったために破損しています。

私はこれを動作させる方法、あるいはHTTPコンテキストの存在に依存しない別のパッケージを入手する方法を知っていますか?

なぜHTTPコンテキストが必要なのか分かりません。ファイルシステム上のビューをHTMLに解析するだけで、リクエストのルーティングはありません。

+0

オリジナルのRazorEngine https:// githubもあります。com/Antaris/RazorEngine :)(最初はAntarisと自分で開発しましたが、Antarisは完全にそれを取りました) – Buildstarted

答えて

1

あなたはRazorViewEngine使用するpostalをチェックアウトすることがあります。また、あなたが読んで、本番でアプリケーションを入れる前dangers of implementing background tasks in ASP.NET applicationsを理解していることを確認してください

To: @ViewBag.To 
From: [email protected] 
Subject: Important Message 

Hello, 
You wanted important web links right? 
Check out this: @ViewBag.FunnyLink 

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     Task.Factory.StartNew(() => 
     { 
      Thread.Sleep(5000); 
      dynamic email = new Email("Example"); 
      email.To = "[email protected]"; 
      email.FunnyLink = "some funny link"; 
      email.Send(); 
     }); 

     return View(); 
    } 
} 

~/Views/Emails/Example.cshtml内部を。

+0

あなたは何を提案しますか?別の電子メールサービスは素晴らしいですが、実際には、剃刀ビューエンジンとドメイン/リポジトリを利用するために、別個のMVC Webアプリケーションである必要があります。私は、メールを送信するためにその "ウェブサイト"へのHTTPコールをやり終えるだけです。どうしますか? – RPM1984

+0

WindowsサービスでRazorEngineパッケージを使用すると、ASP.NET MVCアプリケーションの外でRazorビューをレンダリングできます。 –

+0

と私はメインサイトのルーティングテーブルにアクセスする必要がある場合、それへのリンクを生成するには?私は何とかルーティングテーブルを共通のアセンブリに抽象化しなければなりませんか? – RPM1984

1

ActionMailer.NETをMVC外でスタンドアロンで使用できるようになりました。

詳細はあなたが.NET 4.5(またはそれが何であれ非同期CTP)を使用している場合は、async ActionMethodsに見てみたいことがあり、ここで

http://geeksharp.com/2011/07/06/actionmailer-0-6-released/

+0

注:Partialsのようないくつかのかみそりの機能は動作しません - 私にとっては良いことではありません:-( –

0

覆われています。率直に言って、要件が何であるか正確には分からない(MVC 3/4)が、その記事は助けになるはずだ。

データベース検索に要する時間が心配な理由はよく分かりません。実際にそれほどのことをしていますか? SendAsyncより

よりよい解決策:あなたはIIS6を使用する必要があります。私は、そのような私が(注を使用しているものですIISの一つとして、通常のSendメソッドではなくsend through an SMTP serverにSendAsyncを使用しないことを好む メインのIISを管理するためにIIS7を使用している場合でもコンソール)。ローカルマシンが電子メールをキューに入れた後すぐにこれが返され、あなたがそれが送信されるのを待つ必要はありません。おそらくもっと重要なのは、エラーが送信された場合、それはあなたのために再試行を続けます。信じられないかもしれません - 時々smtp.gmail.comは応答しません。

関連する問題