【发布时间】:2021-10-04 14:36:54
【问题描述】:
得到了一个 MemoryStream,它被用作电子邮件的附件。 SmtpClient.SendMessageCallback 导致异常“流不支持读取”。可能有什么问题?谢谢你的帮助! 简化后,代码如下:
public Stream GetMemoryStream()
{
...
var ms = new MemoryStream(fileBytes)
{
Position = 0
};
return ms;
}
public void MailWithAttachment()
{
using (Stream ms = GetMemoryStream())
{
ms.Position = 0;
await MailAttachment(ms, "myPicture.jpg");
}
}
public Task MailAttachment(Stream stream, string fileName)
{
...
System.Net.Mime.ContentType ct = new System.Net.Mime.ContentType(System.Net.Mime.MediaTypeNames.Image.Jpeg);
System.Net.Mail.Attachment attachment = new System.Net.Mail.Attachment(stream, ct);
attachment.ContentDisposition.FileName = fileName;
mail.Attachments.Add(attachment);
...
await client.SendMailAsync(mail);
}
【问题讨论】:
-
发布实际代码和异常,而不是简化代码。您发布的代码不包含任何数据。没有什么可读的
-
await在void方法中? -
你在任何试图读取它之前处置了 MemoryStream,读取它。请注意
MailAttachment是async void,这意味着调用者无法知道邮件何时完成。另请注意,MailWithAttachment不await调用MailAttachment,并立即处理ms。所以ms在SendMailAsync完成之前很久就被处理掉了。这是我们告诉新手不要使用async void的原因之一。使您的MailAttachment方法async Task和await来自MailWithAttachment -
码流长度为2068488。
-
@canton7 供参考,在编辑中:
MailAttachmentis 现在等待;然而,MailAttachment显然也是伪代码,因为它也有await而没有async;致 OP:请发布真实代码 - 细节很重要很多,而你却对我们隐瞒了
标签: c# asp.net-core smtpclient