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
相关产品推荐
相关产品推荐

