Gmail api读取/解码消息c#

时间:2015-01-15 04:36:39

标签: c# gmail-api

我在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);

现在是什么?

请帮忙。

感谢。

2 个答案:

答案 0 :(得分:1)

通过API,您的邮件(1)Payload属性类型为MessagePart (2)。 MessagePart具有Body (3)类型的MessagePartBody属性,(最终)具有字符串Data属性。

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

msg.Payload.Body.Data

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

  

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

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

答案 1 :(得分: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);
        }
    }
}