我对 System.Net.Mail 有一个奇怪的用例,因为我不想在交易中的任何时候保存物理文件。
我有一个充当邮件路由器的 wcf Web 服务。您发出一个简单的发送电子邮件请求,它工作正常。您也可以向它发送一个字符串文件路径,它会拾取文件并正确发送。
不起作用的是一种尝试获取有效 excel XML 字符串的方法(我知道它是有效的,因为如果您使用文件编写器将其保存到文件中,它会按预期打开),将其转换为字节数组,然后将其发送到将创建附件并将其添加到 MailMessage 的 Web 服务。当我收到附件时,它只是以 Excel 工作表的形式打开,每一行都是 XML 文档的一行。
这是当前的输出:
Row1: <?xml version="1.0"?>
Row2: <?mso-application progid="Excel.Sheet"?>
Row3: <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
Row4: xmlns:o="urn:schemas-microsoft-com:office:office"
Row5: xmlns:x="urn:schemas-microsoft-com:office:excel"
Row6: xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
Row7: xmlns:html="http://www.w3.org/TR/REC-html40">
Row8: <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
当我在 Notepad++ 中打开文件时,我看到行尾只有 LF 元素,而不是我通常期望的 LF 和回车。
这是我在客户端的代码:
byte[] data = new byte[reportXml.Length * sizeof(char)];
System.Buffer.BlockCopy(reportXml.ToCharArray(), 0, data, 0, data.Length);
var result = emailClient.SendMailfromBinaryData(to, from, cc, subject, body, data, "attachment.xlsx");
以下是将附件添加到 MailMessage 的 WCF 服务中的代码:
if (argFileStream != null && !string.IsNullOrEmpty(argFileName))
{
var stream = new MemoryStream(argFileStream);
var attachment = new Attachment(stream, argFileName, "text/plain");
attachment.NameEncoding = new UTF8Encoding();
message.Attachments.Add(attachment);
}
并不是说我也尝试将 MIME 类型更改为 excel:
var attachment = new Attachment(stream, argFileName, "application/vnd.ms-excel");
有任何想法吗?我没有收到任何错误,只是excel根本无法识别XML实际上是一个作为XML的excel文件。