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是真实有效的,邮件应该已经成功发送。
解决办法
- 忽略该异常:调试时不要主动访问这两个属性即可,它们对邮件发送没有实际作用。
- 优化流的使用:
- 可以直接用
byte[]初始化RawMessage(部分AWS SDK版本支持直接传入字节数组,无需包装成MemoryStream):var rawMessage = new RawMessage { Data = pdfBytes }; - 如果必须使用流,也可以不用特意调用
Flush(),因为MemoryStream基于内存,Flush()操作没有实际意义:MemoryStream pdfStream = new MemoryStream(pdfBytes); pdfStream.Position = 0; // 只需重置位置即可
- 可以直接用
- 正确处理异步方法:
SendRawEmailAsync是异步方法,建议添加await等待执行完成,避免流被提前回收:var response = await sesClient.SendRawEmailAsync(sendRequest);
内容的提问来源于stack exchange,提问作者nawaz uddin
相关产品推荐
相关产品推荐

