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

C#发送带MemoryStream附件邮件遇异常问题求助

C#使用AWS SES发送带PDF附件邮件时RawMessage.Data超时属性抛出异常

我尝试在C#中通过AWS SES发送包含HTML转PDF附件的邮件,实现代码如下。虽然API返回HttpStatusCode.OK,但调试时查看sendRequest对象,访问sendRequest.RawMessage.Data.ReadTimeout和sendRequest.RawMessage.Data.WriteTimeout会抛出System.InvalidOperationException异常。

HtmlToPdf htmlToPdf = new HtmlToPdf();
htmlToPdf.Options.PdfPageOrientation = PdfPageOrientation.Portrait;
// 设置PDF边距
htmlToPdf.Options.MarginLeft = 15;
htmlToPdf.Options.MarginRight = 15;
string htmlContent = "<html><head></head><body>Hello World</body></html>";
PdfDocument pdfDocument = htmlToPdf.ConvertHtmlString(htmlContent);
byte[] pdfBytes = pdfDocument.Save();

// 转换为MemoryStream
MemoryStream pdfStream = new MemoryStream(pdfBytes);
pdfStream.Flush();
pdfStream.Position = 0;

var rawMessage = new RawMessage{ Data = pdfStream };
var sendRequest = new SendRawEmailRequest
{
    Destinations = new List<string> { "abc@mail.com" },
    RawMessage = rawMessage,
    Source = senderAddress
};

var response = sesClient.SendRawEmailAsync(sendRequest);

问题原因

MemoryStream类本身不支持ReadTimeout和WriteTimeout属性,当你尝试访问这两个属性时,就会触发InvalidOperationException。但这个异常不会影响邮件发送的实际流程——AWS SES的SendRawEmailAsync方法并不依赖这两个超时属性,所以返回的HttpStatusCode.OK是真实有效的,邮件应该已经成功发送。

解决办法

  1. 忽略该异常:调试时不要主动访问这两个属性即可,它们对邮件发送没有实际作用。
  2. 优化流的使用:
    • 可以直接用byte[]初始化RawMessage(部分AWS SDK版本支持直接传入字节数组,无需包装成MemoryStream):
      var rawMessage = new RawMessage { Data = pdfBytes };
      
    • 如果必须使用流,也可以不用特意调用Flush(),因为MemoryStream基于内存,Flush()操作没有实际意义:
      MemoryStream pdfStream = new MemoryStream(pdfBytes);
      pdfStream.Position = 0; // 只需重置位置即可
      
  3. 正确处理异步方法:SendRawEmailAsync是异步方法,建议添加await等待执行完成,避免流被提前回收:
    var response = await sesClient.SendRawEmailAsync(sendRequest);
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 13:50:26