当我尝试通过我的 C# 代码向多个收件人发送带有附件的电子邮件时,会抛出 System.Net.Mail.SmtpException,提示“发送邮件失败”。 内部异常是“其中一个流已被使用,无法重置为原点。”
我理解这种错误可能是因为我的执着造成的。 我在不同的类(class)创建了我的附件 -
Attatchment file;
string fileContents = File.ReadAllText(fileName);
file = Attachment.CreateAttachmentFromString(fileContents, fileName);
我将以这种格式将其发送到发送电子邮件的类(class)。该类中发生以下情况 -
try
{
email.Subject = subject;
email.Body = body;
if (file != null)
{
email.Attachments.Add(file);
}
_smtpClient.Send(email);
}
catch
{
mailSent = false;
}
邮件总是发送给第一个收件人,但对其余所有收件人均失败。 知道为什么会发生这种情况吗?
最佳答案
在 Attachment
类内部,它似乎使用 Stream
来包含数据。某些类型的流不允许您将位置重置回开始位置,并且会抛出一个 InvalidOperationException
以及您在上面看到的消息。
您的解决方案是:
- 发送一封邮件,但将所有收件人放在
Bcc
中领域。 - 为您发送的每封邮件创建附件 - 不要每次重复使用相同的对象。
这可能行不通,但您可以尝试使用
Attachment
的构造函数,它将流而不是字符串作为参数。将所有字符串数据放入允许重新定位的MemoryStream
中。例如:public Stream StringToStream(string s) { MemoryStream stream = new MemoryStream(); StreamWriter writer = new StreamWriter(stream); writer.Write(s); writer.Flush(); stream.Position = 0; return stream; }
然后这个:
var stream = StringToStream(File.ReadAllText(fileName)); Attatchment file = new Attachment(stream, fileName);
注意:您正在错误地初始化附件对象。在constructor它有两个 string
参数,第二个参数是媒体类型,而不是文件名。
关于c# - SMTPException 其中一个流已被使用,无法重置为原点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33342212/