将它们附加到MailMessage C#时文件已损坏

时间:2013-03-21 20:09:37

标签: c# .net attachment smtpclient

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

enter image description here

这是我发送包含附件的邮件的代码:

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。

3 个答案:

答案 0 :(得分:1)

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

xlsx文件的

application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

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);
}

答案 1 :(得分:1)

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

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

同时检查运行此用户的用户是否有权访问 sentFilesDK 指定的任何位置的文件。

答案 2 :(得分:0)

您可能希望指定mimetype,它是Attachment类中其中一个构造函数的一部分。

public Attachment(string fileName,ContentType contentType);

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

public Attachment(Stream contentStream,string name,string mediaType);