【问题标题】:Gmail api with .Net CLient library: Missing draft message [400]带有 .Net 客户端库的 Gmail api:缺少草稿消息 [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] 

【问题讨论】:

标签: c# .net google-api gmail-api


【解决方案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"
                 }
             }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2014-11-22
        • 1970-01-01
        • 1970-01-01
        • 2017-06-17
        • 2020-04-24
        • 2014-10-13
        • 2017-01-19
        • 2013-05-22
        • 2019-04-25
        相关资源
        最近更新 更多