循环发送到多个电子邮件地址时,附件流变为 0 字节
Posted
技术标签:
【中文标题】循环发送到多个电子邮件地址时,附件流变为 0 字节【英文标题】:Attachments stream turns to 0 Byte when sending to multiple email addresses in loop 【发布时间】:2020-09-30 18:33:03 【问题描述】:我循环发送多个附件到电子邮件地址。附件正确地发送到列表中的第一个电子邮件地址,但是当它向前循环列表中的其他电子邮件地址时,参数中的附件流 - 模型的长度 i 变为 0。 e. 0 字节。
查看型号代码:
public class BulkMailViewModel
public string EmailTo get; set;
public string EmailSubject get; set;
public string EmailBody get; set;
public List<HttpPostedFileBase> Attachments get; set;
public BulkMailViewModel()
Attachments = new List<HttpPostedFileBase>();
控制器代码:下面的控制器方法运行用于发送电子邮件的电子邮件地址的循环。
public async Task<ActionResult> SendEmail(BulkMailViewModel model)
List<HttpPostedFileBase> attachments = new List<HttpPostedFileBase>();
bool isEmailSentMain = true;
if (model.Attachments != null && model.Attachments.Any())
foreach (var attachment in model.Attachments)
if (attachment != null)
attachments.Add(attachment);
string emailContent = System.Uri.UnescapeDataString(model.EmailBody);
try
List<string> clientEmails = new List<string>() ;
clientEmails.Add("abc@abc.com");
clientEmails.Add("pqr@pqr.com");
foreach (var email in clientEmails)
try
bool isEmailSent = false;
if (email != null && email != "")
isEmailSent = await SendBulkEmailAsync(email, model.EmailSubject, emailContent, attachments, true);
if (!isEmailSent)
isEmailSentMain = false;
catch (Exception e)
isEmailSentMain = false;
return Json(new status = isEmailSentMain, type = "continue", message = "Error while sending Email." );
catch (Exception e)
return Json(new status = false, message = e.ToString());
邮件方法代码:该方法实际发送邮件。
public async Task<bool> SendBulkEmailAsync(string emailTo, string emailSubject, string emailContent, List<HttpPostedFileBase> attachmentList, bool isBodyhtml = false)
List<HttpPostedFileBase> attachments = attachmentList;
using (SmtpClient smtp = new SmtpClient()
//My SMTP Settings
)
using (var message = new MailAddress("email@abc.com", emailTo))
if (attachments != null)
foreach (var attach in attachments)
string strFileName = System.IO.Path.GetFileName(attach.FileName);
attach.InputStream.Position = 0;
Attachment attachFile =
new Attachment(attach.InputStream, strFileName, attach.ContentType);
message.Attachments.Add(attachFile);
message.Subject = emailSubject;
message.Body = emailContent;
message.IsBodyHtml = isBodyHtml;
await smtp.SendMailAsync(message);
return true;
有人可以帮忙吗?
【问题讨论】:
如果每个人的电子邮件都相同,为什么不使用密件抄送一次发送所有邮件?无论如何,您遇到的问题是 SendMailAsync 读取流并且它甚至可能关闭它,因此您不能重用它。如果您不能一次全部发送,那么您必须在每次要发送一封电子邮件时创建一个流的副本。 这只是一个例子。实际上邮件来自数据库。 但是每个批次的所有收件人的内容是否相同? 是的,内容相同,但要单独发送给客户。 这就是密件抄送的作用,抄送(抄送)发送给每个收件人,但收件人看到其他收件人,密件抄送(密件抄送)将电子邮件单独发送给每个收件人。 【参考方案1】:您必须将attach.InputStream
的内容克隆到本地流中,以免被SendMailAsync
关闭:
foreach (var attach in attachments)
string strFileName = System.IO.Path.GetFileName(attach.FileName);
attach.InputStream.Position = 0;
MemoryStream tempStream = new MemoryStream();
attach.InputStream.CopyTo(tempStream);
tempStream.Position = 0;
Attachment attachFile =
new Attachment(tempStream, strFileName, attach.ContentType);
message.Attachments.Add(attachFile);
【讨论】:
您好抱歉回复晚了,有一些问题。这没有帮助。 嗨它已经解决了,我只需要将位置作为 0 给 tempStream。 对不起,复制后忘记倒带,更新答案。以上是关于循环发送到多个电子邮件地址时,附件流变为 0 字节的主要内容,如果未能解决你的问题,请参考以下文章
作为 System.Net.Mail 的附件的流是 0 字节
java: InputStreamReader将字节的输入流变成字符的输入流,OutputStreamWriter将字符的输出流变成字节的输出流