尝试使用google . api . gmail从asp.net core web api应用程序从google工作区发



我正在尝试使用以下代码从我的google工作空间帐户发送电子邮件:

using (var stream =
new FileStream("credentials.json", FileMode.Open, FileAccess.Read))
{
var credential = ServiceAccountCredential.FromServiceAccountData(stream);
service = new GmailService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = ApplicationName,
});
var email = MimeMessage.CreateFromMailMessage(new System.Net.Mail.MailMessage("EMAILADDRESS", destinationEmailAddress, "Verification code", $"Your verification code is {messageBody}"));
Message message = new Message();
byte[] blob;
using (var memory = new MemoryStream())
{
email.WriteTo(memory);
blob = memory.ToArray();
}
message.Raw = await credential.SignBlobAsync(blob);
await service.Users.Messages.Send(message, "me").ExecuteAsync();
}

,但我得到以下异常:

Google.Apis.Requests。nPrecondition检查失败。[400] nererrors [ntMessage]条件检查失败。位置[-]原因[failedPrecondition]域[global]n]n

我做错了什么?是否有一个直接的指导来正确地做到这一点?

您遇到的问题是,您正在使用Gmail与服务帐户,你没有正确配置域宽授权给用户在您的工作空间帐户。按照本指南,使用服务帐户配置工作空间帐户。执行Google工作空间域范围内的权限委派

下面的代码将向您展示如何授权它。请注意CreateWithUser方法,该方法将设置您希望将服务帐户委托为的用户。

class Program
{
private static readonly string[] Scopes = {GmailService.Scope.GmailSend};
private static readonly string PathToServiceAccountKeyFile =
@"C:YouTubeworkspaceserviceaccount-e4823a933ae3.json";
private static readonly string workspaceAdmin = "xxxx@daimto.com";
private static readonly string sendEmailTo = "xxxx@gmail.com";
static async Task Main(string[] args)
{
Console.WriteLine("Hello World!");
var credential = LoadGoogleCredentials();
var service = CreateDirectoryService(credential);
var mailMessage = new System.Net.Mail.MailMessage
{
From = new System.Net.Mail.MailAddress(workspaceAdmin),
ReplyToList = {workspaceAdmin},
To = {sendEmailTo},
Subject = "Welcome",
Body = "welcome new workspace user",
};

var mimeMessage = MimeMessage.CreateFromMailMessage(mailMessage);
var gmailMessage = new Message
{
Raw = Encode(mimeMessage)
};
var request = await service.Users.Messages.Send(gmailMessage, workspaceAdmin).ExecuteAsync();
Console.ReadLine();
}
public static string Encode(MimeMessage mimeMessage)
{
using (MemoryStream ms = new MemoryStream())
{
mimeMessage.WriteTo(ms);
return Convert.ToBase64String(ms.GetBuffer())
.TrimEnd('=')
.Replace('+', '-')
.Replace('/', '_');
}
}
private static GmailService CreateDirectoryService(GoogleCredential credential)
{
return new(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = "Daimto Testing Workspace with service account"
}
);
}
private static GoogleCredential LoadGoogleCredentials()
{
return GoogleCredential.FromFile(PathToServiceAccountKeyFile)
.CreateScoped(Scopes)
.CreateWithUser(workspaceAdmin);
}
}

注意:这段代码对于所有类型的应用程序都是相同的,即使我的测试代码是一个控制台应用程序,所使用的方法也将适用于您的asp.net core应用程序

从评论

客户端未被授权使用此方法检索访问令牌,或者客户端未被授权使用所请求的任何范围

此错误消息表示您的服务帐户未被授权使用适当的范围。gmail发送方法需要一个允许访问发送电子邮件的范围,例如GmailService.Scope.GmailSend,因为我在我的代码中使用过,记得在工作区中添加它。

完整的教程Gmail api与谷歌工作空间和。net