You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

文件上传丢失及批量带附件邮件异常:仅首封含附件求助

批量邮件附件异常问题排查与修复

嘿,我看你在做带附件的批量邮件系统时碰到了挺闹心的问题:只有第一封邮件能带上图片附件,后面的都空了,还存在文件上传丢失的情况!结合你给出的代码片段,大概率是循环发送时的资源复用或流处理出了问题,我给你拆解下常见坑点和修复方案:

核心错误原因

  • 上传文件流被一次性耗尽FiUpLoad.FileBytes 是一次性读取的字节数组,要是你在循环里直接复用这个变量,第一次发送邮件时流已经被读取完毕,后续循环就拿不到文件内容了。
  • 附件/邮件对象未重新实例化:如果循环中反复用同一个 AttachmentMailMessage 对象,没每次创建新实例,会导致后续邮件无法正确关联附件资源。
  • 未提前缓存上传文件内容:ASP.NET的上传控件在回发后状态可能丢失,要是循环里才去读取 FiUpLoad 的内容,很可能已经拿不到了。

修复后的完整代码示例

我给你调整了核心逻辑,确保每次发送邮件都能正确获取到附件:

protected void BtnSenMail_Click(object sender, EventArgs e)
{
    // 提前缓存上传文件的关键信息,避免后续读取失效
    byte[] uploadedFileBytes = null;
    string uploadedFileName = null;
    if (FiUpLoad.HasFile)
    {
        uploadedFileBytes = FiUpLoad.FileBytes;
        uploadedFileName = FiUpLoad.FileName;
    }

    string tema = TxtEmnefelt.Text;
    string indhold = TxtIndhold.Text;

    // 假设emailList是你的收件人列表集合
    foreach (string recipientEmail in emailList)
    {
        // 每次循环都创建全新的邮件实例
        using (MailMessage mail = new MailMessage())
        using (SmtpClient smtp = new SmtpClient("你的SMTP服务器地址"))
        {
            mail.To.Add(recipientEmail);
            mail.Subject = tema;
            mail.Body = indhold;
            mail.From = new MailAddress("你的发件邮箱@xxx.com");

            // 有上传文件时,每次都创建新的附件实例
            if (uploadedFileBytes != null && !string.IsNullOrEmpty(uploadedFileName))
            {
                // 用内存流包装字节数组,确保每次都能完整读取内容
                using (MemoryStream ms = new MemoryStream(uploadedFileBytes))
                {
                    Attachment attachment = new Attachment(ms, uploadedFileName);
                    mail.Attachments.Add(attachment);
                }
            }

            // 发送邮件
            smtp.Send(mail);
        }
    }
}

关键优化点

  • 提前缓存上传内容:在循环开始前就把文件字节数组和文件名存好,避免控件状态变化导致的上传内容丢失。
  • 用using管理资源MailMessageSmtpClient 和内存流都用using包裹,确保资源被自动释放,避免内存泄漏或资源占用。
  • 每次循环新建实例:邮件、附件都在循环内创建新对象,避免复用同一个对象导致的资源关联异常。
  • 空值安全判断:处理附件前先检查上传文件是否存在,避免空引用报错。

内容的提问来源于stack exchange,提问作者TheNewone

火山引擎 最新活动