无法在多封电子邮件中重复使用电子邮件附件 - c#

我目前正在MVC3中为用户提供一个表单,以供用户填写某些字段并附加文件。提交后,我将发布的信息(及其附件)发送两次...一个作为收据发送给发布者,第二个作为另一份目标电子邮件。

我遇到的问题是使用正确的Attachemnt成功发送了第一封电子邮件。将发送第二封电子邮件,附件大小为0。从文件上传中创建附件对象后,似乎无法再次使用它。使用调试器,我可以看到文件上传对象仍在内存中,但是其ContentLength变为0。

因此,在以下示例中,如果我将代码简化如下:

public static void SendDummyEmail1()
{
    using (var mailMessage = new MailMessage("[email protected]", "[email protected]"))
    {
        mailMessage.Subject = "Email Subject"
        mailMessage.Body = Razor.Parse(template, (dynamic)dynamicTokens);
        mailMessage.IsBodyHtml = true;

        if (_fileUpload != null && _fileUpload.ContentLength > 0)
        {
            var attachment = new Attachment(_fileUpload.InputStream, _fileUpload.FileName, MediaTypeNames.Application.Octet);
            attachment.ContentDisposition.FileName = Path.GetFileName(_fileUpload.FileName);
            mailMessage.Attachments.Add(attachment);
        }

        SendMail(mailMessage);
    }
}

public static void SendMail(MailMessage message)
{
    var client = new SmtpClient
    {
        Host = ConfigurationManager.AppSettings[SmtpHostname],
        Port = Convert.ToInt32(ConfigurationManager.AppSettings[SmtpPortNumber]),
        UseDefaultCredentials = true,
        Credentials = CredentialCache.DefaultNetworkCredentials,
        DeliveryMethod = SmtpDeliveryMethod.Network,
        EnableSsl = true,  
    };

    // Work around remote certificate validation
    // Ref: http://stackoverflow.com/questions/777607/the-remote-certificate-is-invalid-according-to-the-validation-procedure-using
    ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

    client.Send(message);
}

如果我连续两次调用上述方法,则第一封电子邮件将成功通过。第二封电子邮件将通过但没有附件,因为ContentLength变为0。

SendDummyEmail1();
SendDummyEmail1();

参考方案

我想在您的情况下_fileUpload.InputStream.CanSeek等于false,这意味着您无法再次将其关闭(Position = 0)并从中读取内容。尝试先将上传的文件流复制到内存流中,然后使用它代替初始流,如下所示:

MemoryStream ms = new MemoryStream();
_fileUpload.InputStream.CopyTo(ms);
byte[] data = ms.ToArray();
SendDummyEmail1(data);
SendDummyEmail1(data);

public static void SendDummyEmail1(byte[] fileContent)
{
 ...
 var attachment = new Attachment(new MemoryStream(fileContent), ...
}

ASP.NET MVC 5自定义登录,无需脚手架,数据库优先 - c#

我对asp.net和mvc还是很陌生,所以我正在努力学习尽可能多的知识...为此,我从头开始编写博客网站,但是我对身份验证和授权有些困惑。由于我倾向于不真正使用任何脚手架的东西,所以我首先要使用数据库,所以不希望asp.net身份为我创建表。我对散列和加盐密码很酷,并对照数据库检查用户,我遇到的麻烦是将用户设置为登录状态并检查他们应该能够访问什么。我真的很想…

ASP.NET MVC ExecuteResult与ActionResult - c#

我见过它用来向响应添加标头,然后返回文件进行流传输。public override void ExecuteResult(ControllerContext context) { ... response.AddHeader("Accept-Ranges", "bytes"); response.AddHeader(&…

ddl在服务器中未更新-asp.net - javascript

我在ASP.NET c#上工作。我有一个DropDownList。 (runat =“ server”)在$ {document).ready上,我更新了它的值:$(document).ready(function () { document.getElementById("ddl").value = "abc"; ……

asp.net mvc或javascript将另一页的结果返回给方法 - c#

是否可以将另一个页面的结果返回给JavaScript方法或C#控制器操作?我有一个共享的复杂页面,该页面在我的网站上遍布使用,当前用于在C#后端的用户数据上设置单个变量。当用户完成共享的复杂页面后,我将返回引用页面。当用户在刷新或返回时将其作为url参数传递给返回的页面时,我返回的页面包含新选择的变量。我有一个新页面,我希望从我的共享复杂页面中返回该变量。但…

MVC C#TempData - c#

有人可以解释一下MVC中TempData的目的。我了解它的行为类似于ViewBag,但除此之外它还有什么作用。 参考方案 TempData应该是一个短暂的实例,您应该 仅在当前和后续请求中使用它!以来 TempData以这种方式工作,您需要确定下一步 要求,并且重定向到另一个视图是您唯一的时间 可以保证这一点。因此,唯一使用TempData的方案 在重定向时…