【问题标题】:.Net Core 5 web api Email Attachment using mimekit and mailkit.Net Core 5 web api 使用 mimekit 和 mailkit 的电子邮件附件
【发布时间】:2021-12-02 02:30:48
【问题描述】:

我有一个从客户端传入的文件:

ContentType = "应用程序/八位字节流"

其中是一个pdf文件。似乎正在发生的事情是我没有从流中获取文件,并且在打开电子邮件中的附件时它变得损坏。这是我的代码:

客户端

角度:

createPdf(): {
  var dataURI = doc.output('datauristring');
  return dataURI ? dataURI : "";
}

createMail(): void {
    var blob = new Blob([this.createPdf()], { type: 'application/pdf' });
    var fileOfBlob = new File([blob], this.data.accountName + '_' + this.data.exceptionDate + '_' + 'ExceptionRequest.pdf');
    const mail: FormData = new FormData();
    mail.append('ToEmail', this.data.contactEmail);
    mail.append('Subject', 'Test');
    mail.append('Body', 'Test Email');
    mail.append('Attachments', fileOfBlob);

    console.log(fileOfBlob);

    this.mailService.createMail(mail)
      .subscribe(res => {
        console.log(res);
      });
  }

服务器端:

型号:

public class MailRequest
    {
        public string ToEmail { get; set; }
        public string Subject { get; set; }
        public string Body { get; set; }
        public IFormFile Attachments { get; set; }
    }

服务:

        public async Task SendEmailAsync(MailRequest mailRequest)
        {
            var email = new MimeMessage();
            email.Sender = MailboxAddress.Parse(_mailSettings.Mail);
            email.To.Add(MailboxAddress.Parse(mailRequest.ToEmail));
            email.Subject = mailRequest.Subject;

            var builder = new BodyBuilder();
            byte[] fileBytes;
            if (mailRequest.Attachments != null)
            {
                var file = mailRequest.Attachments;
                if (file.Length > 0)
                {
                    using (var ms = new MemoryStream())
                    {
                        file.CopyTo(ms);
                        fileBytes = ms.ToArray();
                    }
                    builder.Attachments.Add(file.FileName, fileBytes, MimeKit.ContentType.Parse(MediaTypeNames.Application.Pdf));
                }
            }
            builder.HtmlBody = mailRequest.Body;
            email.Body = builder.ToMessageBody();
            using var smtp = new SmtpClient();
            smtp.Connect(_mailSettings.Host, _mailSettings.Port, SecureSocketOptions.StartTls);
            smtp.Authenticate(_mailSettings.Mail, _mailSettings.Password);
            await smtp.SendAsync(email);
            smtp.Disconnect(true);
        }

控制器:

[HttpPost("send")]
        public async Task<IActionResult> SendMail([FromForm] MailRequest request)
        {
            try
            {
                await _mailService.SendEmailAsync(request);
                return Ok();
            }
            catch (Exception ex)
            {
                throw;
            }
        }

我在想我需要将流解析为 pdf,但不确定在我的代码中它到底在哪里失败了。有没有人知道我在上面的 SendEmailAsync 服务中可能做错了什么?

【问题讨论】:

    标签: c# angular asp.net-core-webapi jspdf mailkit


    【解决方案1】:

    ma​​ilRequest.Attachments 是一个列表。您必须处理列表中的每一项。

    foreach (var file in mailRequest.Attachments)
    {
        if (file.Length > 0)
        {
            using (var ms = new MemoryStream())
            {
                file.CopyTo(ms);
                fileBytes = ms.ToArray();
            }
            builder.Attachments.Add(file.FileName, fileBytes, MimeKit.ContentType.Parse(MediaTypeNames.Application.Pdf));
        }
    }
    

    【讨论】:

    • 这对我不起作用。我已经试过了。我在想我没有解析它从客户端到服务器端更正。在客户端,我使用 angular 并将其作为 blob 传递,回想起来就是 base64。我认为这就是我的问题所在。那里有什么建议吗?当我使用客户端代码编辑代码时,请查看上方。
    【解决方案2】:

    答案是我没有在函数createPdf() 中将它作为客户端传递。所以,我需要做的是像这样传递它:

    角度代码:

    createPdf(): {
      var blob = doc.output('blob');
      return blob;
    }
    

    这样在传递给createMail() 函数时它仍然是一个blob。现在它完美地工作了。

    【讨论】:

      猜你喜欢
      • 2018-03-04
      • 2014-08-01
      • 2019-05-17
      • 1970-01-01
      • 1970-01-01
      • 2017-12-15
      • 2021-01-30
      • 2015-01-23
      • 2019-04-26
      相关资源
      最近更新 更多