我正在嘗試使用以下代碼從我的 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.RequestError\n先決條件檢查失敗。[400]\n錯誤 [\n\tMessage[Precondition check failed.] Location[ - ] Reason[failedPrecondition] Domain[global]\n]\n
我究竟做錯了什么?是否有直接的指南來正確地做到這一點?
uj5u.com熱心網友回復:
您遇到的問題是您使用的是帶有服務帳戶的 Gmail,并且您沒有正確配置對作業區帳戶上用戶的域范圍委派。按照本指南使用服務帳戶配置您的作業區帳戶。執行 Google Workspace 域范圍的授權
以下代碼應向您展示如何對其進行授權。請注意 CreateWithUser 方法,它設定了您希望將服務帳戶委派為的用戶。
class Program
{
private static readonly string[] Scopes = {GmailService.Scope.GmailSend};
private static readonly string PathToServiceAccountKeyFile =
@"C:\YouTube\workspaceserviceaccount-e4823a933ae3.json";
private static readonly string workspaceAdmin = "[email protected]";
private static readonly string sendEmailTo = "[email protected]";
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 核心應用程式
來自評論
客戶端無權使用此方法檢索訪問令牌,或者客戶端未獲得任何請求范圍的授權
此錯誤訊息意味著您的 servcie 帳戶未獲得適當范圍的授權。gmail 發送方法需要一個允許訪問發送電子郵件的范圍,GmailService.Scope.GmailSend例如,因為我使用了 din 我的代碼記得將它添加到作業區中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/337228.html
標籤:C# asp.net核心 谷歌API gmail-api google-api-dotnet-client
下一篇:依賴注入中的AddScoped
