با سلام کاربران گرامی آموزش امروز بحث ارسال نامه های داینامیک میباشدکه اکثر شرکت های حرفه ای با ایمیل ها سرو کار دارند.  ارسال نامه های داینامیک به نام خود گیرنده مشکلی است که در اکثر سیستمهای پشتیبانی و CRM مشاهده میشود. به این صورت که محتوای نامه از قبل تعریف شده است و برای هر یک از گیرندگان یک نامه ارسال میشود. به طور مثال در متن این نامه ها همیشه گیرنده نامه با عناوینی همچون مشترک گرامی و یا کارفرمای محترم، خطاب میشوند. در این مقاله تکنیکی که از آن برای ارسال نامه ها با متنهای منحصر به فرد برای هر گیرنده استفاده میکنم را شرح میدهم.

نامه هایی که به کاربران قرار است ارسال شوند باید فرمت HTML داشته باشند که بتوانیم به آنها عکس و استایل هم اضافه کنیم. خوب همه میدانیم که نتیجه نهایی پروسس سرور بر روی View ها قالب HTML دارد و کلاس MailMessage در کتابخانه System.Net.Mail که از آن برای ارسال نامه های الکترونیک استفاده میکنیم متن نامه را به صورت یک رشته از نوع string دریافت میکند.

کاری که ما باید انجام دهیم تبدیل View به یک string میباشد. برای انجام این کار باید از موتور رندر razor جهت رندر View به string استفاده کنیم که این کار با استفاده از متد زیر که در controller قرار میگیرد امکانپذیر خواهد بود:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

using System.Globalization;
using System.IO;
using System.ServiceModel.Syndication;
using System.Net.Mail;
using System.Configuration;
using Pioneerware.WebUI.Models;

namespace Pioneerware.WebUI.Controllers
{
public class MainController : Controller
{
private string RenderRazorViewToString(string viewName, object model = null)
{
ViewData.Model = model;
using (var sw = new StringWriter())
{
ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);

viewResult.View.Render(viewContext, sw);
viewResult.ViewEngine.ReleaseView(ControllerContext, viewResult.View);
return sw.GetStringBuilder().ToString();
}
}
}
}

همانطور که ملاحظه میکنید این متد نام View به همراه model را دریافت میکند و خروجی string حاصل از رندر view را در اختیار ما قرار میدهد. لازم به ذکر است که برای استفاده از این متد و پاس دادن داده به View از Viewbag نیز میتوانید استفاده کنید.

حال فرض کنید که فرم تماس وب سایت ما به این ActionMehtod مقادیر نام، نام خانوادگی، پست الکترونیکی، شماره موبایل و متن پیغام را میفرستد و این ActionMethod با استفاده از متد بالا یک نامه در قالب HTML به مدیریت وب سایت ارسال میکند. پیاده سازی این متد به صورت زیر خواهد بود:

[HttpPost]
public JsonResult Messenger(string name, string mail, string cell, string content)
{
try
{
MailMessage message = new MailMessage();
message.From = new MailAddress(“noreply@psi-co.net”);
message.To.Add(new MailAddress(“hello@psi-co.net”));
message.Subject = “New message received from website”;
ViewBag.name = name;
ViewBag.cell = cell;
ViewBag.message = content;
ViewBag.mail = mail;

message.Body = this.RenderRazorViewToString(“message”);
message.IsBodyHtml = true;
SmtpClient client = new SmtpClient();
client.Send(message);
return Json(new { succeed = true });
}
catch (Exception e)
{
log.Error(“”, e);
return Json(new { succeed = false });
}
}

توجه داشته باشید که View باید در فولد Share قرار گرفته باشد. محتوای Message به صورت زیر میباشد:

<!DOCTYPE html>

<html>
<head>
<meta name=”viewport” content=”width=device-width” />
<title>New message received from website</title>
</head>
<body>
<div id=”wrapper”>
<h1>New message received from website</h1>
<h2>Sender info:</h2>
<table>
<tr>
<th>Name</th>
<td>@ViewBag.name</td>
</tr>

<tr>
<th>E-Mail</th>
<td>
<a href=”mailto:@(mail)”>@mail</a>
</td>
</tr>
<tr>
<th>Cell phone</th>
<td>@ViewBag.cell</td>
</tr>
</table>
<h2>Message body:</h2>
<p>@message</p>
</div>
</body>
<system.net>
<mailSettings>
<smtp from=”noreply@psi-co.net” deliveryMethod=”Network”>
<network host=”psi-co.net” enableSsl=”false” port=”25″ userName=”noreply@psi-co.net” password=”123456″ />
</smtp>
</mailSettings>
</system.net>

امیدوارم توانسته باشم که به دانش شما در زمینه MVC مطلبی افزوده باشم. و این مطلب موثر واقع شده باشد.