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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 09:32:54