如何使用 Blazor 和 NetCore 5 在电子邮件中将 razor 组件作为正文发送?

Posted

技术标签:

【中文标题】如何使用 Blazor 和 NetCore 5 在电子邮件中将 razor 组件作为正文发送?【英文标题】:How to send a razor component as body in an email using Blazor and NetCore 5? 【发布时间】:2021-09-30 03:48:25 【问题描述】:

如何使用 Blazor 服务器端和 NetCore 5 在电子邮件正文中发送 razor 组件? 在 MVC 中,我总是使用 RenderPartialViewToString(),但我不知道如何在 Blazor 中使用。

注意:问题不在于如何使用 Blazor 发送电子邮件,而是如何在电子邮件正文中包含剃刀页面。

// This is the code to send email. Works fine.
MimeMessage message = new MimeMessage();
MailboxAddress from = new MailboxAddress(model.FromName, model.FromAddress); message.From.Add(from);
MailboxAddress to = new MailboxAddress(model.ToName, model.ToAddress); message.To.Add(to);
message.Subject = model.Subject;

// Add email body and file attachments
BodyBuilder bodyBuilder = new BodyBuilder();
bodyBuilder.htmlBody = model.Body;
//bodyBuilder.TextBody = "Hello World!";
message.Body = bodyBuilder.ToMessageBody();

//Connect and authenticate with the SMTP server
using (SmtpClient smtpClient = new SmtpClient())

   await InvokeAsync(() =>  ShowSpinner = true; StateHasChanged(); );
   await smtpClient.ConnectAsync(model.SmtpServer, model.Port, true);
   await smtpClient.AuthenticateAsync(model.Username, model.Password);
   // Send email message
   await smtpClient.SendAsync(message);
   await InvokeAsync(() =>  ShowSpinner = false; SuccessAlertMsg = "The email has been sent!"; StateHasChanged(); );
   await smtpClient.DisconnectAsync(true);

【问题讨论】:

【参考方案1】:

看来您实际上只是在问如何获取 html,而不是如何构建电子邮件,对吗?我认为 JS Interop 会很容易做到。您可以将@ref 放在您想要的任何项目上,我的只是垃圾测试数据。

GetHTML.js

window.getDivContents = (element) => 
    return element.innerHTML;

Page.razor

<div @ref="Ref">
    @
        Random rand = new Random();
        int imax = rand.Next(4) + 1;
        for (int i = 0; i < imax; i++)
        
            int jmax = rand.Next(3) + 1;
            <ul>
                @for (int j = 0; j < jmax; j++)
                
                    <li>List @(i+1), Item @(j+1): #@Guid.NewGuid()</li>
                
            </ul>
        
    
</div>
<button @onclick="GetHTML">Get HTML</button>
<div>
    @HTML
</div>

@code 
    ElementReference Ref  get; set; 
    string HTML  get; set;  = "";
    async Task GetHTML()
    
        HTML = new(await JS.InvokeAsync<string>("getDivContents", Ref));
    

【讨论】:

以上是关于如何使用 Blazor 和 NetCore 5 在电子邮件中将 razor 组件作为正文发送?的主要内容,如果未能解决你的问题,请参考以下文章

Blazor - WebAssembly ASP.NET Core 托管模型

使用 Blazor Webassembly 和 ASP.NET Core 安全文件下载

.NET 5学习笔记(11)—— Host Blazor WebAssembly in a Windows Service

ASP.NET Core 5 Blazor WASM、gRPC、Entity Framework Core 5:多对多导致堆栈溢出

如何在服务器端 Blazor 中存储会话数据

如何在服务器端 Blazor 组件中访问实体框架 DbContext 实体