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); } } }
额外提醒
SmtpClient和MailMessage也都实现了IDisposable,用using语句包裹它们可以避免不必要的资源泄漏。- 如果你使用Gmail的SMTP服务,现在可能需要启用应用专用密码(当账号开启双因素认证时),否则容易出现登录失败的情况。
内容的提问来源于stack exchange,提问作者bungler
相关产品推荐
相关产品推荐

