Nhập Danh bạ từ Gmail trong C# .NET

Gmail là một dịch vụ email phổ biến và được sử dụng rộng rãi do Google cung cấp. Cùng với việc gửi và nhận email, nó cung cấp nhiều tính năng bổ sung khác nhau như trả lời tự động, trò chuyện, v.v. Là một lập trình viên, bạn có thể gặp tình huống khi bạn cần nhập danh bạ từ một tài khoản Gmail cụ thể. Để thực hiện điều đó từ bên trong các ứng dụng .NET, bài viết này trình bày cách nhập danh bạ Gmail trong C# .NET. Hơn nữa, chúng tôi sẽ trình bày cách tìm nạp địa chỉ liên hệ từ một nhóm email cụ thể.

C# .NET API để nhập Danh bạ Gmail

Để nhập danh bạ từ tài khoản Gmail, chúng tôi sẽ sử dụng Aspose.Email for .NET. Nó là một API giàu tính năng cho phép bạn tạo và gửi email khá dễ dàng. Hơn nữa, nó cho phép bạn thao tác các định dạng email khác nhau bao gồm MSG và EML. Bạn có thể tải xuống DLL của API hoặc cài đặt nó bằng NuGet.

PM> Install-Package Aspose.Email

Nhập Danh bạ từ Gmail trong C#

Để truy cập danh bạ từ tài khoản Gmail, chúng ta cần viết một số mã để xử lý thông tin của người dùng và thực hiện xác thực Gmail. Đối với người dùng Gmail, trước tiên chúng tôi sẽ tạo một lớp có tên TestUser và sau đó kế thừa nó từ lớp GoogleUser. Sau đây là cách thực hiện đầy đủ của cả hai lớp.

using System;

namespace Aspose.Email
{
    internal enum GrantTypes
    {
        authorization_code,
        refresh_token
    }

    public class TestUser
    {
        internal TestUser(string name, string eMail, string password, string domain)
        {
            Name = name;
            EMail = eMail;
            Password = password;
            Domain = domain;
        }

        public readonly string Name;
        public readonly string EMail;
        public readonly string Password;
        public readonly string Domain;

        public static bool operator ==(TestUser x, TestUser y)
        {
            if ((object)x != null)
                return x.Equals(y);
            if ((object)y != null)
                return y.Equals(x);
            return true;
        }

        public static bool operator !=(TestUser x, TestUser y)
        {
            return !(x == y);
        }

        public static implicit operator string(TestUser user)
        {
            return user == null ? null : user.Name;
        }

        public override int GetHashCode()
        {
            return ToString().GetHashCode();
        }

        public override bool Equals(object obj)
        {
            return obj != null && obj is TestUser && this.ToString().Equals(obj.ToString(), StringComparison.OrdinalIgnoreCase);
        }

        public override string ToString()
        {
            return string.IsNullOrEmpty(Domain) ? Name : string.Format("{0}/{1}", Domain, Name);
        }
    }
    public class GoogleUser : TestUser
    {
        public GoogleUser(string name, string eMail, string password)
            : this(name, eMail, password, null, null, null)
        { }

        public GoogleUser(string name, string eMail, string password, string clientId, string clientSecret)
            : this(name, eMail, password, clientId, clientSecret, null)
        { }

        public GoogleUser(string name, string eMail, string password, string clientId, string clientSecret, string refreshToken)
            : base(name, eMail, password, "gmail.com")
        {
            ClientId = clientId;
            ClientSecret = clientSecret;
            RefreshToken = refreshToken;
        }
        public readonly string ClientId;
        public readonly string ClientSecret;
        public readonly string RefreshToken;
    }
}

Bây giờ, chúng ta cần tạo một lớp trợ giúp sẽ đảm nhận việc xác thực tài khoản Gmail. Chúng tôi sẽ đặt tên lớp này là GoogleOAuthHelper. Sau đây là cách thực hiện hoàn chỉnh của lớp này.

using System; 
using System.Diagnostics;
using System.IO; 
using System.Net;
using System.Text;
using System.Threading; 
using System.Windows.Forms;

