es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

MimeMessage.Load desde flujo de API de Gmail

Estamos utilizando .NET Core 3.1, MimeKit 2.11.0 y Google.Apis.Gmail.v1 1.51.0.2251 para obtener mensajes de Gmail. Nos gustaría recuperar el mensaje de la API REST como un flujo de datos y luego pasar ese flujo al método MimeMessage.Load.

Hemos definido la siguiente función para obtener el mensaje de correo electrónico:

cs
private Stream GetMessageDetails(string messageId, FormatEnum format)
{
var req = gmailService.Users.Messages.Get("test@gmail.com", messageId);
req.Format = format;
return req.ExecuteAsStream();
}

Y luego lo llamamos de la siguiente manera:

cs
using (var messageStream = GetMessageDetails("MESSAGE_ID", FormatEnum.Raw))
{
MimeMessage mimeMsg = MimeMessage.Load(messageStream);
}

Cuando ejecutamos el código anterior, obtenemos una excepción:


Error al analizar las cabeceras del mensaje.

Hemos probado tanto con FormatEnum.Raw como con FormatEnum.Full, pero obtuvimos la misma excepción. ¿Cómo podemos cargar el mensaje usando MimeKit sin cargar todo el mensaje en memoria primero? Somos conscientes del enfoque de decodificar en base 64 el contenido “Raw” del mensaje, pero eso requiere cargar todo el mensaje en memoria, lo cual no es lo que queremos.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema parece ser que la respuesta de la API de Gmail no está en un formato que MimeKit pueda analizar directamente. Para solucionar esto, puedes usar el formato Raw para recuperar el contenido del mensaje como una cadena, y luego crear un MemoryStream a partir de la cadena para usarlo con MimeMessage.Load.

    Aquí tienes un ejemplo:

    private Stream GetMessageDetails(string messageId, FormatEnum format)
    {
        var req = gmailService.Users.Messages.Get("test@gmail.com", messageId);
        req.Format = format;
        var response = req.Execute();
    
        if (format == FormatEnum.Raw)
        {
            var content = response.Raw;
            var bytes = Convert.FromBase64String(content);
            return new MemoryStream(bytes);
        }
        else
        {
            var stream = new MemoryStream();
            response.WriteTo(stream);
            return stream;
        }
    }
    

    Con este código, puedes recuperar el contenido del mensaje como un flujo utilizando el valor FormatEnum.Raw, y sin cargar todo el mensaje en la memoria.

Comments are closed.