SMTP Attachement отправлено всего несколько байтов - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь прикрепить изображение к моей электронной почте.Я делаю это так.

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 килобайт.Поэтому я не знаю, как я могу описать свою проблему более ясно.Моя отладка сводится к тому, что я пробовал разные подходы, некоторые из них не работали, некоторые - небольшое изменение вышеупомянутогоУ всех одна и та же проблема с повреждением файла.

Если есть что-то конкретное, что вам нужно, чтобы я показал, чтобы помочь мне, я буду рад предоставить, но я не вижу, что еще я могу показать?Это просто не работает, как я хотел.

1 Ответ

0 голосов
/ 07 июня 2018

Я нашел свою проблему.

проблема была не в том, что я показал.но откуда я это бежал.

в моем тестовом методе я сделал это

   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);
        }

и это решило мою проблему получения поврежденного файла размером всего в несколько байтов вместо получения файла размером 20 КБ.

...