namespace Aspose.Email
{
    internal class GoogleOAuthHelper
    {
        public const string TOKEN_REQUEST_URL = "https://accounts.google.com/o/oauth2/token";
        public const string SCOPE = "https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar" + "+" + "https%3A%2F%2Fwww.google.com%2Fm8%2Ffeeds%2F" + "+" + "https%3A%2F%2Fmail.google.com%2F"; // IMAP & SMTP
        public const string REDIRECT_URI = "urn:ietf:wg:oauth:2.0:oob";
        public const string REDIRECT_TYPE = "code";

        internal static string GetAccessToken(TestUser user)
        {
            return GetAccessToken((GoogleUser)user);
        }

        internal static string GetAccessToken(GoogleUser user)
        {
            string access_token;
            string token_type;
            int expires_in;
            GetAccessToken(user, out access_token, out token_type, out expires_in);
            return access_token;
        }

        internal static void GetAccessToken(GoogleUser user, out string access_token, out string token_type, out int expires_in)
        {
            access_token = null;
            token_type = null;
            expires_in = 0;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(TOKEN_REQUEST_URL);
            request.CookieContainer = new CookieContainer();
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            string encodedParameters = string.Format("client_id={0}&client_secret={1}&refresh_token={2}&grant_type={3}",
            System.Web.HttpUtility.UrlEncode(user.ClientId), System.Web.HttpUtility.UrlEncode(user.ClientSecret), System.Web.HttpUtility.UrlEncode(user.RefreshToken), System.Web.HttpUtility.UrlEncode(GrantTypes.refresh_token.ToString()));
            byte[] requestData = Encoding.UTF8.GetBytes(encodedParameters);
            request.ContentLength = requestData.Length;
            if (requestData.Length > 0)
                using (Stream stream = request.GetRequestStream())
                    stream.Write(requestData, 0, requestData.Length);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            string responseText = null;
            using (TextReader reader = new StreamReader(response.GetResponseStream(), Encoding.ASCII))
                responseText = reader.ReadToEnd();
            foreach (string sPair in responseText.Replace("{", "").Replace("}", "").Replace("\"", "").Split(new string[] { ",\n" }, StringSplitOptions.None))
            {
                string[] pair = sPair.Split(':');
                string name = pair[0].Trim().ToLower();
                string value = System.Web.HttpUtility.UrlDecode(pair[1].Trim());
                switch (name)
                {
                    case "access_token":
                        access_token = value;
                        break;
                    case "token_type":
                        token_type = value;
                        break;

                    case "expires_in":
                        expires_in = Convert.ToInt32(value);
                        break;
                }
            }
            Debug.WriteLine("");
            Debug.WriteLine("---------------------------------------------------------");
            Debug.WriteLine("-----------OAuth 2.0 authorization information-----------");
            Debug.WriteLine("---------------------------------------------------------");
            Debug.WriteLine(string.Format("Login: '{0}'", user.EMail));
            Debug.WriteLine(string.Format("Access token: '{0}'", access_token));
            Debug.WriteLine(string.Format("Token type: '{0}'", token_type));
            Debug.WriteLine(string.Format("Expires in: '{0}'", expires_in));
            Debug.WriteLine("---------------------------------------------------------");
            Debug.WriteLine("");
        }

        internal static void GetAccessToken(TestUser user, out string access_token, out string refresh_token)
        {
            GetAccessToken((GoogleUser)user, out access_token, out refresh_token);
        }

        internal static void GetAccessToken(GoogleUser user, out string access_token, out string refresh_token)
        {
            string token_type;
            int expires_in;
            GoogleOAuthHelper.GetAccessToken(user, out access_token, out refresh_token, out token_type, out expires_in);
        }

        internal static void GetAccessToken(TestUser user, out string access_token, out string refresh_token, out string token_type, out int expires_in)
        {
            GetAccessToken((GoogleUser)user, out access_token, out refresh_token, out token_type, out expires_in);
        }

