Gmail api读取/解码消息c#

问题描述 投票:1回答:2

我在c#应用程序中使用新的gmail api,我想知道在使用get方法获取消息后如何读取消息正文?我可以从消息的“Raw”属性中获取MailMessage对象(要使用this从mailMessage创建Raw,有没有办法将其转换回来?),或者我需要使用“Payload”属性?

这是我的代码:( ListMessages和GetMessage方法来自谷歌网站上的API参考)

List<Message> msgList = ListMessages(gs, "me", "is:unread");

string id = msgList[0].Id;
Message msg = GetMessage(gs, "me", id);

怎么办?

请帮忙。

谢谢。

c# gmail-api
2个回答
1
投票

从API,你的消息(1)Payload MessagePart类型的(2)属性。 MessagePart有一个Body MessagePartBody类型的(3)属性,它最终有一个字符串Data属性。

数据是消息的内容,因此(使用您的示例代码)获取消息,您将执行以下操作:

msg.Payload.Body.Data

从那里开始,你如何使用它取决于你,尽管你必须要知道该值中可能有HTML,也可能没有。从API参考中,我们也看到了Payload的Parts属性:

对于非容器MIME消息部件类型(例如text / plain),此字段为空

所以你可以假设如果msg.Payload.Parts不包含任何元素,那么它就是纯文本消息。


0
投票

Gmail API不易于使用。他们真的给用户留下了很多东西才能弄明白。

您将需要使用递归来获取正确的结构并对消息进行一些解码。如果有附件和发送客户端,JSON的结构将根据消息的格式而有很大差异。

这个guide完全解释了如何处理提取正文的HTML和纯文本版本。

这里是指南中显示如何提取身体部位的部分代码:

public static void ExtractMessagePart(MessagePart part, ref EmailMessageModel message)
{
    if (part == null)
        return;

    var contentDisposition = part.Headers?.FirstOrDefault(h => h.Name == "Content-Disposition");
    if (contentDisposition != null && (contentDisposition.Value.StartsWith("attachment") || contentDisposition.Value == "inline"))
    {
        message.Attachments.Add(new DragnetTech.EventProcessors.Email.EmailMessageModel.Attachment
        {
            AttachmentId = part.Body.AttachmentId,
            Filename = part.Filename,
            ContentID = contentDisposition.Value.StartsWith("inline") || part.Headers?.FirstOrDefault(h => h.Name == "Content-ID") != null ? Utils.UnescapeUnicodeCharacters(part.Headers.FirstOrDefault(h => h.Name == "Content-ID")?.Value) : null,
            Size = part.Body.Size ?? 0,
            ExchangeID = part.Body.AttachmentId,
            Data = part.Body.Data,
            ContentType = part.Headers?.FirstOrDefault(h => h.Name == "Content-Type")?.Value
        });
    }
    else
    {
        if (part.MimeType == "text/plain")
        {
            message.Body = DecodeSection(part.Headers?.FirstOrDefault(h => h.Name == "Content-Transfer-Encoding")?.Value, part.Body?.Data);
            message.IsHtml = false;
        }
        else if (part.MimeType == "text/html")
        {
            message.Body = DecodeSection(part.Headers?.FirstOrDefault(h => h.Name == "Content-Transfer-Encoding")?.Value, part.Body?.Data);
            message.IsHtml = true;
        }
    }


    if (part.Parts != null)
    {
        foreach (var np in part.Parts)
        {
            ExtractMessagePart(np, ref message);
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.