Управление вложениями и встроенными объектами в письме на C#

Управлять вложениями письма

Вложение к письму — это файл, отправляемый вместе с сообщением электронной почты. Файл может быть отправлен как отдельное сообщение, так и как часть сообщения, к которому он прикреплён. The Attachment класс используется с MailMessage класс. Все сообщения включают тело. Помимо тела, вы можете захотеть отправить дополнительные файлы. Они отправляются как вложения и представлены как экземпляр Attachment класс. Вы можете отправлять любое количество вложений, но размер вложения ограничивается сервером почты. Например, Gmail не поддерживает файлы размером более 10 МБ.

Добавить вложение

Чтобы добавить вложение к письму, выполните следующие шаги:

  1. Создать экземпляр MailMessage класс.
  2. Создать экземпляр Attachment класс.
  3. Загрузите вложение в Attachment экземпляр.
  4. Добавьте Attachment экземпляр в MailMessage экземпляр.

Следующий фрагмент кода показывает, как добавить вложение к email.

// Create an instance of MailMessage class
var eml = new MailMessage
{
    From = "sender@from.com",
    To = "receiver@to.com",
    Subject = "This is message",
    Body = "This is body"
};

// Load an attachment
var attachment = new Attachment("1.txt");

// Add Multiple Attachment in instance of MailMessage class and Save message to disk
eml.Attachments.Add(attachment);

eml.AddAttachment(new Attachment("1.jpg"));
eml.AddAttachment(new Attachment("1.doc"));
eml.AddAttachment(new Attachment("1.rar"));
eml.AddAttachment(new Attachment("1.pdf"));
eml.Save("AddAttachments.eml");

Выше мы описали, как добавлять вложения к вашему сообщению email с помощью Aspose.Email. Далее показано, как удалять вложения и отображать информацию о них на экране.

Добавить ссылочное вложение

Ссылочное вложение — это тип вложения, которое содержит ссылку или ссылочный указатель на файл или объект, а не сам файл или объект в сообщении электронной почты. Когда получатели письма нажимают на ссылочное вложение, они могут получить доступ к связанному файлу, если у них есть соответствующие разрешения. Используя ссылочное вложение, вы можете отправлять более небольшие письма и гарантировать, что все имеют доступ к самой актуальной версии файла или объекта.

Приведённый ниже фрагмент кода показывает, как добавить ссылочное вложение к письму. Код выполняет следующие шаги:

  1. Загружает файл сообщения электронной почты, используя MailMessage.Load() метод.
  2. Создаёт новый объект ReferenceAttachment с именем refAttach, передавая URL вложения "https://[attach_uri]" в качестве параметра его конструктора.
  3. Устанавливает имя вложения как "Document.docx", используя Name свойству объекта refAttach.
  4. Устанавливает тип провайдера вложения в AttachmentProviderType.OneDrivePro используя ProviderType свойству объекта refAttach.
  5. Устанавливает тип разрешения вложения в AttachmentPermissionType.AnyoneCanEdit используя PermissionType свойству объекта refAttach.
  6. Добавляет объект refAttach к Вложения коллекцию объекта eml, используя Add() метод.
var eml = MailMessage.Load("fileName");

var refAttach = new ReferenceAttachment("https://[attach_uri]")
{
    Name = "Document.docx",
    ProviderType = AttachmentProviderType.OneDrivePro,
    PermissionType = AttachmentPermissionType.AnyoneCanEdit
};

eml.Attachments.Add(refAttach);

Удалить вложение

Чтобы удалить вложение, выполните приведённые ниже шаги:

  • Создайте экземпляр Attachment класс.
  • Загрузите вложение в экземпляр Attachment класс.
  • Добавьте вложение в экземпляр MailMessage класс.
  • Удалите вложения из экземпляра Attachment класс, используя MailMessage экземпляр класса.

Следующий фрагмент кода показывает, как удалить вложение.

// Create an instance of MailMessage class
var eml = new MailMessage {From = "sender@sender.com", To = "receiver@gmail.com"};

// Load an attachment
var attachment = new Attachment("1.txt");
eml.Attachments.Add(attachment);

// Remove attachment from your MailMessage
eml.Attachments.Remove(attachment);

Отобразить имя файла вложения

Чтобы отобразить имя файла вложения, выполните следующие шаги:

  1. Пройдите по вложениям в сообщении электронной почты и сохраните каждое вложение.
  2. Отобразите имя каждого вложения на экране.