        internal static void GetAccessToken(GoogleUser user, out string access_token, out string refresh_token, out string token_type, out int expires_in)
        {
            string authorizationCode = GoogleOAuthHelper.GetAuthorizationCode(user, GoogleOAuthHelper.SCOPE, GoogleOAuthHelper.REDIRECT_URI, GoogleOAuthHelper.REDIRECT_TYPE);
            GoogleOAuthHelper.GetAccessToken(authorizationCode, user, out access_token, out token_type, out expires_in, out refresh_token);
        }

        internal static void GetAccessToken(string authorizationCode, TestUser user, out string access_token, out string token_type, out int expires_in, out string refresh_token)
        {
            GetAccessToken(authorizationCode, (GoogleUser)user, out access_token, out token_type, out expires_in, out refresh_token);
        }

        internal static void GetAccessToken(string authorizationCode, GoogleUser user, out string access_token, out string token_type, out int expires_in, out string refresh_token)
        {
            access_token = null;
            token_type = null;
            expires_in = 0;
            refresh_token = null;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(TOKEN_REQUEST_URL);
            request.CookieContainer = new CookieContainer();
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            string encodedParameters = string.Format("client_id={0}&code={1}&client_secret={2}&redirect_uri={3}&grant_type={4}", System.Web.HttpUtility.UrlEncode(user.ClientId), System.Web.HttpUtility.UrlEncode(authorizationCode), System.Web.HttpUtility.UrlEncode(user.ClientSecret), System.Web.HttpUtility.UrlEncode(REDIRECT_URI), System.Web.HttpUtility.UrlEncode(GrantTypes.authorization_code.ToString()));
            byte[] requestData = Encoding.UTF8.GetBytes(encodedParameters);
            request.ContentLength = requestData.Length;
            if (requestData.Length > 0)
                using (Stream stream = request.GetRequestStream())
                    stream.Write(requestData, 0, requestData.Length);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            string responseText = null;
            using (TextReader reader = new StreamReader(response.GetResponseStream(), Encoding.ASCII))
                responseText = reader.ReadToEnd();
            foreach (string sPair in responseText.Replace("{", "").Replace("}", "").Replace("\"", "").Split(new string[] { ",\n" }, StringSplitOptions.None))
            {
                string[] pair = sPair.Split(':');
                string name = pair[0].Trim().ToLower();
                string value = System.Web.HttpUtility.UrlDecode(pair[1].Trim());
                switch (name)
                {
                    case "access_token":
                        access_token = value;
                        break;
                    case "token_type":
                        token_type = value;
                        break;

                    case "expires_in":
                        expires_in = Convert.ToInt32(value);
                        break;

                    case "refresh_token":
                        refresh_token = value;
                        break;
                }
            }

            Debug.WriteLine(string.Format("Authorization code: '{0}'", authorizationCode));
            Debug.WriteLine(string.Format("Access token: '{0}'", access_token));
            Debug.WriteLine(string.Format("Refresh token: '{0}'", refresh_token));
            Debug.WriteLine(string.Format("Token type: '{0}'", token_type));
            Debug.WriteLine(string.Format("Expires in: '{0}'", expires_in));
            Debug.WriteLine("---------------------------------------------------------");
            Debug.WriteLine("");
        }

        internal static string GetAuthorizationCode(TestUser acc, string scope, string redirectUri, string responseType)
        {
            return GetAuthorizationCode((GoogleUser)acc, scope, redirectUri, responseType);
        }

