2016-09-08 3 views
1

J'ai SendGrid en train d'envoyer des courriels entrants en tant que messages MIME bruts à mon API C#. Here is an example of the raw payload. Je souhaite être en mesure d'ouvrir les pièces jointes Excel à partir du message MIME entrant et de lire les données de ligne et de colonne.Lecture de données de pièce jointe Excel en C# à partir d'un message MIME brut publié par SendGrid

Une fois que l'API reçoit le message, j'utilise MimeKit pour traiter les pièces jointes comme suit (supposons que nous ne traitons avec des pièces jointes .xlsx ici):

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. 
    } 
} 

Où GenerateStreamFromString est défini comme:

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

J'ai essayé de charger le flux de fixation dans Excel Data Reader:

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

ainsi que par EPPlus

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

Mais les deux paquets jettent des erreurs, ce qui me conduit à croire que je ne reçois pas le flux de données correctement du message MIME.

Toute aide ou réflexion est grandement appréciée, merci d'avance.

Répondre

2

Doh! Nécessaire pour décoder la pièce jointe (SendGrid même fourni les informations de codage pour moi, je n'ai pas écouté bien):

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

Problème résolu!