Следующий фрагмент кода показывает, как отобразить имя файла вложения на экране.

var eml = MailMessage.Load("Attachments.eml");

foreach (var attachment in eml.Attachments)
{
    // Display the the attachment file name
    Console.WriteLine(attachment.Name);
}

Извлечь вложения письма

В этой теме объясняется, как извлечь вложение из файла email. Вложение email — это файл, отправляемый вместе с сообщением email. Файл может быть отправлен как отдельное сообщение, так и как часть сообщения, к которому он прикреплён. Все сообщения email включают возможность отправлять дополнительные файлы. Они отправляются как вложения и представлены в виде экземпляров Attachment класс. The Attachment класс используется с MailMessage класс для работы с вложениями. Чтобы извлечь вложения из сообщения email, выполните следующие шаги:

  • Создать экземпляр MailMessage класс.
  • Загрузите файл email в MailMessage экземпляр.
  • Создать экземпляр Attachment класс и используйте его в цикле для извлечения всех вложений.
  • Сохраните вложение и отобразите его на экране.

|Извлечённые вложения в email| | :- | |todo:image_alt_text| Следующий фрагмент кода показывает, как извлечь вложения письма.

var eml = MailMessage.Load("Message.eml", new MsgLoadOptions());

foreach (var attachment in eml.Attachments)
{
    attachment.Save("MessageEmbedded_out.eml");
    Console.WriteLine(attachment.Name);
}

Получить Content-Description из вложения

API Aspose.Email предоставляет возможность считывать Content-Description вложения из заголовка вложения. Следующий фрагмент кода показывает, как получить описание содержимого из вложения.

var eml = MailMessage.Load("EmailWithAttachEmbedded.eml");
Console.WriteLine(eml.Attachments[0].Headers["Content-Description"]);

Определить встроенные сообщения

Следующий фрагмент кода демонстрирует, как определить, является ли вложение вложенным сообщением.

var eml = MailMessage.Load("EmailWithAttachEmbedded.eml");

Console.WriteLine(eml.Attachments[0].IsEmbeddedMessage
    ? "Attachment is an embedded message."
    : "Attachment isn't an embedded message.");

Получить вложения из подписанных писем

Подписанные письма содержат единственное вложение smime.p7m. Это означает, что письмо зашифровано SMIME. Формат файла smime.p7m представляет цифровую подпись. Чтобы просмотреть содержимое этого письма, используйте RemoveSignature метод. Метод возвращает MailMessage объект без цифровой подписи.

var signedEml = MailMessage.Load("signed.eml");
        
if (signedEml.IsSigned)
{
    for (var i = 0; i < signedEml.Attachments.Count; i++)
    {
        Console.WriteLine($@"Signed email attachment{i}: {signedEml.Attachments[i].Name}");
    }
    
    // The email is signed. Remove a signature.
    var eml = signedEml.RemoveSignature();
    
    Console.WriteLine(@"Signature removed.");

    for (var i = 0; i < eml.Attachments.Count; i++)
    {
        Console.WriteLine($@"Email attachment{i}: {eml.Attachments[i].Name}");
    }
}

Обработка встроенных изображений

Добавить встроенное изображение в тело письма

Этот LinkedResource класс используется с MailMessage класс для встраивания объектов в ваше сообщение электронной почты. Чтобы добавить встроенный объект, выполните следующие шаги

  1. Создать экземпляр MailMessage класс.
  2. Укажите значения From, To и Subject в MailMessage экземпляр.
  3. Создать экземпляр AlternateView класс.
  4. Создать экземпляр LinkedResource класс.
  5. Загрузите вложенный объект в LinkedResourceCollection.
  6. Добавьте загруженный вложенный объект в MailMessage экземпляр класса.
  7. Добавьте AlternateView экземпляр к MailMessage экземпляр класса.

Приведённые ниже фрагменты кода создают сообщение email с текстовыми и HTML‑телами, а также изображением, встроенным в HTML

|Изображение, встроенное в email| | :- | |todo:image_alt_text| Вы можете отправлять любое количество вложенных объектов. Размер вложения ограничен почтовым сервером. Например, Gmail не поддерживает файлы размером более 10 МБ. Приведённые ниже фрагменты кода демонстрируют, как встраивать объекты в Email.

var eml = new MailMessage
{
    From = "AndrewIrwin@from.com",
    To = "SusanMarc@to.com",
    Subject = "This is an email"
};

