2012-05-30 8 views
11

Enviamos correos electrónicos desde nuestra aplicación web ASP.NET MVC 3 Razor.¿Hay algún paquete de correo electrónico MVC que no requiera un contexto HTTP?

Actualmente estamos usando ActionMailer.NET.

He visto MvcMailer.

El problema con ambos es que necesitan un contexto Http para ejecutarse.

El problema es que quiero enviar correos electrónicos de manera asilómada. Ahora sé que se puede hacer de forma asíncrona el envío real (por ejemplo, la llamada SMTP), pero yo quiero todo el proceso de enviar un correo electrónico a ser asíncrono, por ejemplo:

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

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

    return RedirectToAction("Index"); 
} 

En el método "HacerAlgo", i consultar la base de datos otra vez, hacer otras cosas, etc. ... quiero que todo esto sea asíncrono, de ahí que toda la llamada esté envuelta en una tarea, a diferencia de simplemente hacer .SendAsync(). Espero que tenga sentido.

El ejemplo anterior es ActionMailer, y se rompe porque el contexto HTTP se ha ido en el subproceso generado.

¿Alguien sabe cómo puedo hacer que esto funcione o, alternativamente, otro paquete que no se basa en la existencia de un contexto HTTP?

No estoy seguro de por qué se requiere un contexto HTTP. No hay enrutamiento de solicitud aquí, simplemente analiza una vista que está en el sistema de archivos en HTML.

+0

También está el original RazorEngine https: // github.com/Antaris/RazorEngine :) (inicialmente desarrollado por Antaris y yo, pero Antaris lo ha asumido por completo) – Buildstarted

Respuesta

1

Usted puede pedir postal que utiliza el RazorViewEngine:

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(); 
    } 
} 

y en el interior ~/Views/Emails/Example.cshtml:

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

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

También asegúrese de haber leído y comprendido la dangers of implementing background tasks in ASP.NET applications antes de poner su aplicación en la producción.

+0

¿qué sugieres entonces? Un servicio de correo electrónico por separado sería genial, pero en realidad necesitaría ser una aplicación web MVC separada, para poder usar el motor de vista de afeitar, y mi dominio/repositorio, ¿no es así? Luego terminaría haciendo llamadas HTTP a ese "sitio web" para enviar los correos electrónicos. ¿Como lo harias? – RPM1984

+0

Puede usar el paquete RazorEngine en su Servicio de Windows que le permite renderizar vistas Razor fuera de las aplicaciones ASP.NET MVC. –

+0

y ¿qué ocurre si necesito acceder a la tabla de enrutamiento del sitio principal para generar enlaces a ella? ¿Tendré que abstraer de algún modo la tabla de enrutamiento en un conjunto común? – RPM1984

0

Si está utilizando .NET 4.5 (o el CTP asíncrono sea lo que sea) es posible que desee ver en async ActionMethods. Para ser sincero, no estoy seguro de cuáles son exactamente los requisitos (MVC 3/4) pero ese artículo debería ayudar.

Tampoco estoy seguro de por qué está tan preocupado por el tiempo empleado en la búsqueda de la base de datos, ¿realmente está haciendo tanto?

mejor solución que SendAsync: prefiero no utilizar SendAsync pero a send through an SMTP server con el método Send regular, como la de IIS que es lo que estoy usando (Nota: usted tiene que utilizar el IIS6 consola incluso si está utilizando IIS7 para administrar su IIS principal). Esto regresará al instante una vez que su máquina local haya puesto en cola el correo electrónico y no necesita esperar a que se envíe. Quizás lo más importante es que si hay un error al enviarlo, lo volveré a intentar por usted. Lo creas o no, a veces smtp.gmail.com no responde.

Cuestiones relacionadas