我有一个表示为 byte[] 的 excel 文档,我想将它作为电子邮件的附件发送。
我在构建附件时遇到了一些麻烦。
我可以创建一个具有以下构造函数的附件:
(Stream contentStream, ContentType contentType)
(Stream contentStream, string name)
(Stream contentStream, string name, string mediaType)
我目前的想法是从 byte[] 创建一个 MemoryStream 并将其传递给创建附件的方法。
不幸的是,我看不到从 MemoryStream 获取预期文件名和内容类型的方法,我也看不到如何提供正确的内容类型。有纯文本、Pdf、Rtf 等选项,但没有一个我可以立即跳出来作为我应该用于 Excel 文档的选项。
我能找到的最接近的是MediaTypeNames.Application.Octet,它指出:
Octet 成员指定附件包含通用二进制数据。
但是,即使这是要使用的,除非它可以作为 Stream 的属性传递,否则我发送电子邮件的方法将只能将 byte[] 作为 Excel 文档发送......
是否有其他类型的 Stream 我可以使用?或者我是否必须创建自己的 Stream 类型,其中包含我需要的详细信息。
肯定有人以前做过这件事,而且微软肯定会考虑到这个程度......
任何帮助将非常感激。
更新: 请不要投票给任何使用将文件名作为字符串的构造函数的答案。我真的需要帮助使用带流的那些......我想避免将文件写入磁盘,通过电子邮件发送,然后立即删除它。因为有一种方法可以让我做到这一点,所以我想尽可能使用那个方法。
解决方案更新
康拉德设法找到了我要找的东西!谢谢大佬!
我将仅记录建议的解决方案,以防提供的链接中的内容发生问题。
此解决方案的功劳归于 www.systemnetmail.com
static void AttachmentFromStream()
{
//create the mail message
MailMessage mail = new MailMessage();
//set the addresses
mail.From = new MailAddress("me@mycompany.com");
mail.To.Add("you@yourcompany.com");
//set the content
mail.Subject = "This is an email";
mail.Body = "this content is in the body";
//Get some binary data
byte[] data = GetData();
//save the data to a memory stream
MemoryStream ms = new MemoryStream(data);
//create the attachment from a stream. Be sure to name the data
//with a file and
//media type that is respective of the data
mail.Attachments.Add( new Attachment( ms, "example.txt", "text/plain" ));
SmtpClient smtp = new SmtpClient("127.0.0.1");
smtp.Send(mail);
}
就我而言,这只是意味着我必须更改我的方法以将文件名和文件格式作为字符串。我会尝试使用 Octet 的……但如果失败了,我只会传入官方的 MIME 类型。
考虑到所有因素,这是一个非常明显的解决方案……但我确实感谢解决它的帮助……而且好消息是这个解决方案将记录在案,以供未来遇到同样问题的程序员使用。
再次感谢大家的帮助!