ASP.NET Core ve Razor View Engine ile Şablon E-Postalar
ASP.NET Core ve Razor View Engine ile Şablon E-Postalar
ASP.NET Core 7, Mart’ta Visual Studio 2017’nin sunumu ile birlikte yeni SDK ve Runtime sürümleri ile geliştiricilere duyuruldu. .NET Core’u ilk versiyonundan bu yana takip edenler bazı kütüphanelerin henüz uyarlanmadığını ve bu kütüphanelerin.NET Standard ile hedeflenen versiyon sürümlerinde destekleneceğini gözlemlemektedir.
.NET Standard 1.6 için henüz uyarlanmamış farklı tipteki kütüphaneler için ki burada örneğimizSMTP olacak; dinamik veriler ile ilgili mail şablonunun oluşturulup gönderimini sağlanmak üzerinden kullanımını örneklendireceğim.
Bu kapsamda .NET Core proje şablonu üzerinden .NET Full Framework destekli bir proje oluşturabiliriz. Böylelikle ilgili paket desteği uyarlandığında veya bağımlı bulunduğumuz kütüphanelereCoreFx tarafından uyarlama gerçekleştiğinde projemizi Cross-Platform bir yapıya kolaylıkla taşıyabiliriz.
3 proje oluşturarak başlıyorum:
Modellerimizi .NET Standard 1.6 ve .NET46 destekli ortak bir kütüphanede tutabiliriz (NetCore.Contracts). Böylelikle diğer projeler; ister .NET Core 1.1 ister .NET46 Full Framework olsun, bu ortak kütüphane ile tip – model veya arayüzler üzerinde çalışabilecek ve bu projeyi referans alabileceklerdir.
RegistrationViewModel bir kullanıcı kaydı tipini bize modelliyor olsun. Bu tip aracılığıyla arayüzden aldığımız bilgileri entegrasyon amaçlı kullandığımız .NET46 destekli NetCore.Integrations isimli proje üzerinde belirlediğimiz HTTP (localhost:port/api/mail/sendasync) adresine POST edeceğiz.
RAZOR TEMPLATING
Razor View Engine ile tipi belirttiğimiz;@model RegistrationViewModel
.cshtml uzantılı dosyaları çalışma zamanında ilgili modeli parametre geçerek dinamik html çıktılar üretebiliriz. .NET Core MVC nin tamamen arayüzlere dayalı uyarlamaları bizlere büyük kolaylık sağlamaktadır.
Öncelikle .cshtml uzantılı sabit bir şablonu nereden elde edeceğimize karar verelim. Ben burada EmbededResource yani bir kütüphane içerisinde derlenmiş bir kaynak olarak elde edeceğimizi varsayıyorum.
Proje yapısı aşağıdaki şekilde olacaktır:
ayrıca csproj dosyamızda;
<EmbeddedResourceInclude=”templates***.cshtml”Exclude=”bin**;obj**;packages**;@(EmbeddedResource)”/>
bölümünün eklenmiş olması gerekmektedir. Böylelikle projeyi derlediğimizde template dosyalarının assembly ile birlikte dağıtımını sağlamış olacağız.
Mail ayarları için appsettings.json dosyasını aşağıdaki şekilde güncelleyip MailSettings tipinin gerekli ayarları çalışma zamanında EnvironmentName’e göre kazanmasını sağlayabiliriz. MailTemplateFileProvider’ın uygulamamız ile olan bağlantısını Startup.cs dosyasında şu şekilde yapmamız gerekmektedir.
Böylelikle ASP.NET Core ile varsayılan olarak kullandığımız bağımlılık yönetimiDependency Injection kurgusunu tamamlamış oluruz. (Strongly Typed Configuration)
Ayarları doğru olarak tamamladığımızda NetCore.Integrations projesinde kullanacağımız Controller için constructor yapısı aşağıdaki şekilde çalışacaktır.
private readonly MailProvider _mailProvider; public MailController(MailProvider mailProvider) { _mailProvider = mailProvider; }
İstemci tarafından çağrılacak ve mail gönderme görevini yerine getirecek fonksiyon ise;
[HttpPost(nameof(SendAsync))] public async Task SendAsync([FromBody]RegistrationEmailViewModel message) { var messageBody = await _mailProvider.RenderMailViewAsync(ControllerContext, MailTemplate.RegistrationComplete, message); await _mailProvider.SendAsync(message.To, message.Subject, messageBody);
formunda olacaktır. Böylelikle istediğimiz model ve şablonlar ile ilişkileri kurarak farklı içeriklerde e-postalar oluşturup gönderebiliriz.
Proje kaynak kodlarınaGithub üzerinden erişebilirsiniz. Ayrıca .NET Core için geliştirilmiş Proxy ve WebSockets uyarlamalarınıNetCoreStack – Github adresinden inceleyebilir, Proxy ile şablon maillerin yönetimini deneyebilirsiniz.