
Gmail is one of the popular and widely used email applications around the globe. Along with managing emails, it allows working with calendars, contacts, chats, etc. and provides other collaboration services. In the previous article, you have seen how to import contacts from a Gmail account within a .NET application. In this article, we will cover how to create, update, and delete contacts in a Gmail account using C# .NET.
- C# .NET API to Manage Gmail Contacts
- Create a Contact on Gmail
- Update a Contact on Gmail
- Delete a Contact on Gmail
C# .NET API to Create, Update and Delete Gmail Contacts
To create and manipulate contacts in a Gmail account, we will use Aspose.Email for .NET. It is an email processing API that lets you manipulate emails and work with popular email clients. You can either download the API’s DLL or install it from NuGet using the following command.
PM> Install-Package Aspose.Email
Before you start working, you need to create a project on the Google Developer Console, which will allow you to communicate with Gmail. To create one, you can follow this guide.
To access and manipulate contacts in a Gmail account, we need to write some code to handle the user’s information and perform authentication. For the Gmail user, we will first create a class named TestUser and then inherit it from GoogleUser class. The following is the complete implementation of both of the classes.
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; | |
} | |
} |
Now, we need to create a helper class that will take care of the authentication of a Gmail account. We will name this class as GoogleOAuthHelper. The following is the complete implementation of this class.
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; | |
} | |
} | |
} |
Create a Contact on Gmail in C#
The following are the steps to create a contact on Gmail in C#.
- First, create a Google user, get an access token, and initialize an IGmailClient object.
- Then, create an object of the Contact class.
- Set properties of the contact such as name, prefix, profession, etc.
- To set the postal address, create an instance of PostalAddress and set its properties.
- Add newly created address to the collection using the Contact.PhysicalAddresses.Add(PostalAddress) method.
- Set phone number details using PhoneNumber class.
- Add phone number details to collection using Contact.PhoneNumbers.Add(PhoneNumber) method.
- Create an instance of EmailAddress class, set the email address, and assign it to the contact.
- Finally, call IGmailClient.CreateContact(Contact) method to create Gmail contact.
The following code sample shows how to create a contact on Gmail in C#.
// Initialize Google user | |
GoogleUser User = new GoogleUser("user", "email address", "password", "clientId", "client secret"); | |
string accessToken; | |
string refreshToken; | |
// Get access token | |
GoogleOAuthHelper.GetAccessToken(User, out accessToken, out refreshToken); | |
// Get Gmail Client | |
IGmailClient client = GmailClient.GetInstance(accessToken, User.EMail); | |
// Create a contact | |
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"; | |
// Set postal address | |
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); | |
// Set phone number | |
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); | |
// Set other properties | |
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"; | |
// Set email address | |
EmailAddress eAddress = new EmailAddress(); | |
eAddress.Address = "email@gmail.com"; | |
contact.EmailAddresses.Add(eAddress); | |
// Create contact on Gmail | |
string contactUri = client.CreateContact(contact); |
Update a Contact on Gmail in C#
You can also update the details of a Gmail contact after accessing it. The following are the steps to update a contact in a Gmail account in C#.
- First, create a Google user, get an access token, and initialize an IGmailClient object.
- Get contacts in an array using IGmailClient.GetAllContacts() method.
- Fetch required contact from the array in a Contact object.
- Update the details of contact and call IGmailClient.UpdateContact(contact) method.
The following code sample shows how to update a contact in Gmail in C#.
// Initialize Google user | |
GoogleUser User = new GoogleUser("user", "email address", "password", "clientId", "client secret"); | |
string accessToken; | |
string refreshToken; | |
// Get access token | |
GoogleOAuthHelper.GetAccessToken(User, out accessToken, out refreshToken); | |
// Get IGmailClient | |
using (IGmailClient client = GmailClient.GetInstance(accessToken, User.EMail)) | |
{ | |
// Get all contacts | |
Contact[] contacts = client.GetAllContacts(); | |
Contact contact = contacts[0]; | |
contact.JobTitle = "Manager IT"; | |
contact.DepartmentName = "Customer Support"; | |
contact.CompanyName = "Aspose"; | |
contact.Profession = "Software Developer"; | |
// Update contact | |
client.UpdateContact(contact); | |
} |
Delete a Contact on Gmail in C#
Finally, let’s see how to delete a Gmail contact using C#. The following are the steps to perform this operation.
- First, create a Google user, get an access token, and initialize an IGmailClient object.
- Get contacts in an array using IGmailClient.GetAllContacts() method.
- Filter the desired contact from the array in a Contact object.
- Finally, call IGmailClient.DeleteContact(Contact.Id.GoogleId) method to delete the contact.
The following code sample shows how to delete a contact on Gmail in C#.
// Initialize Google user | |
GoogleUser User = new GoogleUser("user", "email address", "password", "clientId", "client secret"); | |
string accessToken; | |
string refreshToken; | |
// Get access token | |
GoogleOAuthHelper.GetAccessToken(User, out accessToken, out refreshToken); | |
// Get IGmailClient | |
using (IGmailClient client = GmailClient.GetInstance(accessToken, User.EMail)) | |
{ | |
// Get all contacts | |
Contact[] contacts = client.GetAllContacts(); | |
Contact contact = contacts[0]; | |
// Delete contact | |
client.DeleteContact(contact.Id.GoogleId); | |
} |
Get a Free API License
You can use Aspose.Email for .NET without evaluation limitations using a free temporary license.
Conclusion
In this article, you have learned how to create and update contacts in a Gmail account in C# .NET. Furthermore, you have seen how to delete a Gmail contact programmatically. Besides, you can visit the documentation to explore other features of Aspose.Email for .NET. In case you would have any questions, you can post to our forum.