You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用MailKit从MemoryStream发送带附件的邮件?

使用MailKit从MemoryStream发送带附件的邮件

别担心,这个问题其实很容易解决,MailKit的BodyBuilder类已经帮我们封装好了添加附件的便捷方法,和你之前用System.Net.Mail的思路类似,只是调用方式稍有不同。

核心修改点

你只需要利用BodyBuilder的Attachments集合,直接把MemoryStream作为源添加进去就行,不需要单独创建Attachment对象(当然也可以,但用BodyBuilder更简洁)。

修改后的完整代码

#region MailKit
string fromEmail = GlobalVariable.FromEmail;
string fromEmailPwd = "";//add sender password
var email = new MimeKit.MimeMessage();
email.From.Add(new MimeKit.MailboxAddress("Sender", fromEmail));
email.To.Add(new MimeKit.MailboxAddress("receiver", "receiver@gmail.com"));

var emailBody = new MimeKit.BodyBuilder { HtmlBody = htmlString };

// --- 重点:添加MemoryStream附件 ---
// bytes是你的文件字节数组参数
using (var memoryStream = new MemoryStream(bytes))
{
    // 三个参数分别是:文件名、流、MIME类型
    emailBody.Attachments.Add("Receipt.pdf", memoryStream, MimeKit.ContentType.Parse(MediaTypeNames.Application.Pdf));
}
// --- 附件添加完成 ---

email.Subject = "test Booking";
email.Body = emailBody.ToMessageBody();

using (var smtp = new MailKit.Net.Smtp.SmtpClient()) {
    smtp.Connect("smtp.gmail.com", 465, true);
    smtp.Authenticate(fromEmail, fromEmailPwd);
    smtp.Send(email);
    smtp.Disconnect(true);
}
#endregion

额外说明

  1. 如果你不想用MediaTypeNames.Application.Pdf,也可以直接传入MIME类型字符串"application/pdf",效果是一样的。
  2. 记得用using包裹MemoryStream,确保流资源被正确释放(当然MailKit在发送后也会自动处理,但好习惯还是要保持)。
  3. BodyBuilder还支持添加本地文件、字节数组等多种附件源,灵活性比System.Net.Mail更强。

内容的提问来源于stack exchange,提问作者dawncode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 17:32:58