我有一个表示为byte []的excel文档,我想将其作为附件发送到电子邮件中。
我在构建附件时遇到了一些麻烦。
我可以创建一个具有以下构造函数的Attachment:
(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);
}
在我的情况下,它只是意味着我必须改变我的方法以将文件名和fileformat作为字符串。我会尝试使用Octet ...但如果没有,我将只传入官方的MIME类型。
考虑到所有事情,这是一个非常明显的解决方案......但我非常感谢帮助解决它...好的是,这个解决方案将记录给具有相同问题的未来程序员。
再次感谢大家的帮助!
答案 0 :(得分:12)
附件构造函数确实有一个构造函数可以满足您的需要。我假设您正在使用.NET Framework 2中的System.Net.MailMessage类。如果是read this link,您需要一些示例代码
答案 1 :(得分:2)
由于link中的accepted answer消失了,所以它来自Wayback Machine
TL; DR: mail.Attachments.Add(new Attachment(contentStream, "yourfilename.txt", "text/plain"));
展开:强>
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"));
//send the message
SmtpClient smtp = new SmtpClient("127.0.0.1");
smtp.Send(mail);
}
static byte[] GetData()
{
//this method just returns some binary data.
//it could come from anywhere, such as Sql Server
string s = "this is some text";
byte[] data = Encoding.ASCII.GetBytes(s);
return data;
}
答案 2 :(得分:1)
从Microsoft文档获得了以下答案:
public static void CreateMessageWithAttachment(string server)
{
// Specify the file to be attached and sent.
// This example assumes that a file named Data.xls exists in the
// current working directory.
string file = "data.xls";
// Create a message and set up the recipients.
MailMessage message = new MailMessage(
"jane@contoso.com",
"ben@contoso.com",
"Quarterly data report.",
"See the attached spreadsheet.");
// Create the file attachment for this email message.
Attachment data = new Attachment(file, MediaTypeNames.Application.Octet);
// Add time stamp information for the file.
ContentDisposition disposition = data.ContentDisposition;
disposition.CreationDate = System.IO.File.GetCreationTime(file);
disposition.ModificationDate = System.IO.File.GetLastWriteTime(file);
disposition.ReadDate = System.IO.File.GetLastAccessTime(file);
// Add the file attachment to this email message.
message.Attachments.Add(data);
//Send the message.
SmtpClient client = new SmtpClient(server);
// Add credentials if the SMTP server requires them.
client.Credentials = CredentialCache.DefaultNetworkCredentials;
try
{
client.Send(message);
}
catch (Exception ex)
{
Console.WriteLine("Exception caught in CreateMessageWithAttachment(): {0}",
ex.ToString());
}
// Display the values in the ContentDisposition for the attachment.
ContentDisposition cd = data.ContentDisposition;
Console.WriteLine("Content disposition");
Console.WriteLine(cd.ToString());
Console.WriteLine("File {0}", cd.FileName);
Console.WriteLine("Size {0}", cd.Size);
Console.WriteLine("Creation {0}", cd.CreationDate);
Console.WriteLine("Modification {0}", cd.ModificationDate);
Console.WriteLine("Read {0}", cd.ReadDate);
Console.WriteLine("Inline {0}", cd.Inline);
Console.WriteLine("Parameters: {0}", cd.Parameters.Count);
foreach (DictionaryEntry d in cd.Parameters)
{
Console.WriteLine("{0} = {1}", d.Key, d.Value);
}
data.Dispose();
}
答案 3 :(得分:0)
---------------我想我错了,这就是你有一个你要附加的文件--------------- < / p>
看起来这里有一个带附件邮件的例子:
http://www.aspnettutorials.com/tutorials/email/email-attach-aspnet2-csharp.aspx
我希望这就是你要找的东西。
答案 4 :(得分:0)
“附件”构造函数中的name参数是将在收件人电子邮件中显示附件的名称。
因此,您可以自由选择名称参数(扩展名.xls首选),并将mediaType参数设置为“application / vnd.ms-excel”,这是excel文件的已定义MIME type。