Gmail API 创建和发送电子邮件 .NET C#
Gmail API Create and Send Email .NET C#
问题
我正在尝试将 Gmail API 实施到 API 应用程序中。我创建了一个服务帐户并保存了 p12 密钥和 json 凭据。我在谈论失败的先决条件时遇到异常。我认为这可能与我要发送的消息有关。
代码
String serviceAccountEmail = "SERVICE-ACC-EMAIL";
X509Certificate2 certificate = new X509Certificate2("./key.p12", "notasecret", X509KeyStorageFlags.Exportable);
// FileStream stream = new FileStream("./credentials.json", FileMode.Open, FileAccess.Read); // ! Not Used
ServiceAccountCredential credential = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(serviceAccountEmail)
{
User = serviceAccountEmail,
Scopes = new[] { GmailService.Scope.MailGoogleCom }
}.FromCertificate(certificate));
GmailService service = new GmailService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = "Testing Application",
});
var result = service.Users.Messages.Send(CreateEmail.CreateEmailMessage(), "me").Execute();
异常
An unhandled exception of type 'Google.GoogleApiException' occurred in System.Private.CoreLib.dll: 'Google.Apis.Requests.RequestError
Precondition check failed. [400]
Errors [
Message[Precondition check failed.] Location[ - ] Reason[failedPrecondition] Domain[global]
]'
构建邮件消息(不起作用)
在 CreateEmail.CreateEmailMessage 方法中,我建立了 Google.Apis.Gmail.v1.Data.Message 的新实例。设置有效负载和 headers。以此为参考。我不确定这是否是这样做的方式,但我似乎无法找到创建新消息的方法。我只能找到用 Java 或 Python 编写的内容,我尝试将其翻译成 C#,但失败得很厉害
var msg2 = new Message()
{
Payload = new MessagePart()
{
Body = new MessagePartBody()
{
Data = Convert.ToBase64String(Encoding.UTF8.GetBytes("Hello world"))
},
Headers = new List<MessagePartHeader>() {
new MessagePartHeader() { Name = "To", Value = "My email"},
...
Precondition check failed. [400]
使用 Gmail api 和服务帐户通常意味着您没有正确设置对服务帐户的全域委派。
Implementing Server-Side Authorization
在您的情况下,这可能是因为您要委托给不在您域中的用户。
User = serviceAccountEmail,
不是服务帐户的电子邮件地址,它是您的 Google 工作区中的用户,您希望服务帐户对其进行模拟。
string ApplicationName = "Gmail API .NET Quickstart";
const string serviceAccount = "clawskeyboard-smtp@clawskeyboard-api.iam.gserviceaccount.com";
var certificate = new X509Certificate2(@"D:\api-ed4859a67674.p12", "notasecret", X509KeyStorageFlags.Exportable);
var gsuiteUser = "xxx@YourWorkGroupDomain.com";
var serviceAccountCredentialInitializer = new ServiceAccountCredential.Initializer(serviceAccount)
{
User = gsuiteUser,
Scopes = new[] { GmailService.Scope.GmailSend, GmailService.Scope.GmailLabels }
}.FromCertificate(certificate);
问题
我正在尝试将 Gmail API 实施到 API 应用程序中。我创建了一个服务帐户并保存了 p12 密钥和 json 凭据。我在谈论失败的先决条件时遇到异常。我认为这可能与我要发送的消息有关。
代码
String serviceAccountEmail = "SERVICE-ACC-EMAIL";
X509Certificate2 certificate = new X509Certificate2("./key.p12", "notasecret", X509KeyStorageFlags.Exportable);
// FileStream stream = new FileStream("./credentials.json", FileMode.Open, FileAccess.Read); // ! Not Used
ServiceAccountCredential credential = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(serviceAccountEmail)
{
User = serviceAccountEmail,
Scopes = new[] { GmailService.Scope.MailGoogleCom }
}.FromCertificate(certificate));
GmailService service = new GmailService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = "Testing Application",
});
var result = service.Users.Messages.Send(CreateEmail.CreateEmailMessage(), "me").Execute();
异常
An unhandled exception of type 'Google.GoogleApiException' occurred in System.Private.CoreLib.dll: 'Google.Apis.Requests.RequestError
Precondition check failed. [400]
Errors [
Message[Precondition check failed.] Location[ - ] Reason[failedPrecondition] Domain[global]
]'
构建邮件消息(不起作用)
在 CreateEmail.CreateEmailMessage 方法中,我建立了 Google.Apis.Gmail.v1.Data.Message 的新实例。设置有效负载和 headers。以此为参考。我不确定这是否是这样做的方式,但我似乎无法找到创建新消息的方法。我只能找到用 Java 或 Python 编写的内容,我尝试将其翻译成 C#,但失败得很厉害
var msg2 = new Message()
{
Payload = new MessagePart()
{
Body = new MessagePartBody()
{
Data = Convert.ToBase64String(Encoding.UTF8.GetBytes("Hello world"))
},
Headers = new List<MessagePartHeader>() {
new MessagePartHeader() { Name = "To", Value = "My email"},
...
Precondition check failed. [400]
使用 Gmail api 和服务帐户通常意味着您没有正确设置对服务帐户的全域委派。
Implementing Server-Side Authorization
在您的情况下,这可能是因为您要委托给不在您域中的用户。
User = serviceAccountEmail,
不是服务帐户的电子邮件地址,它是您的 Google 工作区中的用户,您希望服务帐户对其进行模拟。
string ApplicationName = "Gmail API .NET Quickstart";
const string serviceAccount = "clawskeyboard-smtp@clawskeyboard-api.iam.gserviceaccount.com";
var certificate = new X509Certificate2(@"D:\api-ed4859a67674.p12", "notasecret", X509KeyStorageFlags.Exportable);
var gsuiteUser = "xxx@YourWorkGroupDomain.com";
var serviceAccountCredentialInitializer = new ServiceAccountCredential.Initializer(serviceAccount)
{
User = gsuiteUser,
Scopes = new[] { GmailService.Scope.GmailSend, GmailService.Scope.GmailLabels }
}.FromCertificate(certificate);