إنشاء وتحديث وحذف جهات الاتصال في Gmail باستخدام C#

يعد Gmail أحد تطبيقات البريد الإلكتروني الشائعة والمستخدمة على نطاق واسع حول العالم. إلى جانب إدارة رسائل البريد الإلكتروني ، فإنه يسمح بالعمل مع التقويمات وجهات الاتصال والمحادثات وما إلى ذلك ويوفر خدمات تعاون أخرى. في المقالة السابقة ، رأيت كيفية استيراد جهات الاتصال من حساب Gmail داخل تطبيق .NET. في هذه المقالة ، سنغطي كيفية إنشاء وتحديث وحذف جهات الاتصال في حساب Gmail باستخدام C# .NET.

C# .NET API لإنشاء وتحديث وحذف جهات اتصال Gmail

لإنشاء جهات اتصال ومعالجتها في حساب Gmail ، سنستخدم Aspose.Email for .NET. إنها واجهة برمجة تطبيقات لمعالجة البريد الإلكتروني تتيح لك معالجة رسائل البريد الإلكتروني والعمل مع عملاء البريد الإلكتروني المشهورين. يمكنك إما تنزيل DLL الخاصة بواجهة برمجة التطبيقات أو تثبيته من NuGet باستخدام الأمر التالي.

PM> Install-Package Aspose.Email

قبل أن تبدأ العمل ، تحتاج إلى إنشاء مشروع على Google Developer Console ، والذي سيتيح لك التواصل مع Gmail. لإنشاء واحدة ، يمكنك اتباع هذا الدليل.

للوصول إلى جهات الاتصال والتعامل معها في حساب Gmail ، نحتاج إلى كتابة بعض الرموز للتعامل مع معلومات المستخدم وإجراء المصادقة. بالنسبة لمستخدم Gmail ، سننشئ أولاً فئة باسم TestUser ثم نرثها من فئة GoogleUser. ما يلي هو التنفيذ الكامل لكلا الفئتين.

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;
    }
}

الآن ، نحتاج إلى إنشاء فئة مساعدة تهتم بمصادقة حساب Gmail. سنطلق على هذه الفئة اسم GoogleOAuthHelper. ما يلي هو التنفيذ الكامل لهذه الفئة.

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;
        }
    }
}

إنشاء جهة اتصال على Gmail في C#

فيما يلي خطوات إنشاء جهة اتصال على Gmail في C#.

  • أولاً ، قم بإنشاء مستخدم Google ، واحصل على رمز وصول ، وقم بتهيئة كائن IGmailClient.
  • ثم قم بإنشاء كائن من فئة جهة الاتصال.
  • قم بتعيين خصائص جهة الاتصال مثل الاسم والبادئة والمهنة وما إلى ذلك.
  • لتعيين العنوان البريدي ، أنشئ مثيلاً لـ PostalAddress وعيّن خصائصه.
  • أضف العنوان الذي تم إنشاؤه حديثًا إلى المجموعة باستخدام طريقة Contact.PhysicalAddresses.Add (PostalAddress).
  • قم بتعيين تفاصيل رقم الهاتف باستخدام فئة PhoneNumber.
  • أضف تفاصيل رقم الهاتف إلى المجموعة باستخدام طريقة Contact.PhoneNumbers.Add (PhoneNumber).
  • قم بإنشاء مثيل لفئة EmailAddress ، وقم بتعيين عنوان البريد الإلكتروني ، وقم بتعيينه لجهة الاتصال.
  • أخيرًا ، اتصل بأسلوب IGmailClient.CreateContact (جهة اتصال) لإنشاء جهة اتصال في Gmail.

يوضح نموذج الشفرة التالي كيفية إنشاء جهة اتصال على Gmail في C#.

// تهيئة مستخدم Google
GoogleUser User = new GoogleUser("user", "email address", "password", "clientId", "client secret");
string accessToken;
string refreshToken;

// الحصول على رمز وصول
GoogleOAuthHelper.GetAccessToken(User, out accessToken, out refreshToken);

// احصل على عميل Gmail
IGmailClient client = GmailClient.GetInstance(accessToken, User.EMail);

// قم بإنشاء جهة اتصال
Contact contact = new Contact();
contact.Prefix = "Prefix";
contact.GivenName = "GivenName";
contact.Surname = "Surname";
contact.MiddleName = "MiddleName";
contact.DisplayName = "Test User 1";
contact.Suffix = "Suffix";
contact.JobTitle = "JobTitle";
contact.DepartmentName = "DepartmentName";
contact.CompanyName = "CompanyName";
contact.Profession = "Profession";
contact.Notes = "Notes";

// حدد العنوان البريدي
PostalAddress address = new PostalAddress();
address.Category = PostalAddressCategory.Work;
address.Address = "Address";
address.Street = "Street";
address.PostOfficeBox = "PostOfficeBox";
address.City = "City";
address.StateOrProvince = "StateOrProvince";
address.PostalCode = "PostalCode";
address.Country = "Country";
contact.PhysicalAddresses.Add(address);

