带有 .Net 客户端库的 Gmail api:缺少草稿消息 [400]

Posted

技术标签:

【中文标题】带有 .Net 客户端库的 Gmail api:缺少草稿消息 [400]【英文标题】:Gmail api with .Net CLient library: Missing draft message [400] 【发布时间】:2014-08-30 16:12:08 【问题描述】:

我正在尝试使用 .Net 客户端库在 Gmail 中创建草稿。我可以成功登录并检索草稿列表,因此身份验证和 api 正在工作。现在我需要创建 Draft 类的实例并将其发送到 API。但是消息草稿需要是什么样的呢?我在https://developers.google.com/gmail/api/v1/reference/users/drafts/create 上的 API 资源管理器中填写什么并不重要,我的草稿始终是空的。 另外,从我的 C# 代码中执行此操作时,我需要将 draft.Message.Raw 字段设置为其他内容,我收到错误:

Missing draft message [400] 

【问题讨论】:

在 ruby​​ 中遇到同样的问题***.com/questions/25493213/… 【参考方案1】:

使用客户端库,您可以将 base64 编码的电子邮件设置为消息的原始属性,然后将该消息用作草稿的消息属性。

更一般地说: 草稿消息由一个 id 和一个消息资源组成 https://developers.google.com/gmail/api/v1/reference/users/drafts


  "id": string,
  "message": users.messages Resource

消息资源应将其“原始”字段设置为 base64 编码的 RCF 2822 格式字符串。

例如:

from: me@email.com
to: you@email.com
subject: test email

email body

作为base64编码的字符串是:

ZnJvbTogbWVAZW1haWwuY29tDQp0bzogeW91QGVtYWlsLmNvbQ0Kc3ViamVjdDogdGVzdCBlbWFpbA0KDQplbWFpbCBib2R5

因此,draft.create 的请求正文应如下所示:


  "message": 
    "raw": "ZnJvbTogbWVAZW1haWwuY29tDQp0bzogeW91QGVtYWlsLmNvbQ0Kc3ViamVjdDogdGVzdCBlbWFpbA0KDQplbWFpbCBib2R5"
  

【讨论】:

【参考方案2】:

直到今天我都在为此苦苦挣扎。

我所做的是调整此链接上的解决方案以用于草稿。 http://jason.pettys.name/2014/10/27/sending-email-with-the-gmail-api-in-net-c/

Jason 使用名为 AE.Net.Mail 的 nuget 将邮件对象序列化为 RFC 2822。

我所做的是我安装了两个 nugets

Install-Package Google.Apis.Gmail.v1
Install-Package AE.Net.Mail

然后我创建了两个方法

static GmailService Service;
    public static void CriaService(string emailaConectar)
    
        var certificate = new X509Certificate2(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ClientCredentials.CertificatePath), ClientCredentials.ClientSecret, X509KeyStorageFlags.Exportable);

        var credential = new ServiceAccountCredential(
            new ServiceAccountCredential.Initializer(ClientCredentials.ServiceAccountEmail)
            
                Scopes = new[]  GmailService.Scope.GmailCompose ,
                User = emailaConectar
            .FromCertificate(certificate))  ;

        Service = new GmailService(new BaseClientService.Initializer()
        
            HttpClientInitializer = credential,
            ApplicationName = ClientCredentials.ApplicationName,
        );
    

    private static string Base64UrlEncode(string input)
    
        var inputBytes = System.Text.Encoding.ASCII.GetBytes(input);
        // Special "url-safe" base64 encode.
        return Convert.ToBase64String(inputBytes)
          .Replace('+', '-')
          .Replace('/', '_')
          .Replace("=", "");
    

在我的 Main 方法上我是这样设计的

        CriaService("xpto@gmail.com");

        var msg = new AE.Net.Mail.MailMessage
        
            Subject = "Your Subject",
            Body = "Hello, World, from Gmail API!",
            From = new MailAddress("xpto@gmail.com")
        ;
        msg.To.Add(new MailAddress("someone@gmail.com"));
        msg.ReplyTo.Add(msg.From); 
        var msgStr = new StringWriter();
        msg.Save(msgStr);

        Message m = new Message();
        m.Raw = Base64UrlEncode(msgStr.ToString());

        var draft = new Draft();
        draft.Message = m;

        try
        
            Service.Users.Drafts.Create(draft, "xpto@opportunity.com.br").Execute();
        
        catch (Exception ex)
        
            Console.WriteLine(ex.Message);
        

【讨论】:

【参考方案3】:

message > raw 应该是完整的 SMTP 邮件。


    "message": 
      "raw": "From: me@example.com\nTo:you@example.com\nSubject:Ignore\n\nTest message\n"

或者,您也可以在message > payload 中设置相应的字段:


    "message": 
      "payload": 
          "headers": 
              "name": "From", "value": "me@example.com,
              "name": "To", "value": "you@example.com",
              "name": "Subject", "value":"Ignore"
           ,
           "body": 
              "data": "Test message"
           
       
    

【讨论】:

以上是关于带有 .Net 客户端库的 Gmail api:缺少草稿消息 [400]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有 OAuth 令牌的 Asp.Net MVC 中的 gmail API 更快地获取日期明智的电子邮件

收件人地址需要带有 JavaScript 的 gmail api

使用 Gmail 新 API 发送带有附件的邮件,但不会显示在收件人的收件箱中

用于发送带有附件的电子邮件的 GMAIL API

通过 Gmail API 发送带有纯文本回退的 HTML 电子邮件

如何在 asp.net 中使用 gmail api [重复]