创建内存中邮件附件






4.02/5 (19投票s)
本文档展示了如何在运行时创建邮件附件,而无需在文件系统上创建文件。

引言
最近我编写了一个后台服务,用于监视数据库并发送关于状态的电子邮件。每封电子邮件都附带一个 XML 文件,该文件用于在接收方自动处理电子邮件。我寻找一个示例,说明如何在不先在文件系统中创建文件的情况下创建此类附件。有很多示例说明如何将现有文件附加到电子邮件,但没有一个展示如何在内存中创建附件。
为了演示,我编写了一个小型 Windows 应用程序,可以发送带有附件的电子邮件。我希望这个小示例能帮助一些正在解决相同问题的人。
理解代码
我将所有代码放在 SenderForm
类中“发送”按钮的单击事件处理程序中。在实际的生产代码中,我会将关注点分离到不同的类中,特别是为了能够使用单元测试来测试行为。该代码使用 .NET Framework 类 SmtpClient
和 MailMessage
来发送电子邮件。已经有很多文章介绍了如何初始化 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 语句释放内存流