// ضبط رقم الهاتف
PhoneNumber pnWork = new PhoneNumber();
pnWork.Number = "323423423423";
pnWork.Category = PhoneNumberCategory.Work;
contact.PhoneNumbers.Add(pnWork);
PhoneNumber pnHome = new PhoneNumber();
pnHome.Number = "323423423423";
pnHome.Category = PhoneNumberCategory.Home;
contact.PhoneNumbers.Add(pnHome);
PhoneNumber pnMobile = new PhoneNumber();
pnMobile.Number = "323423423423";
pnMobile.Category = PhoneNumberCategory.Mobile;
contact.PhoneNumbers.Add(pnMobile);

// قم بتعيين الخصائص الأخرى
contact.Urls.Blog = "Blog.ru";
contact.Urls.BusinessHomePage = "BusinessHomePage.ru";
contact.Urls.HomePage = "HomePage.ru";
contact.Urls.Profile = "Profile.ru";
contact.Events.Birthday = DateTime.Now.AddYears(-30);
contact.Events.Anniversary = DateTime.Now.AddYears(-10);
contact.InstantMessengers.AIM = "AIM";
contact.InstantMessengers.GoogleTalk = "GoogleTalk";
contact.InstantMessengers.ICQ = "ICQ";
contact.InstantMessengers.Jabber = "Jabber";
contact.InstantMessengers.MSN = "MSN";
contact.InstantMessengers.QQ = "QQ";
contact.InstantMessengers.Skype = "Skype";
contact.InstantMessengers.Yahoo = "Yahoo";
contact.AssociatedPersons.Spouse = "Spouse";
contact.AssociatedPersons.Sister = "Sister";
contact.AssociatedPersons.Relative = "Relative";
contact.AssociatedPersons.ReferredBy = "ReferredBy";
contact.AssociatedPersons.Partner = "Partner";
contact.AssociatedPersons.Parent = "Parent";
contact.AssociatedPersons.Mother = "Mother";
contact.AssociatedPersons.Manager = "Manager";

// حدد عنوان البريد الإلكتروني
EmailAddress eAddress = new EmailAddress();
eAddress.Address = "email@gmail.com";
contact.EmailAddresses.Add(eAddress);

// إنشاء جهة اتصال على Gmail
string contactUri = client.CreateContact(contact);

تحديث جهة اتصال على Gmail في C#

يمكنك أيضًا تحديث تفاصيل جهة اتصال Gmail بعد الوصول إليها. فيما يلي خطوات تحديث جهة اتصال في حساب Gmail في C#.

يوضح نموذج الشفرة التالي كيفية تحديث جهة اتصال في Gmail في C#.

// تهيئة مستخدم Google
GoogleUser User = new GoogleUser("user", "email address", "password", "clientId", "client secret");
string accessToken;
string refreshToken;

// الحصول على رمز وصول
GoogleOAuthHelper.GetAccessToken(User, out accessToken, out refreshToken);

// احصل على IGmailClient
using (IGmailClient client = GmailClient.GetInstance(accessToken, User.EMail))
{
    // احصل على جميع جهات الاتصال
    Contact[] contacts = client.GetAllContacts();
    Contact contact = contacts[0];
    contact.JobTitle = "Manager IT";
    contact.DepartmentName = "Customer Support";
    contact.CompanyName = "Aspose";
    contact.Profession = "Software Developer";
    
    // تحديث جهة الاتصال
    client.UpdateContact(contact);
}

حذف جهة اتصال على Gmail في C#

أخيرًا ، دعنا نرى كيفية حذف جهة اتصال Gmail باستخدام C#. فيما يلي خطوات إجراء هذه العملية.

يوضح نموذج الشفرة التالي كيفية حذف جهة اتصال على Gmail في C#.

// تهيئة مستخدم Google
GoogleUser User = new GoogleUser("user", "email address", "password", "clientId", "client secret");
string accessToken;
string refreshToken;

// الحصول على رمز وصول
GoogleOAuthHelper.GetAccessToken(User, out accessToken, out refreshToken);

// احصل على IGmailClient
using (IGmailClient client = GmailClient.GetInstance(accessToken, User.EMail))
{
    // احصل على جميع جهات الاتصال
    Contact[] contacts = client.GetAllContacts();
    Contact contact = contacts[0];
    
    // حذف اتصال
    client.DeleteContact(contact.Id.GoogleId);

}

احصل على ترخيص API مجاني

يمكنك استخدام Aspose.Email لـ .NET بدون قيود تقييمية باستخدام ترخيص مؤقت مجاني.

استنتاج

في هذه المقالة ، تعلمت كيفية إنشاء جهات اتصال وتحديثها في حساب Gmail في C# .NET. علاوة على ذلك ، لقد رأيت كيفية حذف جهة اتصال Gmail برمجيًا. بالإضافة إلى ذلك ، يمكنك زيارة التوثيق لاستكشاف الميزات الأخرى لبرنامج Aspose.Email for .NET. في حال كان لديك أي أسئلة ، يمكنك إرسالها إلى المنتدى.

أنظر أيضا