SMTP 附件仅发送了几个字节

SMTP Attachement only a few bytes sent

我正在尝试将图片附加到我的电子邮件中。 我是这样做的。

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 只是一个域模型class 可序列化。

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 大小的文件的问题。