作为 System.Net.Mail 的附件的流是 0 字节

Posted

技术标签:

【中文标题】作为 System.Net.Mail 的附件的流是 0 字节【英文标题】:Stream as an Attachment to System.Net.Mail is 0 bytes 【发布时间】:2010-11-21 23:31:51 【问题描述】:

我有一个项目,我正在使用 PDF 生成器向用户发送文件。我们想让用户选择将此文件附加到电子邮件中,但我们在同时使用 Stream 对象和附件逻辑时遇到了问题。

我们从 ABCpdf 开始,它有两种保存方法:它可以保存到 Stream,或者如果你给它一个字符串,它会尝试保存到磁盘上的文件。我们都做了没有问题。

Stream stream = new MemoryStream();
myPdf.Save(stream);

此时一切都很酷 - stream 有几千字节的数据,如果你 .Save() 到一个文件,你会得到一个具有相同字节数的实际文件。

所以我们此时附加到一封电子邮件(在初始化邮件对象、设置 To: 和 From: 等之后):

mail.Attachments.Add(new Attachment(stream, "myPdf.pdf"));
mail.Send();

...这让我们收到一封 0 字节的电子邮件,但文件名正确。

我在网上找到的所有示例都使用 StreamReader 或 StreamWriter 或 Flush() 或其他东西。它似乎总是比简单地传递 Stream 更复杂,但可能只有一两行更复杂。这些示例都不是以 Stream 开头的 - 他们总是试图将数组转换为 Stream 以向您展示这是多么容易,或者从磁盘中获取文件(我们不能这样做,这就是我们兴奋的原因使用流)。

无论如何,如果有人能解释我做错了什么或我应该做什么,我将不胜感激。谢谢。

【问题讨论】:

如果它对任何人有帮助,我的附件是 64 字节,但打开它时说文件无效。下面的解决方案也解决了这个问题,所以它不仅仅是说 0 字节。 【参考方案1】:

猜测...在发送 nit 之前将数据流返回到开头

// Set the position to the beginning of the stream.
stream.Seek(0, SeekOrigin.Begin);
mail.Attachments.Add(new Attachment(stream, "myPdf.pdf"));
mail.Send();

【讨论】:

我是想试试的——我会试一试的。谢谢。 这应该是问题所在。除非您或您的 PDF api 正在使用缓冲流。不要假设;最后检查流的类型。 我建议使用“stream.Position = 0;”作为倒带流的更简单方法。它们是等价的,但Position 更具可读性 IMO :) 也为我工作!我正在为此拉头发。 我只需要再做一次,只是忘了再做一次,然后我记得再做一次,又成功了。谢谢!【参考方案2】:

您是否尝试过保存文件然后附加文件,而不是尝试附加流?

添加

这里的正常流程是

    使用流在磁盘上创建文件

    将文件附加到电子邮件

    完成后删除文件。

【讨论】:

不能保存到磁盘。您是否正在考虑在其他地方“保存”?将 Stream 转换为 byte[] 或其他内容并将其读回? 好的。如果保存到磁盘不是一种选择,那么我很抱歉,我的帖子将完全没有帮助。我从未尝试将流附加到电子邮件。我会回来看看其他人发布的内容,因为我认为这比像我通常做的那样创建一个临时文件然后不得不删除它要好。

以上是关于作为 System.Net.Mail 的附件的流是 0 字节的主要内容,如果未能解决你的问题,请参考以下文章

删除附件文件

.Net 自带System.Net.Mail.MailMessage发送邮件乱码问题

在 C# 中设置电子邮件附件名称

将 System.Net.mail.MailMessage 保存为 .msg 文件

.NET 发送电子邮件的最佳方法(System.Net.Mail 有问题)

使用 Gmail SMTP 和 System.Net.Mail 发送电子邮件 [重复]