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.
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 unMemoryStream
a partir de la cadena para usarlo conMimeMessage.Load
.Aquí tienes un ejemplo:
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.