循环发送到多个电子邮件地址时,附件流变为 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 字节的主要内容,如果未能解决你的问题,请参考以下文章

Python+selenium自动循环发邮件

udp 服务端 | udp 客户端 --循环发消息

如何在 PyQt 中向事件循环发出自定义事件

Cakephp 发送电子邮件,附件发送为 0 字节

作为 System.Net.Mail 的附件的流是 0 字节

java: InputStreamReader将字节的输入流变成字符的输入流,OutputStreamWriter将字符的输出流变成字节的输出流