65.9K
CodeProject 正在变化。 阅读更多。
Home

创建内存中邮件附件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.02/5 (19投票s)

2007年11月24日

CPOL

2分钟阅读

viewsIcon

122642

downloadIcon

1899

本文档展示了如何在运行时创建邮件附件,而无需在文件系统上创建文件。

Screenshot - InMemoryMailAttachment.gif

引言

最近我编写了一个后台服务,用于监视数据库并发送关于状态的电子邮件。每封电子邮件都附带一个 XML 文件,该文件用于在接收方自动处理电子邮件。我寻找一个示例,说明如何在不先在文件系统中创建文件的情况下创建此类附件。有很多示例说明如何将现有文件附加到电子邮件,但没有一个展示如何在内存中创建附件。

为了演示,我编写了一个小型 Windows 应用程序,可以发送带有附件的电子邮件。我希望这个小示例能帮助一些正在解决相同问题的人。

理解代码

我将所有代码放在 SenderForm 类中“发送”按钮的单击事件处理程序中。在实际的生产代码中,我会将关注点分离到不同的类中,特别是为了能够使用单元测试来测试行为。该代码使用 .NET Framework 类 SmtpClientMailMessage 来发送电子邮件。已经有很多文章介绍了如何初始化 SmtpClient、如何执行 SMTP 身份验证以及如何创建 MailMessage,因此我不会详细介绍这部分内容。

// Init the smtp client and set the network credentials

SmtpClient smtpClient = new SmtpClient();
smtpClient.Host = hostTextBox.Text;
...
    
// Create MailMessage

MailMessage message = new MailMessage(
    fromTextBox.Text,
    toTextBox.Text,
    subjectTextBox.Text,
    bodyTextBox.Text);

有趣的部分是附件的创建。文件内容字符串应该放在附件中。首先,你必须将字符串转换为字节数组。这些字节必须写入内存流。不要忘记在使用流之前将流中的位置指针设置回开头。你必须使用 ContentType 对象定义 MIME 类型和文件名。现在你可以创建一个 Attachment 对象。将此附件添加到电子邮件并发送它很容易。

// Create a memory stream

using (MemoryStream memoryStream = new MemoryStream())
{
    byte[] contentAsBytes = Encoding.UTF8.GetBytes(fileContentTextBox.Text);
    memoryStream.Write(contentAsBytes, 0, contentAsBytes.Length);

    // Set the position to the beginning of the stream.

    memoryStream.Seek(0, SeekOrigin.Begin);

    // Create attachment

    ContentType contentType = new ContentType();
    contentType.MediaType = MediaTypeNames.Application.Octet;
    contentType.Name = fileNameTextBox.Text;
    Attachment attachment = new Attachment(memoryStream, contentType);

    // Add the attachment

    message.Attachments.Add(attachment);

    // Send Mail via SmtpClient

    smtpClient.Send(message);
}

关注点

.NET Framework 的创建者通过流以及字符串的编码和解码解决了这些问题。尽管如此,并非每天都关注这些问题的人可能需要一些示例才能快速上手。我希望这篇文章能有所帮助。

历史

  • 2007 年 11 月 24 日:发布初始版本
  • 2007 年 12 月 3 日:使用 using 语句释放内存流
© . All rights reserved.