[英]MimeMessage.Load from Gmail API stream
我們正在使用.NET Core 3.1
、 MimeKit 2.11.0
和Google.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.Raw
和FormatEnum.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.