        internal static string GetAuthorizationCode(GoogleUser acc, string scope, string redirectUri, string responseType)
        {
            Debug.WriteLine("");
            Debug.WriteLine("---------------------------------------------------------");
            Debug.WriteLine("-----------OAuth 2.0 authorization information-----------");
            Debug.WriteLine("---------------------------------------------------------");
            Debug.WriteLine(string.Format("Login: '{0}'", acc.EMail));
            string authorizationCode = null;
            string error = null;
            string approveUrl = string.Format("https://accounts.google.com/o/oauth2/auth?redirect_uri={0}&response_type={1}&client_id={2}&scope={3}", redirectUri, responseType, acc.ClientId, scope);

            AutoResetEvent are0 = new AutoResetEvent(false);
            Thread t = new Thread(delegate()
            {
                bool doEvents = true;
                WebBrowser browser = new WebBrowser();
                browser.AllowNavigation = true;
                browser.DocumentCompleted += delegate (object sender, WebBrowserDocumentCompletedEventArgs e) { doEvents = false; };
                Form f = new Form();
                f.FormBorderStyle = FormBorderStyle.FixedToolWindow;
                f.ShowInTaskbar = false;
                f.StartPosition = FormStartPosition.Manual;
                f.Location = new System.Drawing.Point(-2000, -2000);
                f.Size = new System.Drawing.Size(1, 1);
                f.Controls.Add(browser);
                f.Load += delegate (object sender, EventArgs e)
                {
                    try
                    {
                        browser.Navigate("https://accounts.google.com/Logout");
                        doEvents = true;
                        while (doEvents) Application.DoEvents();
                        browser.Navigate("https://accounts.google.com/ServiceLogin?sacu=1");
                        doEvents = true;
                        while (doEvents) Application.DoEvents();
                        HtmlElement loginForm = browser.Document.Forms["gaia_loginform"];
                        if (loginForm != null)
                        {
                            HtmlElement userName = browser.Document.All["Email"];

                            userName.SetAttribute("value", acc.EMail);
                            loginForm.InvokeMember("submit");
                            doEvents = true;
                            while (doEvents)
                                Application.DoEvents();

                            loginForm = browser.Document.Forms["gaia_loginform"];
                            HtmlElement passwd = browser.Document.All["Passwd"];
                            passwd.SetAttribute("value", acc.Password);

                            loginForm.InvokeMember("submit");
                            doEvents = true;
                            while (doEvents)
                                Application.DoEvents();
                        }
                        else
                        {
                            error = "Login form is not found in \n" + browser.Document.Body.InnerHtml;
                            return;
                        }
                        browser.Navigate(approveUrl);
                        doEvents = true;
                        while (doEvents) Application.DoEvents();
                        HtmlElement approveForm = browser.Document.Forms["connect-approve"];
                        if (approveForm != null)
                        {
                            HtmlElement submitAccess = browser.Document.All["submit_access"];
                            submitAccess.SetAttribute("value", "true");
                            approveForm.InvokeMember("submit");
                            doEvents = true;
                            while (doEvents)
                                Application.DoEvents();
                        }
                        else
                        {
                            error = "Approve form is not found in \n" + browser.Document.Body.InnerHtml;
                            return;
                        }
                        HtmlElement code = browser.Document.All["code"];
                        if (code != null)
                            authorizationCode = code.GetAttribute("value");
                        else
                            error = "Authorization code is not found in \n" + browser.Document.Body.InnerHtml;
                    }
                    catch (Exception ex)
                    {
                        error = ex.Message;
                    }
                    finally
                    {
                        f.Close();
                    }
                };
                Application.Run(f);
                are0.Set();
            });
            t.SetApartmentState(ApartmentState.STA);
            t.Start();
            are0.WaitOne();
            if (error != null)
                throw new Exception(error);
            return authorizationCode;
        }
    }
}

C# Nhập Danh bạ từ Tài khoản Gmail

Ở giai đoạn này, chúng tôi đã sẵn sàng để truy cập danh bạ trong tài khoản Gmail. Sau đây là các bước để nhập danh bạ từ tài khoản Gmail trong C#.

  • Tạo một đối tượng của lớp GoogleUser và khởi tạo nó với tên, email, mật khẩu, ID ứng dụng khách và bí mật của ứng dụng khách.
  • Tạo hai đối tượng chuỗi để lưu trữ mã thông báo truy cập và mã thông báo làm mới.
  • Gọi phương thức GoogleOAuthHelper.GetAccessToken (GoogleUser, out string, out string) để nhận mã truy cập và làm mới.
  • Lấy một phiên bản của lớp GmailClient vào đối tượng IGmailClient.
  • Tạo một mảng Liên hệ và lấy tất cả các liên hệ bằng phương thức IGmailClient.GetAllContacts().
  • Lặp qua mảng để truy cập từng liên hệ.

