c# - SMTP Attachement 只发送了几个字节
问题描述
我正在尝试将图像附加到我的电子邮件中。我正在这样做。
SmtpClient smtpClient = new SmtpClient();
MailMessage mailDSS = new MailMessage();
//Setting From , To and CC
mailDSS.From = new MailAddress(billModel.Email, "from: " + billModel.Email);
mailDSS.To.Add(new MailAddress("username@email.com"));
mailDSS.Subject = "This is my subject";
mailDSS.Attachments.Add(new Attachment(billModel.UploadedBill.Path + billModel.UploadedBill.Filename));
mailDSS.Attachments.Add(aAttachment);
mailDSS.Body = "This is the content :" + billModel.Name;
smtpClient.Send(mailDSS);
它可以工作,但是当我尝试将其更改为内存流时它不起作用。这就是我想要做的工作:
mailDSS.From = new MailAddress(billModel.Email, "from: " + billModel.Email);
mailDSS.To.Add(new MailAddress("username@email.com"));
mailDSS.Subject = "This is my subject";
billModel.UploadedBill.FileDataStream.Seek(0,SeekOrigin.Begin);
Attachment aAttachment = new Attachment(billModel.UploadedBill.FileDataStream, billModel.UploadedBill.Filename);
aAttachment.ContentDisposition.FileName = billModel.UploadedBill.Filename;
mailDSS.Attachments.Add(aAttachment);
mailDSS.Body = "This is the content :" + billModel.Name;
smtpClient.Send(mailDSS);
我究竟做错了什么 ?两者之间的唯一区别是一个是对磁盘上文件的引用,另一个是对流中文件的引用=?
BillModel 只是一个可序列化的领域模型类。
public class BillModel
{
public string Name { get; set; }
public string CivilRegistrationNo { get; set; }
public string Email { get; set; }
public int Phone { get; set; }
public int RegNo { get; set; }
public int AccountNo { get; set; }
public string PaymentGuarentee { get; set; }
[XmlIgnore]
public MemoryFileStream UploadedBill { get; set; }
}
编辑:没有错误消息,电子邮件发送正常,但附件只有 227 字节,附件应该是 20 KB。所以我不知道如何才能清楚地描述我的问题。我的调试相当于尝试不同的方法,有些方法不起作用,有些是上述方法的一个小变化。所有人都有损坏文件的相同问题。
如果您需要我展示某些特定内容以帮助我,我将很乐意提供,但 atm 我看不到我还能展示什么?它根本不像我想要的那样工作。
解决方案
我发现了我的问题。
问题不在于我展示的内容。但我从哪里运行这个。
在我的测试方法中,我这样做了
using (System.IO.Stream fileData = System.IO.File.OpenRead(TestFilenamePath))
{
string filenamePath = aBillModel.UploadedBill.Path + filename;
using (System.IO.FileStream newFileData = System.IO.File.Create(filenamePath))
{
fileData.Position = 0;
fileData.CopyTo(newFileData);
}
fileData.CopyTo(aBillModel.UploadedBill.FileDataStream);
//Perform Action to be tested
bool emailSendt = EmailSender.Send(aBillModel);
//Test Result of Action
Assert.That(emailSendt, Is.True);
}
显然,我不能既将数据写入磁盘上的某个位置,同时又通过电子邮件发送。所以我这样做了。
using (System.IO.Stream fileData = System.IO.File.OpenRead(TestFilenamePath))
{
string filenamePath = aBillModel.UploadedBill.Path + filename;
using (System.IO.FileStream newFileData = System.IO.File.Create(filenamePath))
{
fileData.Position = 0;
fileData.CopyTo(newFileData);
}
}
using (System.IO.Stream fileData = System.IO.File.OpenRead(TestFilenamePath))
{
fileData.CopyTo(aBillModel.UploadedBill.FileDataStream);
//Perform Action to be tested
bool emailSendt = EmailSender.Send(aBillModel);
//Test Result of Action
Assert.That(emailSendt, Is.True);
}
它解决了我接收只有几个字节大小的损坏文件而不是获取 20Kb 大小的文件的问题。
推荐阅读
- asp.net-mvc - Ajax 在发布到 azure 后无法在 ASP .NET 上运行
- python - DataFrame 追加问题
- phpmyadmin - 是否可以根据 phpmyadmin 上的选择隐藏列字段?
- postgresql - Sequalize:比较 where 子句中包含的父列和子列
- python - Django:如何返回视图然后执行结束代码?
- excel - 从几个较小的表中填充 2 列的长表
- c# - 在 C# 中使用密钥和密钥调用 API
- javascript - 实时数据库中的预定键
- java - 如何根据父对象和子对象的属性获取一对多关联对象
- chart.js - 时间图上有多条线时的 ChartJS 工具提示