c# - SMTPException 其中一个流已被使用,无法重置为原点

标签 c# email smtp

当我尝试通过我的 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 以及您在上面看到的消息。

您的解决方案是:

  1. 发送一封邮件,但将所有收件人放在 Bcc 中领域。
  2. 为您发送的每封邮件创建附件 - 不要每次重复使用相同的对象。
  3. 这可能行不通,但您可以尝试使用 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/

相关文章:

c# - 使用 AMO 在维度上添加 SSAS ProcessAdd

c# - 我的 C# 应用程序正在锁定一个文件,我如何才能找到它在哪里?

c# - 尝试搜索 Lucene 目录时出现错误 "No segments* file found"

HTML 电子邮件 <hr/> 样式问题

c# - 使用 LINQ 使用格式读取 XML

java - 将 IMAPMessage 移动(复制)到邮件服务器上的另一个文件夹

node.js - 通过 aws ses 在 node.js 中发送带有附件的邮件

php - 在基于 PHP 的 SMTP 客户端中设置 DomainKeys/DKIM

Phpmailer 发送邮件而无需 SMTP 身份验证

python-3.x - Python 使用本地 SMTP 服务器在 docker 容器内发送邮件