Mẫu mã sau đây cho thấy cách nhập danh bạ từ tài khoản Gmail trong C#.

// Tạo người dùng Google
GoogleUser User = new GoogleUser("user", "email address", "password", "clientId", "client secret");
string accessToken;
string refreshToken;

// Nhận mã thông báo truy cập
GoogleOAuthHelper.GetAccessToken(User, out accessToken, out refreshToken);

// Tải xuống IGmailclient
using (IGmailClient client = GmailClient.GetInstance(accessToken, User.EMail))
{
    // Truy cập danh bạ
    Contact[] contacts = client.GetAllContacts();
    foreach (Contact contact in contacts)
        Console.WriteLine(contact.DisplayName + ", " + contact.EmailAddresses[0]);
}

Nhập Danh bạ Gmail từ một Nhóm trong C#

Bạn cũng có thể truy cập danh bạ từ một nhóm email cụ thể trong Gmail. Sau đây là các bước để thực hiện thao tác này.

  • Tạo một đối tượng của lớp GoogleUser và khởi tạo nó với tên, email, mật khẩu, ID ứng dụng khách và bí mật của ứng dụng khách.
  • Tạo hai đối tượng chuỗi để lưu trữ mã thông báo truy cập và mã thông báo làm mới.
  • Gọi phương thức GoogleOAuthHelper.GetAccessToken (GoogleUser, out string, out string) để lấy mã thông báo truy cập.
  • Lấy một phiên bản của lớp GmailClient vào đối tượng IGmailClient.
  • Đưa tất cả các nhóm email vào một đối tượng ContactGroupCollection bằng cách sử dụng phương thức IGmailClient.GetAllGroups().
  • Truy cập GoogleContactGroup mong muốn bằng tên của nó.
  • Tạo một mảng Liên hệ và lấy tất cả các liên hệ từ nhóm bằng phương thức IGmailClient.GetContactsFromGroup (string).
  • Lặp qua mảng để truy cập từng liên hệ.

Mẫu mã sau đây cho thấy cách nhập danh bạ từ một nhóm email cụ thể trong C#.

// Tạo người dùng Google
GoogleUser User = new GoogleUser("user", "email address", "password", "clientId", "client secret");
string accessToken;
string refreshToken;

// Nhận mã thông báo truy cập
GoogleOAuthHelper.GetAccessToken(User, out accessToken, out refreshToken);

// Tải xuống IGmailclient
using (IGmailClient client = GmailClient.GetInstance(accessToken, User.EMail))
{
    // Tìm nạp địa chỉ liên hệ từ một nhóm cụ thể
    ContactGroupCollection groups = client.GetAllGroups();
    GoogleContactGroup group = null;
    foreach (GoogleContactGroup g in groups)
        switch (g.Title)
        {
            case "TestGroup":
                group = g;
                break;
        }

    // Truy xuất địa chỉ liên hệ từ Nhóm
    if (group != null)
    {
        Contact[] contacts2 = client.GetContactsFromGroup(group.Id);
        foreach (Contact con in contacts2)
            Console.WriteLine(con.DisplayName + "," + con.EmailAddresses[0].ToString());
    }
}

API C# để nhập Danh bạ Gmail - Nhận Giấy phép Miễn phí

Bạn có thể nhận giấy phép tạm thời miễn phí để sử dụng Aspose.Email for .NET mà không có giới hạn đánh giá.

Sự kết luận

Trong bài viết này, bạn đã học cách nhập danh bạ Gmail từ các tài khoản theo lập trình trong C#. Hơn nữa, bạn đã thấy cách truy cập danh bạ từ một nhóm email cụ thể trong Gmail. Bên cạnh đó, bạn có thể khám phá các tính năng khác của Aspose.Email dành cho .NET bằng cách sử dụng tài liệu. Ngoài ra, bạn có thể đặt câu hỏi của mình qua diễn đàn của chúng tôi.

Xem thêm