从 memoryStream 发送带有附件的 MailKit 电子邮件

Send MailKit email with an attachment from memoryStream

如何使用 MailKit 从 memoryStream 发送带有附件的电子邮件?目前,我使用常规 SMTP 发送并使用以下代码附加文件,但找不到任何合适的示例来使用 MailKit 包发送它。 我已经阅读了这两个文档,但找不到合适的解决方案。 http://www.mimekit.net/docs/html/M_MimeKit_AttachmentCollection_Add_6.htm

using System.Net.Mail;
MemoryStream memoryStream = new MemoryStream(bytes);
                    message.Attachments.Add(new Attachment(memoryStream, "Receipt.pdf", MediaTypeNames.Application.Pdf));

这是我的 MailKit 电子邮件代码:

#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
                };
                email.Subject = "test Booking";
                email.Body = emailBody.ToMessageBody();
                //bytes is parameter.
                //MemoryStream memoryStream = new MemoryStream(bytes);
                //message.Attachments.Add(new Attachment(memoryStream, "Receipt.pdf", MediaTypeNames.Application.Pdf));

                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

这是如何完成的:您需要为字符串内容创建一个 TextPart,为附件创建一个 MimePart,然后将两者添加到 Multipart,即 [= MimeMessage

的 14=]

我假设您想发送一个 HTML 字符串 textContent 和一个名称为 filename 的 PDF 文件,该文件已使用任何名为 stream 的流读取。

var multipart = new Multipart("mixed");
var textPart = new TextPart(TextFormat.Html)
{
    Text = textContent,
    ContentTransferEncoding = ContentEncoding.Base64,
};
multipart.Add(textPart);

stream.Position = 0; // you MUST reset stream position

var attachmentPart = new MimePart(MediaTypeNames.Application.Pdf)
{
    Content = new MimeContent(stream),
    ContentId = filename,
    ContentTransferEncoding = ContentEncoding.Base64,
    FileName = filename
};
multipart.Add(attachmentPart);

mimeMessage.Body = multipart;

请注意,对于 contentType,我使用了来自 DLL System.Net.Mail 和命名空间 System.Net.MimeMediaTypeNames.Application.Pdf,它等于字符串 "application/pdf"。您可以改用您喜欢的任何其他库,或编写您自己的库。

如果你想坚持使用 MimeKit 的 BodyBuilder 来构建你的消息正文,你可以这样做:

var emailBody = new MimeKit.BodyBuilder
{
    HtmlBody = htmlString
};
emailBody.Attachments.Add ("Receipt.pdf", bytes);

// If you find that MimeKit does not properly auto-detect the mime-type based on the
// filename, you can specify a mime-type like this:
//emailBody.Attachments.Add ("Receipt.pdf", bytes, ContentType.Parse (MediaTypeNames.Application.Pdf));

message.Body = emailBody.ToMessageBody ();