Могу ли я отправлять файлы по электронной почте с помощью MailKit?

Как видно из заголовка, поддерживается ли MailKit для отправки файла?
Если да, как я могу это сделать?


person KlynkC    schedule 16.06.2016    source источник


Ответы (3)


да. Это объясняется в документации, а также в FAQ.

Из FAQ:

Как создать сообщение с вложениями?

Чтобы создать сообщение с вложениями, первое, что вам нужно сделать, это создать multipart/mixed контейнер, в который вы затем захотите сначала добавить тело сообщения. После того, как вы добавили тело, вы можете добавить к нему части MIME, которые содержат содержимое файлов, которые вы хотите прикрепить, не забудьте установить значение заголовка Content-Disposition для вложения. Возможно, вы также захотите установить параметр filename в заголовке Content-Disposition, а также параметр name в заголовке Content-Type. Самый удобный способ сделать это - просто использовать свойство MimePart.FileName, которое установит для вас оба параметра, а также установит значение заголовка Content-Disposition на attachment, если оно еще не было установлено на что-то другое.

var message = new MimeMessage ();
message.From.Add (new MailboxAddress ("Joey", "[email protected]"));
message.To.Add (new MailboxAddress ("Alice", "[email protected]"));
message.Subject = "How you doin?";

// create our message text, just like before (except don't set it as the message.Body)
var body = new TextPart ("plain") {
    Text = @"Hey Alice,

What are you up to this weekend? Monica is throwing one of her parties on
Saturday. I was hoping you could make it.

Will you be my +1?

-- Joey
"
};

// create an image attachment for the file located at path
var attachment = new MimePart ("image", "gif") {
    Content = new MimeContent (File.OpenRead (path)),
    ContentDisposition = new ContentDisposition (ContentDisposition.Attachment),
    ContentTransferEncoding = ContentEncoding.Base64,
    FileName = Path.GetFileName (path)
};

// now create the multipart/mixed container to hold the message text and the
// image attachment
var multipart = new Multipart ("mixed");
multipart.Add (body);
multipart.Add (attachment);

// now set the multipart/mixed as the message body
message.Body = multipart;

Более простой способ создания сообщений с вложениями - воспользоваться классом BodyBuilder.

var message = new MimeMessage ();
message.From.Add (new MailboxAddress ("Joey", "[email protected]"));
message.To.Add (new MailboxAddress ("Alice", "[email protected]"));
message.Subject = "How you doin?";

var builder = new BodyBuilder ();

// Set the plain-text version of the message text
builder.TextBody = @"Hey Alice,

What are you up to this weekend? Monica is throwing one of her parties on
Saturday. I was hoping you could make it.

Will you be my +1?

-- Joey
";

// We may also want to attach a calendar event for Monica's party...
builder.Attachments.Add (@"C:\Users\Joey\Documents\party.ics");

// Now we just need to set the message body and we're done
message.Body = builder.ToMessageBody ();

Для получения дополнительной информации см. Создание сообщений.

person jstedfast    schedule 16.06.2016
comment
Спасибо, File поработал отлично. Но изображение не такое, как ожидалось для второго примера. - person KlynkC; 17.06.2016
comment
Я не понимаю, что это значит. - person jstedfast; 17.06.2016
comment
Я отправил файл, но файл с изображением не был отправлен - person KlynkC; 18.06.2016
comment
если вы добавляете его, как в примере, я гарантирую, что он будет отправлен. - person jstedfast; 18.06.2016
comment
ссылка больше не действительна? - person kuldeep; 21.06.2017
comment
Можно ли в Mailkit отправлять данные календаря (содержимое ics) как одну из составных частей, но не как вложение? - person kuldeep; 21.06.2017
comment
Да - просто установите расположение содержимого как встроенное - person jstedfast; 21.06.2017
comment
Я пробовал следующее .. var attachment = new MimePart (text / calendar; method = REQUEST,) {ContentObject = new ContentObject (GenerateStreamFromString (calString), ContentEncoding.Default), ContentDisposition = new ContentDisposition (ContentDisposition.Inline), ContentTransferEncoding = ContentEncoding .Base64}; но в почтовом клиенте Outlook я вижу, что ics по-прежнему приходит как вложение, а не как приглашение на собрание. Я использую Outlook 2016 - person kuldeep; 22.06.2017
comment
Найдите пример сообщения, которое работает с Outlook, а затем создайте свое сообщение так же, как это сообщение :-) MimeKit можно использовать для создания любого макета сообщения и установки любого атрибута, поэтому, если можно достичь того, что вы хотите с MIME, это можно сделать это с помощью MimeKit - person jstedfast; 22.06.2017

@jstedfast принес довольно крутое решение, вот еще несколько примеров простых способов просто отправить файл как вложение (в данном случае документ pdf, но его можно применить к любому типу файла).

var message = new MimeMessage();
// add from, to, subject and other needed properties to your message

var builder = new BodyBuilder();
builder.HtmlBody = htmlContent;
builder.TextBody = textContent;

// you can either create MimeEntity object(s)
// this might get handy in case you want to pass multiple attachments from somewhere else
byte[] myFileAsByteArray = LoadMyFileAsByteArray();
var attachments = new List<MimeEntity>
{
    // from file
    MimeEntity.Load("myFile.pdf"),
    // file from stream
    MimeEntity.Load(new MemoryStream(myFileAsByteArray)),
    // from stream with a content type defined
    MimeEntity.Load(new ContentType("application", "pdf"), new MemoryStream(myFileAsByteArray))
}

// or add file directly - there are a few more overloads to this
builder.Attachments.Add("myFile.pdf");
builder.Attachments.Add("myFile.pdf", myFileAsByteArray);
builder.Attachments.Add("myFile.pdf", myFileAsByteArray , new ContentType("application", "pdf"));

// append previously created attachments
foreach (var attachment in attachments)
{
    builder.Attachments.Add(attachment);
}

message.Body = builder.ToMessageBody();

Надеюсь, поможет.

person Vočko    schedule 10.10.2019

Вы также можете напрямую отправить несколько файлов, используя этот подход. ** Примечание: здесь используются файлы IEnumerable **

        try
        {
            var message = new MimeMessage();
            message.From.Add(new MailboxAddress(emailService.FromFullName, emailService.FromEmail));
            message.To.AddRange(emailsToSend.Select(x => new MailboxAddress(x)));
            message.Subject = subject;

            var builder = new BodyBuilder();
            builder.HtmlBody = body;

            foreach (var attachment in files)
            {
                if (attachment.Length > 0)
                {
                    string fileName = Path.GetFileName(attachment.FileName);
                    builder.Attachments.Add(fileName, attachment.OpenReadStream());
                }
            }
            message.Body = builder.ToMessageBody();
           
            }
     
person Arsalan Haider    schedule 19.01.2021