如何使用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
额外说明
- 如果你不想用
MediaTypeNames.Application.Pdf,也可以直接传入MIME类型字符串"application/pdf",效果是一样的。 - 记得用
using包裹MemoryStream,确保流资源被正确释放(当然MailKit在发送后也会自动处理,但好习惯还是要保持)。 BodyBuilder还支持添加本地文件、字节数组等多种附件源,灵活性比System.Net.Mail更强。
内容的提问来源于stack exchange,提问作者dawncode
相关产品推荐
相关产品推荐

