首页 > 解决方案 > 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 我看不到我还能展示什么?它根本不像我想要的那样工作。

标签: c#asp.net-mvcsmtpclientmailmessage

解决方案


我发现了我的问题。

问题不在于我展示的内容。但我从哪里运行这个。

在我的测试方法中,我这样做了

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


推荐阅读