.Net Core 5 web api 使用 mimekit 和 mailkit 的电子邮件附件
Posted
技术标签:
【中文标题】.Net Core 5 web api 使用 mimekit 和 mailkit 的电子邮件附件【英文标题】:.Net Core 5 web api Email Attachment using mimekit and 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 服务中可能做错了什么?
【问题讨论】:
【参考方案1】:mailRequest.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。现在它完美地工作了。
【讨论】:
以上是关于.Net Core 5 web api 使用 mimekit 和 mailkit 的电子邮件附件的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Web API Asp.NET Core 5 中持久化常用数据?
.Net Core 5 Web Api - Xunit 没有读取我的 appsettings.Development
.Net Core 5 web api 使用 mimekit 和 mailkit 的电子邮件附件
在 ASP.NET MVC 5 控制器中使用 POST 从 dotnet Core Web API 下载文件
在 ASP.NET Core 5.0 Web API 中实现 DelegatingHandler?
从 ASP.NET MVC 项目调用 .NET CORE 5 Web API 微服务时无法检索 BadRequest 错误