带有 .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 发送带有附件的邮件,但不会显示在收件人的收件箱中