无法在MimeMessagerotativa中添加附件以发送邮件

问题描述

我想通过电子邮件发送(查看页面)pdf。但是,当我尝试添加附件时,在“添加”下方发现错误。为此,我无法在附加视图pdf的情况下成功发送邮件。 这是我的代码

(Ordercontroller)

//other code


            var message = new MimeMessage();
            message.From.Add(new MailBoxAddress("Test Project","pt300@gmail.com"));
            message.To.Add(new MailBoxAddress("psm","p689@gmail.com"));
            message.Subject = "Hi,this is demo email";
            message.Body = new TextPart("plain")
            {
                Text = "Hello,My First Demo Mail it is.Thanks",};

            //add attach
            var aa = new Viewaspdf("Cart")
            {
                FileName = "Invoice.pdf",//actually,I don't kNow why this filename is 
                                                    // "Invoice". I found this system on a website.

                PageOrientation = Rotativa.AspNetCore.Options.Orientation.Portrait,};
         
            message.Attachments.Add(aa);

            //end attach
            using (var client = new SmtpClient())
            {
                client.Connect("smtp.gmail.com",587,false);
                client.Authenticate("pt300@gmail.com","MyPassword");

                client.Send(message);
                client.disconnect(true);

            }

//other code

和这些控制器的视图,我试图进行pdf并通过邮件发送:

(HomeController)

  public ActionResult Cart()
        {
            List<Product> products = HttpContext.Session.Get<List<Product>>("products");
            if (products == null)
            {
                products = new List<Product>();
            }
            return View(products);
        }

在OrderController中我发现了一个错误

enter image description here

我将如何解决此问题并成功通过邮件发送视图的pdf。请提供帮助。

解决方法

附件 MimeMessage 属性,没有这种方法 添加 ,因此出现错误。要添加附件,您应该之前创建一个BodyBuilder对象,使用该类,您可以添加新的附件(每个附件为字节数组),使用 附件 属性及其 添加 方法,但始终与 BodyBuilder 相关,而不与 MimeMessage

请看看这里给出的答案,因为我想这就是您要寻找的答案: .net Core Mailkit send attachement from array

或在此处查看另一个示例: https://www.taithienbo.com/send-email-with-attachments-using-mailkit-for-net-core/

此外,您可以使用此代码将Rotativa PDF作为字节数组获取:

var rotativaAction = new ViewAsPdf("Cart")
{
    FileName = "Invoice.pdf",// You can change this file name to set whatever you want
    PageOrientation = Rotativa.AspNetCore.Options.Orientation.Portrait,};

byte[] fileAttachmetByteArray = rotativaAction.BuildFile(ControllerContext);

一旦您使用Rotativa将PDF生成为字节数组,然后猜测结果已存储在名为fileAttachmentByteArray的变量中(如前面的代码示例中所述),则只需发送此变量(字节数组)作为 BodyBuilder Add 方法,作为第二个参数(第一个是附件文件名,使用您喜欢的名称完全免费),然后设置 Mime Message Body ,使用 BodyBuilder

因此,分步解释该过程:

  1. 在第一行上,创建一个BodyBuilder变量,并使用要用作电子邮件正文的文本对其进行初始化。
  2. 然后,您调用 Add 方法添加新附件,并向其发送所需的文件名和以前创建的bye数组
  3. 最后,您将值分配给Mime Message的 Body 属性

您的代码应如下所示:

var builder = new BodyBuilder { HtmlBody = "yourBodyMessage" };   // Change "yourBodyMessage" to the email body you desire
builder.Attachments.Add("filename",fileAttachmentByteArray);   // Once again,you can change this "filename" to set whatever you want
mimeMessage.Body = builder.ToMessageBody();   // Assuming mimeMessage is the same variable you provided in your code