【问题标题】:Gmail api read/decode message c#Gmail api读取/解码消息c#
【发布时间】:2015-03-13 11:02:01
【问题描述】:

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


    【解决方案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 不包含任何元素,则它是纯文本消息。

    【讨论】:

    • 感谢 Tieson T. 我如何从原始属性中获取 MailMessage 对象?
    • Payload 属于MessagePart 类型,其中包含MimeType 属性,因此无需假设它是纯文本还是HTML 或其他,您只需检查即可。
    • @Lerner:如果您使用AE.Net.Mail.MailMessage.Save 将邮件消息转换为原始消息,那么AE.Net.Mail.MailMessage.Load 可能会反过来。我没有这个包的经验,所以不知道它是否能达到你想要的效果或效果如何。
    【解决方案2】:

    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);
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-09-08
      • 2015-04-16
      • 2017-09-18
      • 2016-06-01
      • 2019-06-06
      • 1970-01-01
      • 2016-03-18
      • 1970-01-01
      • 2018-01-17
      相关资源
      最近更新 更多