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

C#使用SmtpClient发送邮件时如何添加指定目录下的附件

问题根因

你自定义的List<string> attachments1和MailMessage的内置附件集合没有任何关联,往这个自行声明的列表里添加文件路径,不会被邮件发送逻辑识别,自然无法带出附件。

正确实现方法

不需要自行维护附件路径列表,直接操作MailMessage实例提供的Attachments属性即可:

  • 每个附件通过System.Net.Mail.Attachment类实例化,传入文件的完整本地路径
  • 实例化后的附件对象直接添加到msgObj.Attachments集合中,发送时SmtpClient会自动读取文件内容封装到邮件里
  • 建议添加附件前先校验文件是否存在、程序是否有读取权限,避免发送时抛出异常
修正后的可运行代码
try
{
    using (SmtpClient client = new SmtpClient("10.10.101.10", 500))
    {
        client.EnableSsl = false;
        client.DeliveryMethod = SmtpDeliveryMethod.Network;
        client.UseDefaultCredentials = false;
        client.Credentials = new NetworkCredential(username, password);

        // 给MailMessage也加上using,自动释放资源
        using (MailMessage msgObj = new MailMessage())
        {
            msgObj.IsBodyHtml = true;
            msgObj.To.Add(Destination);
            msgObj.From = new MailAddress("test@mail.com");
            msgObj.Subject = YourMessageSubject;
            msgObj.Body = messageBody2;

            // 替换原有自定义列表的逻辑,直接添加附件到邮件对象
            string attachmentPath = @"C:\Users -test.xlsx";
            if (File.Exists(attachmentPath))
            {
                msgObj.Attachments.Add(new Attachment(attachmentPath));
            }

            // 多附件直接重复Add即可,示例:
            // msgObj.Attachments.Add(new Attachment(@"C:\其他附件.pdf"));

            client.Send(msgObj);
        }
    }
}
catch (Exception ex)
{
    // 不要直接吞异常,打印错误信息方便排查问题
    Console.WriteLine($"邮件发送失败:{ex.Message}");
}
补充说明
  • 若需要自定义收件人看到的附件显示名称,可以给Attachment对象的Name属性赋值,例如:
    Attachment attach = new Attachment(attachmentPath);
    attach.Name = "业务报表-2024.xlsx";
    msgObj.Attachments.Add(attach);
    
  • 附件总大小不要超过所用SMTP服务器的单封邮件大小限制,否则会被服务器拒绝发送。
  • 运行程序的系统账号需要拥有附件文件的读取权限,否则会抛出权限类异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 14:06:29