C# 无法在多封电子邮件中重复使用电子邮件附件
我目前正在MVC3中提供一个表单,供用户填写一些字段并附加一个文件。在提交时,我将发布的信息(连同附件)发送两次。。。一封发送给海报作为收据,另一封发送给另一封目标电子邮件 我遇到的问题是,第一封电子邮件被正确的附件成功发送。第二封电子邮件与大小为0的附加文件一起发送。似乎在我从文件上传中创建了附件对象之后,我不能再次重用它。使用调试器,我可以看到文件上载对象仍在内存中,但其ContentLength变为0 在下面的示例中,如果我将代码简化为:C# 无法在多封电子邮件中重复使用电子邮件附件,c#,asp.net-mvc-3,C#,Asp.net Mvc 3,我目前正在MVC3中提供一个表单,供用户填写一些字段并附加一个文件。在提交时,我将发布的信息(连同附件)发送两次。。。一封发送给海报作为收据,另一封发送给另一封目标电子邮件 我遇到的问题是,第一封电子邮件被正确的附件成功发送。第二封电子邮件与大小为0的附加文件一起发送。似乎在我从文件上传中创建了附件对象之后,我不能再次重用它。使用调试器,我可以看到文件上载对象仍在内存中,但其ContentLength变为0 在下面的示例中,如果我将代码简化为: public static void SendDu
public static void SendDummyEmail1()
{
using (var mailMessage = new MailMessage("from@email.com", "to@email.com"))
{
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();
将上载的文件存储在服务器上,并使用附件中的文件路径
var attachment = new Attachment(filePath, MediaTypeNames.Application.Octet);
发送电子邮件后,如果需要,请删除上载的文件。我想
\u fileUpload.InputStream.CanSeek
在您的情况下等于false
,这意味着您不能再次将其结束(位置=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), ...
}
使用内存流作为实例变量,而不是_fileUpload。
然后为每封电子邮件将其克隆到一个新的steam(因此没有多个消费者)。请记住在写入流后重置流,以便从开头开始读取附件,这并不能解释上述行为。用一个唯一的名称将文件保存到服务器上,并在发送后进行清理也是一件非常麻烦的事情。我的想法正是Dima,但它不起作用。这两封电子邮件都是用一个空的附件文件发送出去的。我的回答中有更新代码,你的解决方案看起来类似吗?你已经第一次将文件发布到服务器上了。因此,下次请求中没有文件时,请遵循此链接