使用FluentFtp与SmtpClient时,FTP文件作为邮件附件内容为空
问题:从FTP获取文件流作为邮件附件,内容为空
我使用FluentFtp和SmtpClient从FTP获取文件并直接附加到邮件中,但附件内容为空。
原获取文件代码
public Stream GetFileStream() { client = new FtpClient("123.123.123.123", "user", "pass"); client.AutoConnect(); Stream stream = new MemoryStream(); client.DownloadStream(stream,"remotepath"); return stream; }
原发送邮件代码
public void SendMail(Stream file) { var smtpClient = new SmtpClient("smtp-mail.outlook.com") { Port = 587, Credentials = new NetworkCredential("send@test.com", "password"), EnableSsl = true, }; var message = new MailMessage() { From = new MailAddress("send@test.com"), Subject = "Test", Body = "Test", IsBodyHtml= true, }; message.To.Add("receive@test.com"); var attachment = new Attachment(file, "test.txt"); message.Attachments.Add(attachment); smtpClient.Send(message); }
我参考了相关帖子实现,但问题仍未解决。
问题原因
文件下载到MemoryStream后,流的Position指针停留在流的末尾,SmtpClient读取附件内容时会从当前Position开始,自然读不到任何数据。另外,FtpClient没有正确释放资源,可能导致连接泄漏。
修正方案
1. 重置流的Position到起始位置
在下载完成后,将MemoryStream的Position设为0,确保后续读取能从头开始。
2. 使用using包裹FtpClient
确保FTP客户端连接被正确释放,避免资源泄漏。
修正后的获取文件代码:
public Stream GetFileStream() { // using自动释放FtpClient资源 using (var client = new FtpClient("123.123.123.123", "user", "pass")) { client.AutoConnect(); var stream = new MemoryStream(); client.DownloadStream(stream, "remotepath"); // 重置流指针到起始位置 stream.Position = 0; return stream; } }
额外注意事项
- 确保FTP路径"remotepath"正确,且目标文件确实存在于FTP服务器上,当前账号拥有读取权限。
- 发送邮件后可手动调用
file.Dispose()释放流资源,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Aritz
相关产品推荐
相关产品推荐

