簡體   English   中英

MimeMessage.Load from Gmail API stream

[英]MimeMessage.Load from Gmail API stream

我們正在使用.NET Core 3.1MimeKit 2.11.0Google.Apis.Gmail.v1 1.51.0.2251來獲取 Z7D53CBD3F0C0E2AF321C3BA1EAB940 消息。 我們想從 REST API 作為 stream 檢索消息,然后將MimeMessage.Load方法傳遞給 Mime6C52A2EB7B4。

我們定義了以下 function 來獲取 email 消息:

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

然后我們這樣稱呼它:

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

當我們運行上面的代碼時,我們得到一個異常:

Failed to parse message headers.

我們嘗試了FormatEnum.RawFormatEnum.Full ,但我們得到了同樣的例外。 我們如何使用MimeKit加載消息而不首先將整個消息加載到 memory 中? 我們知道 base 64 解碼消息的Raw內容的方法,但它需要將整個消息加載到 memory 中,這不是我們想要的。

using (var rawStream = GetMessageDetails("MESSAGE_ID", FormatEnum.Raw))
{
    using (var filtered = new FilteredStream(rawStream))
    {
        filtered.Add(DecoderFilter.Create(ContentEncoding.Base64));

        MimeMessage mimeMsg = MimeMessage.Load(filtered);
    }
}

I have not figured out how to load this from a stream, because the stream return JSON and not just the raw base64 Mime.

話雖如此,您可以獲取返回的消息並使用 Raw 屬性來加載 MimeMessage。 請注意,Gmail 在其編碼中包含討厭的下划線。 如果有人能找出 stream 那就太好了,但現在,我的工作解決方案如下。 請記住,它沒有使用流,並且被編寫為描述性的而不是優化的。

using (var gmail = await GetGmailService(providerInfo, refreshToken).ConfigureAwait(false))
{
    var request = gmail.Users.Messages.Get(emailAddress, GoogleId);
    request.QuotaUser = emailAddress;
    request.Format = UsersResource.MessagesResource.GetRequest.FormatEnum.Raw;

    var msg = await request.ExecuteAsync().ConfigureAwait(false);

    var base64Encoded = msg.Raw.Replace(",", "=").Replace("-", "+").Replace("_", "/");

    using (var memStream = new System.IO.MemoryStream(base64Encoded.ToBytes()))
    {
        var streamWriter = new System.IO.StreamWriter(memStream);
        streamWriter.Write(base64Encoded);
        streamWriter.Flush();

        memStream.Position = 0;

        using (var filtered = new MimeKit.IO.FilteredStream(memStream))
        {
            filtered.Add(MimeKit.IO.Filters.DecoderFilter.Create(ContentEncoding.Base64));

            MimeMessage mimeMsg = MimeMessage.Load(filtered);
            Console.WriteLine(mimeMsg.MessageId);
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM