【问题标题】:MemoryStream doesn't fill attachmentMemoryStream 不填充附件
【发布时间】:2016-03-10 11:37:21
【问题描述】:

我正在为 C# 开发一种方法,将字节 [] 作为附件发送到该方法。 下面的方法发送邮件很好,但附件总是空的。

 public bool envio(MailMessage mail, SmtpClient cliente, byte[] origen)
        {
            bool res = true;
            System.IO.MemoryStream ms;
            System.IO.StreamWriter writer;

            ms = new System.IO.MemoryStream();
            writer = new System.IO.StreamWriter(ms);

            try
            {    
                writer.Write(origen);
                writer.Flush();                

                System.Net.Mime.ContentType ct = new System.Net.Mime.ContentType(System.Net.Mime.MediaTypeNames.Text.Plain);
                System.Net.Mail.Attachment attach = new System.Net.Mail.Attachment(ms, ct);
                attach.Name = "Mensaje";
                mail.Attachments.Add(attach);

                cliente.Send(mail);

            }

            catch (Exception ex)
            {

                res = false;
            }

            finally

            {
                writer.Close();
                writer.Dispose();                
                ms.Close();
                ms.Dispose();
            }
            return res;

        }

我很确定这对于专业开发人员来说应该是显而易见的。但我找不到解决方案。

提前致谢。

【问题讨论】:

    标签: c# email memorystream


    【解决方案1】:

    当您完成写入流时,它的位置在数据的末尾。因此,当有人试图从流中读取时,就没有什么可读取的了。解决方法很简单:

    writer.Write(origen);
    writer.Flush();
    ms.Position = 0;
    

    此外,由于您在这里处理的是纯文本,因此请注意编码。尽可能使用显式编码来最小化编码问题:)

    【讨论】:

    • 谢谢,你是对的。当我发送像“你好...”这样的字符串时,它会正确发送,但是当我尝试发送 byte[] origen 时,它只发送前 13 个字节...¿关于如何解决这个问题的任何想法?谢谢。
    • 似乎任何时候我尝试发送一个字节 [] 它只发送前 13 个字节...我尝试过不同的字节 []
    • @Dinalan 我不知道你的字节数组中有什么。由于您没有在 StreamWriter 中指定编码,因此它使用默认的 UTF-8。我希望你的字节数组中的数据在 UTF-8 中是 not,所以你会感到困惑 :)
    • @Dinalan 实际上,通过文档,StreamWriter 甚至没有 采用字节数组的重载。所以它可能使用了object 重载,这可能意味着你总是在写System.Byte[] 之类的东西——哦,看,这在UTF-8 中正好是13 个字节! :D 你为什么要首先使用StreamWriter 来写一个字节数组?
    • @Dinalan 好吧,在我看来,这绝对不像 UTF-8 纯文本 :) 你不能假装一个字节序列是一个字符串并认为你可以侥幸逃脱 -只需将内容类型更改为二进制,然后将数据直接写入内存流即可。
    猜你喜欢
    • 2012-05-21
    • 1970-01-01
    • 2016-02-02
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    • 2013-11-23
    相关资源
    最近更新 更多