// Create the plain text part It is viewable by those clients that don't support HTML
var plainView =
    AlternateView.CreateAlternateViewFromString("This is my plain text content", null, "text/plain");

// Create the HTML part.To embed images, we need to use the prefix 'cid' in the img src value.
// The cid value will map to the Content-Id of a Linked resource. Thus <img src='cid:barcode'>
// will map to a LinkedResource with a ContentId of 'barcode'.
var htmlView =
    AlternateView.CreateAlternateViewFromString("Here is an embedded image.<img src=cid:barcode>", null,
        "text/html");

// Create the LinkedResource (embedded image) and Add the LinkedResource to the appropriate view
var barcode = new LinkedResource("1.jpg", MediaTypeNames.Image.Jpeg)
{
    ContentId = "barcode"
};

eml.LinkedResources.Add(barcode);
eml.AlternateViews.Add(plainView);
eml.AlternateViews.Add(htmlView);

eml.Save("EmbeddedImage_out.msg", SaveOptions.DefaultMsgUnicode);

Удалить встроенное изображение из тела письма

LinkedResourceCollection доступен через MailMessage.LinkedResources свойства. The LinkedResourceCollection коллекция предоставляет метод для полного удаления вложенных объектов, добавленных в сообщение email. Используйте перегруженную версию LinkedResourceCollection.RemoveAt метод для удаления всех следов вложенного объекта из сообщения email.

Пример кода ниже показывает, как удалить вложенные объекты из сообщения email.

//Load the test message with Linked Resources
var eml = MailMessage.Load("EmlWithLinkedResources.eml");

//Remove a LinkedResource
eml.LinkedResources.RemoveAt(0, true);

//Now clear the Alternate View for linked Resources
eml.AlternateViews[0].LinkedResources.Clear(true);

Обработка встроенных объектов

Встроенный объект — это объект, созданный в одном приложении и вложенный в документ или файл, созданный другим приложением. Например, таблицу Microsoft Excel можно встроить в отчет Microsoft Word, или видеофайл можно встроить в презентацию Microsoft PowerPoint. При встраивании файл сохраняет свой оригинальный формат, а не просто вставляется. Встроенный документ можно открыть в оригинальном приложении и изменить.

Извлечь встроенные объекты

В этой теме объясняется, как извлечь встроенные объекты из файла письма. Встроенный документ можно открыть в оригинальном приложении и изменить. Чтобы извлечь встроенный объект из сообщения электронной почты, выполните следующие шаги:

  1. Создать экземпляр MailMessage класс.
  2. Загрузите файл email в MailMessage экземпляр.
  3. Создайте цикл и создайте экземпляр Attachment класс в нём.
  4. Сохраните вложение и отобразите его на экране.
  5. Укажите адрес отправителя и получателя в MailMessage экземпляр.
  6. Отправить email, используя SmtpClient класс.

Ниже приведённый фрагмент кода извлекает внедрённые объекты из письма.

|Извлечённые внедрённые объекты в письме| | :- | |todo:image_alt_text| Следующий фрагмент кода показывает, как извлечь внедрённые объекты.

var eml = MailMessage.Load("Message.msg", new MsgLoadOptions());

foreach (var attachment in eml.Attachments)
{
    attachment.Save("MessageEmbedded_out.msg");
    Console.WriteLine(attachment.Name);
}

Извлечь связанные изображения в HTML‑письмах

Извлечь связанные изображения из HTML‑тела внешне и внедрить их в HTML‑вывод с Aspose.Email для .NET. Установить HtmlSaveOptions.ExtractHTMLBodyResourcesAsAttachments установив значение True, связанные изображения и другие ресурсы в HTML‑теле будут извлечены и внедрены. Это помогает сохранить оригинальный вид сообщений со связанным контентом. Следующий пример кода демонстрирует, как загрузить сообщение электронной почты, извлечь его внешние HTML‑ресурсы как вложения, при необходимости обработать события рендеринга ресурсов, а затем сохранить сообщение в виде HTML‑файла с помощью Aspose.Email для .NET.

// Load the email message
var mailMessage = MailMessage.Load("input.eml");

// Set options to extract external HTML resources
var options = new HtmlSaveOptions();
options.ExtractHTMLBodyResourcesAsAttachments = true;

// Optional: Handle resource rendering events
options.ResourceHtmlRendering += (sender, e) =>
{
    Console.WriteLine(e.PathToResourceFile + " " + ((Attachment)sender).ContentId);
};

// Save the HTML representation of the email
mailMessage.Save("output.html", options);