Closedxml: не могу скачать файл и сразу отправить его по почте - PullRequest
2 голосов
/ 23 марта 2019

Я хочу скачать файл Excel и автоматически отправить файл на почтовый адрес. Загрузка файла работает, но когда я включаю код для отправки писем, он генерирует исключение FileNotFoundException: «Не удалось найти файл» C: \ Users \ Пользователь \ source \ repos \ Project \ Taijitan \ Taijitan \ O soto gari.xlsx '. .

Я заметил, что при загрузке файла он автоматически переходит в папку «Загрузки» на моем компьютере. Когда я раскомментирую почтовый код, он, похоже, не загружается, а просто загружается перед выдачей ошибки, о которой я упоминал выше. Я попытался использовать Path.GetFullPath (name), чтобы найти файл Excel, чтобы мне не пришлось жестко задавать какие-либо пути (на случай, если у кого-то из моих коллег другой путь), но, похоже, он не работает.

Контроллер

 public IActionResult GenerateList(int id)
    {
        Lesson lesson = _lessonRepository.GetBy(id);
        var download = lesson.GetCommentsList();
        string file = lesson.Name + ".xlsx";
        MailSender.SendListMail(lesson.Name, file);
        return download;
    }

Создать Excel + скачать

    public List<Comment> Comments { get; set; }
    public IActionResult GetCommentsList()
    {
        List<string> list = new List<string>();
        var wb = new XLWorkbook();
        var ws = wb.Worksheets.Add("Comments");
        foreach (var comment in Comments)
        {
            list.Add(comment.Body);
        }

        string name = Name + "comment";
        ws.Cell(1, 1).Value = name;
        ws.Range(1, 1, 1, 1).AddToNamed("Titles");
        var CommentsRange = ws.Cell(2, 1).InsertData(list.AsEnumerable());
        var titlesStyle = wb.Style;
        titlesStyle.Font.Bold = true;
        titlesStyle.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
        titlesStyle.Fill.BackgroundColor = XLColor.Blue;
        titlesStyle.Font.FontColor = XLColor.White;
        wb.NamedRanges.NamedRange("Titles").Ranges.Style = titlesStyle;
        ws.Columns().AdjustToContents();
        wb.SaveAs(name + ".xlsx");

        using (var stream = new MemoryStream())
        {

            wb.SaveAs(stream);
            stream.Flush();
            return new FileContentResult(stream.ToArray(),
                "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
            {
                FileDownloadName = name + ".xlsx"
            };
        }
    }

MailSender

 public static void SendListMail(string list, string file)
    {
        MailAddress Sender = new MailAddress("SenderEmail@gmail.com", "CommentsSender");
        MailAddress Receiver = new MailAddress("ReceiverEmail@gmail.com", "Comments inbox");
        const string SenderPassword = "password123";

        string Attachment = Path.GetFullPath(file);

        SmtpClient smtp = new SmtpClient
        {
            Host = "smtp.gmail.com",
            Port = 587,
            EnableSsl = true,
            DeliveryMethod = SmtpDeliveryMethod.Network,
            UseDefaultCredentials = false,
            Credentials = new NetworkCredential(Sender.Address, SenderPassword),
            Timeout = 30000
        };
        using (MailMessage message = new MailMessage(Sender, Receiver)
        {
            Subject = list,
            Body = "List in attachment",
            Attachments = {new Attachment(Attachment)}

        })
        {
            smtp.Send(message);
        }
    }

Я пытаюсь выяснить, где это идет не так и как я могу решить это. Я предполагаю, что это как-то связано с синхронизацией (не отправляйте почту, пока загрузка не будет завершена) и Path.GetFullPath () не проверяет вне папки решения.

EDIT Просто заметил, что когда я пытаюсь отправить электронное письмо без вложения, оно отправляет почту, но ничего не загружает, а значок загрузки на вкладке продолжает вращаться.

РЕДАКТИРОВАТЬ 2 Выяснил первую проблему, размещение оператора возврата в методе загрузки вызвало цикл. Теперь я все еще не могу найти ошибку файла.

1 Ответ

0 голосов
/ 24 марта 2019

Проблема оказалась глупой ошибкой. Файл был сохранен со значением 'name' (file.Name + "comment.xlsx", но отправитель загрузки / электронной почты искал file.Name + ".xlsx" (в его имени не было "comment")

...