Чтение данных вложений Excel в C# из необработанного сообщения MIME, отправленного SendGrid

У меня есть SendGrid, отправляющая входящие электронные письма как необработанные сообщения MIME на мой C# API. Вот пример сырой полезной нагрузки. Я хочу иметь возможность открывать вложения Excel из входящего сообщения MIME и читать данные строки и столбца.

Как только API получает сообщение, я использую MimeKit для обработки вложений следующим образом (предположим, что здесь мы имеем дело только с вложениями.xlsx):

using (var emailSream = GenerateStreamFromString(emailString))
{
    var msg = MimeMessage.Load(emailSream);

    foreach (var attachment in msg.Attachments)
    {
        //  I want to be able to read the columns and rows of the excel sheet here.  
        //  I am already able to skip over any non-excel type attachments without issue.
    }
}

Где GenerateStreamFromString определяется как:

private Stream GenerateStreamFromString(string s)
{
    MemoryStream stream = new MemoryStream();
    StreamWriter writer = new StreamWriter(stream);
    writer.Write(s);
    writer.Flush();
    stream.Position = 0;
    return stream;
}

Я попытался загрузить поток вложения в Excel Data Reader:

using (var attachmentStream = ((MimePart)attachment).ContentObject.Stream)
{
    IExcelDataReader reader = ExcelReaderFactory.CreateOpenXmlReader(attachmentStream);
    //  Reader has "Cannot Find Central Directory" error.
}

Как и через EPPlus

var attachmentStream = ((MimePart)attachment).ContentObject.Stream
using (ExcelPackage package = new ExcelPackage(attachmentStream))
{
    //  Errors are thrown before we get here.
}

Но оба пакета выдают ошибки, что приводит меня к мысли, что я не получаю поток данных должным образом из сообщения MIME.

Любая помощь или мысли с благодарностью, заранее спасибо.

1 ответ

Решение

Doh! Нужно было декодировать вложение (SendGrid даже предоставил мне информацию о кодировке, я просто плохо слушал):

using (var attachmentStream = new MemoryStream())
{
    ((MimePart)attachment).ContentObject.DecodeTo(attachmentStream);
    attachmentStream.Position = 0;
    IExcelDataReader reader = ExcelReaderFactory.CreateOpenXmlReader(attachmentStream);
}

Задача решена!

Другие вопросы по тегам