You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#发送邮件仅附带首个附件问题求助

问题分析与解决方案

嘿,这跟等待时间完全没关系哦!你的代码逻辑有个明显的小bug——你在循环里每次都把attachments变量覆盖成新的附件对象,最后只把最后一个文件添加到了邮件里,前面的附件都被直接丢弃了,自然看不到它们。

先看看你原代码里的问题点:

private static void SendFiles() { 
    var client = new SmtpClient("smtp.gmail.com"); 
    client.Port = 587; 
    client.Credentials = new NetworkCredential("wmitask@gmail.com", "password"); 
    client.EnableSsl = true; 
    var message = new MailMessage(); 
    message.From = new MailAddress("wmitask@gmail.com"); 
    message.To.Add("wmitask@gmail.com"); 
    message.Subject = "File"; 
    message.Body = "Test"; 
    Attachment attachments = null; 
    foreach (var file in Directory.GetFiles(programFilesDataDir)) { 
        attachments = new Attachment(file, MediaTypeNames.Application.Pdf); 
    } 
    if (attachments == null) return; 
    message.Attachments.Add(attachments); 
    client.Send(message); 
}

这段循环里,每遍历一个文件就新建一个Attachment,但每次都把之前的Attachment实例覆盖掉了,循环结束后attachments只保存了最后一个文件的附件,所以邮件里只会有这一个附件。

修正后的代码

正确的做法是每创建一个附件就立刻添加到邮件的附件集合里,同时记得用using语句管理Attachment的资源(因为它实现了IDisposable接口):

private static void SendFiles() 
{ 
    // 用using包裹SmtpClient,确保资源正确释放
    using (var client = new SmtpClient("smtp.gmail.com"))
    {
        client.Port = 587; 
        client.Credentials = new NetworkCredential("wmitask@gmail.com", "password"); 
        client.EnableSsl = true; 

        // 用using包裹MailMessage
        using (var message = new MailMessage())
        {
            message.From = new MailAddress("wmitask@gmail.com"); 
            message.To.Add("wmitask@gmail.com"); 
            message.Subject = "File"; 
            message.Body = "Test"; 

            foreach (var file in Directory.GetFiles(programFilesDataDir)) 
            {
                // 每个附件都用using包裹,避免资源泄漏
                using (var attachment = new Attachment(file, MediaTypeNames.Application.Pdf))
                {
                    message.Attachments.Add(attachment);
                }
            }

            // 可选:如果没有附件也可以选择发送,或者保留原判断逻辑
            if (message.Attachments.Count == 0) return;
            
            client.Send(message); 
        }
    }
}

额外提醒

  1. SmtpClient和MailMessage也都实现了IDisposable,用using语句包裹它们可以避免不必要的资源泄漏。
  2. 如果你使用Gmail的SMTP服务,现在可能需要启用应用专用密码(当账号开启双因素认证时),否则容易出现登录失败的情况。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:06:00