5

我在工作中创建了一个应用程序,它从一些数据库数据生成 exel 文件。生成文件后,它们会自动发送给相关客户。我的问题是当我运行已发布的应用程序时它工作正常。但是有些用户在运行应用程序时会完美地生成文件,因为它们保存在 HDD 上,我可以看到它们。但是,当它们附加到 MailMessage 对象时,它们就会损坏。这是损坏文件的图像。这些文件应该是 Excel 文件。

在此处输入图像描述

这是我发送带有附件的邮件的代码:

public void SendMailedFilesDK()
        {
            string[] sentFiles = Directory.GetFiles(sentFilesDK);
            if (sentFiles.Count() > 0)
            {
                using (System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient("ares"))
                {
                    using (System.Net.Mail.MailMessage msg = new System.Net.Mail.MailMessage())
                    {
                        msg.From = new MailAddress("system@mail.dk");
                        msg.To.Add(new MailAddress("operation@mail.dk"));
                        msg.To.Add(new MailAddress("bl@mail.dk"));
                        msg.CC.Add("lmy@mail.dk");
                        msg.CC.Add("ltr@mail.dk");
                        msg.Subject = "IBM PUDO";
                        msg.Body = sentFiles.Count() + " attached file(s) has been sent to the customer(s) in question ";
                        msg.IsBodyHtml = true;
                        foreach (string file in sentFiles)
                        {
                            Attachment attachment = new Attachment(file);
                            msg.Attachments.Add(attachment);
                        }

                        client.Send(msg);
                    }
                }
            }
        }

为什么其他人运行应用程序时文件会损坏?我们都在使用office 2010。

4

3 回答 3

1

您应该确保将附件的内容类型设置为适当的值。

application/vnd.openxmlformats-officedocument.spreadsheetml.sheet对于 xlsx 文件,或

application/vnd.ms-excel对于 xls 文件。

例如,您的循环应该看起来像这样。

ContentType xlsxContent = new ContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
foreach (string file in sentFiles)
{
    Attachment attachment = new Attachment(file, xlsxContent);
    msg.Attachments.Add(attachment);
}
于 2013-03-21T20:23:29.023 回答
1

我们在 Attachment 构造函数中使用它,并且在附加 Excel 和 PDF 时没有问题。

附件数据=新附件(sFileName,MediaTypeNames.Application.Octet);

还要检查运行它的用户是否有权访问sentFilesDK指定的任何位置的文件。

于 2013-03-21T20:29:56.863 回答
0

您可能想要指定作为 Attachment 类的构造函数之一的一部分的 mimetype。

公共附件(字符串文件名,内容类型内容类型);

您还可以读取 memorystream 中的文件并将其作为以下构造函数的一部分传递。

公共附件(流内容流,字符串名称,字符串媒体类型);

于 2013-03-21T20:19:14.953 回答