RESTインターフェイスを介してGMAILAPIを使用してメールを読み取るデスクトップアプリケーションがあります。ドメイン設定を使用してメールをダウンロードできるようにサービスアカウントを使用したいのですが、ユーザーの操作はnullです。正常に実行できますGmailサービスインスタンスを作成しますが、メールリストの取得などのGmail APIメソッドにアクセスしようとすると、例外が発生します。
Google.Apis.Auth.OAuth2.Responses.TokenResponseException:エラー: "access_denied"、説明: "リクエストされたクライアントは承認されていません。"
開発者コンソールでのすべての設定が完了し、gappsドメインにスコープが追加されました。
Gmail APIはサービスアカウントをサポートしていますか?同じ設定とサービスアカウントを使用して、ドライブサービスとAPIを使用してGoogleドライブ内のすべてのファイルのリストを取得できます。
サービスアカウントからGmailにアクセスするには、次のC#コードを使用します
String serviceAccountEmail =
"999999999-9nqenknknknpmdvif7onn2kvusnqct2c@developer.gserviceaccount.com";
var certificate = new X509Certificate2(
AppDomain.CurrentDomain.BaseDirectory +
"certs//fe433c710f4980a8cc3dda83e54cf7c3bb242a46-privatekey.p12",
"notasecret",
X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable);
string userEmail = "[email protected]";
ServiceAccountCredential credential = new ServiceAccountCredential(
new ServiceAccountCredential.Initializer(serviceAccountEmail)
{
User = userEmail,
Scopes = new[] { "https://mail.google.com/" }
}.FromCertificate(certificate)
);
if (credential.RequestAccessTokenAsync(CancellationToken.None).Result)
{
GmailService gs = new GmailService(
new Google.Apis.Services.BaseClientService.Initializer()
{
ApplicationName = "iLink",
HttpClientInitializer = credential
}
);
UsersResource.MessagesResource.GetRequest gr =
gs.Users.Messages.Get(userEmail, msgId);
gr.Format = UsersResource.MessagesResource.GetRequest.FormatEnum.Raw;
Message m = gr.Execute();
if (gr.Format == UsersResource.MessagesResource.GetRequest.FormatEnum.Raw)
{
byte[] decodedByte = FromBase64ForUrlString(m.Raw);
string base64Encoded = Convert.ToString(decodedByte);
MailMessage msg = new MailMessage();
msg.LoadMessage(decodedByte);
}
}
「メールを読む」場合は、新しいGmail APIが必要になります(「バイナリで失われた」と指摘された古い管理設定APIではありません)。はい、oauth2と新しいGmail APIでこれを行うことができます。Cpanelで開発者をホワイトリストに登録し、リクエストに署名できるキーを作成する必要があります。セットアップには少し時間がかかります。 https:// developers .google.com/accounts/docs/OAuth2ServiceAccount#formingclaimset
はい、できます...委任設定を確認してください...
編集:EricDeFriezが共有したリンクを使用します。
C#Gmail API v1の場合、次のコードを使用してGmailサービスを取得できます。メールを読むにはGmailサービスを使用してください。 Googleコンソールサイトでサービスアカウントを作成したら、キーファイルをjson形式でダウンロードします。ファイル名が「service.json」であると仮定します。
public static GoogleCredential GetCredenetial(string serviceAccountCredentialJsonFilePath)
{
GoogleCredential credential;
using (var stream = new FileStream(serviceAccountCredentialJsonFilePath, FileMode.Open, FileAccess.Read))
{
credential = GoogleCredential.FromStream(stream)
.CreateScoped(new[] {GmailService.Scope.GmailReadonly})
.CreateWithUser(**[email protected]**);
}
return credential;
}
public static GmailService GetGmailService(GoogleCredential credential)
{
return new GmailService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = "Automation App",
});
}
// how to use
public static void main()
{
var credential = GetCredenetial("service.json");
var gmailService = GetGmailService(credential);
// you can use gmail service to retrieve emails.
var mMailListRequest = gmailService.Users.Messages.List("me");
mMailListRequest.LabelIds = "INBOX";
var mailListResponse = mMailListRequest.Execute();
}
これがpython 3.7:
from google.oauth2 import service_account
from googleapiclient.discovery import build
def setup_credentials():
key_path = 'gmailsignatureproject-zzz.json'
API_scopes =['https://www.googleapis.com/auth/gmail.settings.basic',
'https://www.googleapis.com/auth/gmail.settings.sharing']
credentials = service_account.Credentials.from_service_account_file(key_path,scopes=API_scopes)
return credentials
def test_setup_credentials():
credentials = setup_credentials()
assert credentials
def test_fetch_user_info():
credentials = setup_credentials()
credentials_delegated = credentials.with_subject("[email protected]")
gmail_service = build("gmail","v1",credentials=credentials_delegated)
addresses = gmail_service.users().settings().sendAs().list(userId='me').execute()
assert gmail_service
新しいGmailAPIを使用して、user @ YOUR_DOMAIN.COMのメール/ラベル/スレッドなどにアクセスできます。
https://developers.google.com/gmail/api/
なりすましのあるサービスアカウント(サービスアカウントは、ドメインの特定のユーザーであるかのようにAPIにアクセスしています)。
詳細はこちらをご覧ください: https://developers.google.com/identity/protocols/OAuth2ServiceAccount
Dartlangの関連コードは次のとおりです。
import 'package:googleapis_auth/auth_io.Dart' as auth;
import 'package:googleapis/gmail/v1.Dart' as gmail;
import 'package:http/http.Dart' as http;
///credentials created with service_account here https://console.developers.google.com/apis/credentials/?project=YOUR_PROJECT_ID
final String creds = r'''
{
"private_key_id": "FILL_private_key_id",
"private_key": "FILL_private_key",
"client_email": "FILL_service_account_email",
"client_id": "FILL_client_id",
"type": "service_account"
}''';
Future<http.Client> createImpersonatedClient(String impersonatedUserEmail, List scopes) async {
var impersonatedCredentials = new auth.ServiceAccountCredentials.fromJson(creds,impersonatedUser: impersonatedUserEmail);
return auth.clientViaServiceAccount(impersonatedCredentials , scopes);
}
getUserEmails(String userEmail) async { //userEmail from YOUR_DOMAIN.COM
var client = await createImpersonatedClient(userEmail, [gmail.GmailApi.MailGoogleComScope]);
var gmailApi = new gmail.GmailApi(client);
return gmailApi.users.messages.list(userEmail, maxResults: 5);
}