1

Google のサービス アカウントで IMAP セッションを認証する方法を探していました

しかし、私たちはすでにChilkatをどのように使用しているので、次のことを見つけました:

http://www.cknotes.com/imap-authentication-using-oauth/

生のコマンドを送信できるようにします:

imap.SendRawCommand("AUTHENTICATE XOAUTH <base64_data>");

これは、コマンドを構造化する方法を示しています: https://developers.google.com/gmail/xoauth2_protocol

しかし、それをすべてまとめるのに苦労しています。

limilabs は、この例で物事をうまくまとめています: http://www.limilabs.com/blog/oauth2-gmail-imap-service-account

imap.LoginOAUTH2(userEmail, credential.Token.AccessToken);それらには、物事をコマンドにまとめるニートがあります。これを Chilkat の raw コマンドとして行うにはどうすればよいですか?

4

1 に答える 1

1
const string serviceAccountEmail = "service-account-xxxxxx@developer.gserviceaccount.com";
const string serviceAccountCertPath = @"service-xxxxxx.p12";
const string serviceAccountCertPassword = "notasecret";
const string userEmail = "user@domain.com";



        X509Certificate2 certificate = new X509Certificate2(
            serviceAccountCertPath,
            serviceAccountCertPassword,
            X509KeyStorageFlags.Exportable);

        ServiceAccountCredential credential = new ServiceAccountCredential(
            new ServiceAccountCredential.Initializer(serviceAccountEmail)
            {
                Scopes = new[] { "https://mail.google.com/" },
                User = userEmail
            }.FromCertificate(certificate));

        bool success = credential.RequestAccessTokenAsync(CancellationToken.None).Result;

        using (Chilkat.Imap imap = new Chilkat.Imap())
        {
            imap.UnlockComponent("unlock-code");
            imap.Ssl = true;
            imap.Port = 993;
            imap.Connect("imap.gmail.com");



            var authString = String.Format("user={0}" + "\x001" + "auth=Bearer {1}" + "\x001" + "\x001",userEmail, credential.Token.AccessToken);

           var encoded = Convert.ToBase64String(Encoding.UTF8.GetBytes(authString));

            string response = imap.SendRawCommand("AUTHENTICATE XOAUTH2 " + encoded);

            imap.SelectMailbox("Inbox");
            bool bUid;
            bUid = false;
            string mimeStr;
            int i;
            int n;
            n = imap.NumMessages;
            for (i = 1; i <= n; i++)
            {

                //  Download the email by sequence number.
                mimeStr = imap.FetchSingleAsMime(i, bUid);


                Chilkat.Email chilkatEmail = new Chilkat.Email();
                chilkatEmail.SetFromMimeText(mimeStr);
                Console.WriteLine(chilkatEmail.Subject);
            }


            imap.CloseMailbox("Inbox");

            Console.ReadLine();
        }
    }
于 2014-09-23T13:43:47.140 に答える