web-dev-qa-db-ja.com

Razor Viewページをメールテンプレートとして

Razor Syntaxからメールテンプレートを設計しました。このテンプレートをC#コードとSMTPプロトコルを使用して電子メールとして送信すると、裸のRazorとHTMLマークアップが電子メール本文として取得されます。このアプローチは間違っていますか? Razor Pagesはメールテンプレートとして許可されていますか?

こちらが私のページです

@inherits ViewPage
@{
Layout = "_Layout";
ViewBag.Title = "";
}
<div class="container w-420 p-15 bg-white mt-40">
<div style="border-top:3px solid #22BCE5">&nbsp;</div>
<span style="font-family:Arial;font-size:10pt">
    Hello <b>{UserName}</b>,<br /><br />
    Thanks for Registering to XYZ Portal<br /><br />
    <a style="color:#22BCE5" href="{Url}">Click to Confirm Email</a><br />

    <br /><br />
    Thanks<br />
    Admin (XYZ)
</span>

更新..

 using (StreamReader reader = new StreamReader(HttpContext.Current.Server.MapPath("~/ContentPages/EmailConfTemplate.cshtml")))
  {
     body = reader.ReadToEnd();
     //Replace UserName and Other variables available in body Stream
     body = body.Replace("{UserName}", FirstName);

  }

後でSMTPコードを..

  MailMessage message = new MailMessage(
    ApplicationWideData.fromEmailId, // From field
    ToEmailId, // Recipient field
    "Click On HyperLink To Verify Email Id", // Subject of the email message
    body
   );
15
Lara

電子メールメッセージは、プレーンテキストとHTMLの2つの形式のみを理解します。 Razorはどちらでもないので、生成されたHTMLを返すように、何らかのエンジンで処理する必要があります。

ASP.NET MVCでRazorを舞台裏で使用すると、まさにそれが起こります。 Razorファイルは内部C#クラスにコンパイルされ、実行されます。実行の結果は、クライアントに送信されるHTMLの文字列コンテンツです。

問題は、ブラウザに送信するのではなく、HTMLを文字列として戻すためだけに、その処理を実行し、実行する必要があることです。その後、HTML文字列を使用して、電子メールとして送信するなど、必要な処理を実行できます。

この機能を含むパッケージがいくつかあり、私は Westwind.RazorHosting を正常に使用しましたが、同様の結果で RazorEngine を使用することもできます。スタンドアロンの非WebアプリケーションにはRazorHostingを、WebアプリケーションにはRazorEngineを好みます

これが私のコードの(サニタイズされた)バージョンです-Westwind.RazorHostingを使用して、厳密に型指定されたビューを使用して、Windowsサービスからカミソリ形式の電子メールを送信しています。

RazorFolderHostContainer Host = = new RazorFolderHostContainer();
Host.ReferencedAssemblies.Add("NotificationsManagement.dll");
Host.TemplatePath = templatePath;
Host.Start();
string output = Host.RenderTemplate(template.Filename, model);

MailMessage mm = new MailMessage { Subject = subject, IsBodyHtml = true };
mm.Body = output;
mm.To.Add(email);

var smtpClient = new SmtpClient();
await smtpClient.SendMailAsync(mm);
19
SWeko

MVC Mailerをご覧になりましたか?

GitHubから入手できる無料のパッケージです( https://github.com/smsohan/MvcMailer

それのためのステップバイステップガイドもあります https://github.com/smsohan/MvcMailer/wiki/MvcMailer-Step-by-Step-Guide

Nugetにもあります。 https://www.nuget.org/packages/MvcMailer

基本的に、剃刀ビューをHTMLに解析します。

4

NuGetで利用可能なRazorEngine( https://razorengine.codeplex.com/ )などのカミソリプロセッサを確認してください。かみそりを処理して出力を作成します。これは、電子メールの本文として使用します。

1
Chris Disley

RazorビューをASP.NET MVCアプリケーションの文字列にレンダリングするための特別なライブラリは必要ありません。

MVC 5で行う方法は次のとおりです。

public static class ViewToStringRenderer
{
    public static string RenderViewToString<TModel>(ControllerContext controllerContext, string viewName, TModel model)
    {
        ViewEngineResult viewEngineResult = ViewEngines.Engines.FindView(controllerContext, viewName, null);
        if (viewEngineResult.View == null)
        {
            throw new Exception("Could not find the View file. Searched locations:\r\n" + viewEngineResult.SearchedLocations);
        }
        else
        {
            IView view = viewEngineResult.View;

            using (var stringWriter = new StringWriter())
            {
                var viewContext = new ViewContext(controllerContext, view, new ViewDataDictionary<TModel>(model), new TempDataDictionary(), stringWriter);
                view.Render(viewContext, stringWriter);

                return stringWriter.ToString();
            }
        }
    }
}

次に、コントローラーから

ViewToStringRenderer.RenderViewToString(this.ControllerContext, "~/Views/Emails/MyEmailTemplate.cshtml", model);

メールの内容を取得したら、MailMessageSmtpClientを使用して簡単にメールを送信できます。

1
Bassem

Mailzory プロジェクトは、Razorテンプレートを含む電子メールを送信するための貴重で便利な選択肢です。

// template path
var viewPath = Path.Combine("Views/Emails", "hello.cshtml");
// read the content of template and pass it to the Email constructor
var template = File.ReadAllText(viewPath);

var email = new Email(template);

// set ViewBag properties
email.ViewBag.Name = "Johnny";
email.ViewBag.Content = "Mailzory Is Funny";

// send email
var task = email.SendAsync("[email protected]", "subject");
task.Wait()

このプロジェクトはGithubでホストされています。また、Mailzoryで利用可能な nugetパッケージ があります。

0
Ehsan Mirsaeedi