在 C# 中管理电子邮件附件和嵌入对象

管理电子邮件附件

电子邮件附件是与电子邮件一起发送的文件。该文件可以作为单独的消息发送,也可以作为附加到的消息的一部分发送。该 Attachment 类与一起使用 MailMessage 类。所有消息都包含正文。除了正文外,您可能想发送其他文件。这些文件作为附件发送,并表示为 Attachment 类。您可以发送任意数量的附件,但附件大小受邮件服务器限制。例如,Gmail 不支持大于 10MB 的文件。

添加附件

要向电子邮件添加附件,请按以下步骤操作:

  1. 创建该类的实例 MailMessage 类。
  2. 创建该类的实例 Attachment 类。
  3. 将附件加载到 Attachment 实例。
  4. 添加 Attachment 实例到 MailMessage 实例。

下面的代码片段展示了如何向电子邮件添加附件。

// 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");

上述内容介绍了如何使用 Aspose.Email 向电子邮件添加附件。下面展示了如何删除附件并在屏幕上显示其信息。

添加参考附件

参考附件是一种附件类型,它包含指向文件或项目的链接或引用,而不是在电子邮件中直接包含该文件或项目本身。当收件人点击参考附件时,只要拥有相应的权限,就能够访问该链接的文件。使用参考附件可以发送更小的电子邮件,并确保所有人都能访问文件或项目的最新版本。

下面的代码片段展示了如何向电子邮件添加参考附件。代码执行以下步骤:

  1. 使用该方法加载电子邮件消息文件 MailMessage.Load() 方法。
  2. 创建一个名为 refAttach 的新 ReferenceAttachment 对象,并将附件 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);

删除附件

要移除附件,请按照以下步骤操作:

下面的代码片段展示了如何删除附件。

// 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);
}

提取电子邮件附件

本主题说明如何从电子邮件文件中提取附件。电子邮件附件是随电子邮件消息一起发送的文件。该文件可以作为单独的消息发送,也可以作为其所附消息的一部分发送。所有电子邮件都提供了发送附加文件的选项。这些文件作为附件发送,并表现为 Attachment 类。该 Attachment 类与一起使用 MailMessage 类用于处理附件。要从电子邮件消息中提取附件,请按照以下步骤操作:

  • 创建该类的实例 MailMessage 类。
  • 将电子邮件文件加载到 MailMessage 实例。
  • 创建该类的实例 Attachment 类并在循环中使用它来提取所有附件。
  • 保存附件并在屏幕上显示。

|电子邮件中提取的附件| | :- | |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

Aspose.Email API 提供从附件头读取 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. 在…中指定发件人、收件人和主题值 MailMessage 实例。
  3. 创建该类的实例 AlternateView 类。
  4. 创建该类的实例 LinkedResource 类。
  5. 将嵌入对象加载到 LinkedResourceCollection.
  6. 将加载的嵌入对象添加到 MailMessage 类实例。
  7. 添加 AlternateView 实例化到 MailMessage 类实例。

下面的代码片段生成了一封包含纯文本和 HTML 正文以及嵌入到 HTML 中的图片的电子邮件。

|嵌入到电子邮件的图片| | :- | |todo:image_alt_text| 您可以发送任意数量的嵌入对象。附件大小受邮件服务器限制。例如,Gmail 不支持大于 10MB 的文件。下面的代码片段演示了如何将对象嵌入到电子邮件中。

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 属性的重载版本。 LinkedResourceCollection 集合提供了一种方法来完全移除添加到电子邮件消息中的嵌入对象。请使用 LinkedResourceCollection.RemoveAt 用于从电子邮件消息中完全移除嵌入对象的所有痕迹的方法。

下面的示例代码展示了如何从电子邮件消息中移除嵌入对象。

//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. 在…中加载电子邮件文件。 MailMessage 实例。
  3. 创建循环并创建…的实例。 Attachment 其中的类。
  4. 保存附件并在屏幕上显示。
  5. 在…中指定发件人和收件人地址 MailMessage 实例。
  6. 使用以下方式发送电子邮件 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 邮件中的链接图片

使用 Aspose.Email for .NET 从 HTML 正文外部提取链接图片资源并将其嵌入到 HTML 输出中。设置 HtmlSaveOptions.ExtractHTMLBodyResourcesAsAttachments 设为 True 时,HTML 正文中的链接图片和其他资源将被提取并嵌入。这有助于保留带有链接内容的消息的原始外观。以下代码示例演示了如何加载电子邮件,提取其外部 HTML 资源为附件,可选地处理资源渲染事件,然后使用 Aspose.Email for .NET 将消息保存为 HTML 文件。

// 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);