Integrating Zoho Mail API in .NET (Without SMTP Issues) - A Complete Guide

Views: 8
Comments: 0
Like/Unlike: 0
Posted On: 29-Apr-2026 03:09 

Share:   fb twitter linkedin
Rahul M...
5000 Points
33 Posts

 

If you're using shared hosting (like GoDaddy) or facing SMTP restrictions, switching to the Zoho Mail API is the most reliable solution.

In this guide, we’ll walk through a real-world, working approach to integrate Zoho Mail API in .NET — including common mistakes, fixes, and production-ready tips.


❌ Why SMTP Fails (Real Problem)

Many developers start with SMTP:

SmtpClient client = new SmtpClient("smtppro.zoho.in");
client.Port = 587;
client.EnableSsl = false;

But on shared hosting, you may get:

SocketException: access forbidden (port 587)

👉 This happens because:

  • Hosting providers block SMTP ports
  • SSL/TLS is required
  • Authentication fails with SSO accounts


✅ Solution: Use Zoho Mail API

Instead of SMTP, use the REST API provided by Zoho.

✔ Works on any hosting
✔ No port blocking
✔ Secure OAuth authentication



🔐 Step 1: Create OAuth Client

Go to:
👉 https://api-console.zoho.in/

  • Create Server-based application
  • Add redirect URI (e.g., http://localhost)
  • Copy:
    • Client ID
    • Client Secret


🔑 Step 2: Generate Authorization Code

Open this URL in browser:

https://accounts.zoho.in/oauth/v2/auth?
scope=ZohoMail.messages.CREATE,ZohoMail.accounts.READ
&client_id=YOUR_CLIENT_ID
&response_type=code
&access_type=offline
&redirect_uri=http://localhost

👉 After login, you’ll get:

http://localhost/?code=1000.xxxxx


🔄 Step 3: Get Refresh Token

POST:

https://accounts.zoho.in/oauth/v2/token

Body:

grant_type=authorization_code
client_id=YOUR_CLIENT_ID
client_secret=YOUR_CLIENT_SECRET
redirect_uri=http://localhost
code=AUTH_CODE

👉 Response includes:

  • refresh_token ✅ (store this safely)


🔁 Step 4: Get Access Token

var content = new FormUrlEncodedContent(new[]
{
    new KeyValuePair<string,string>("refresh_token","YOUR_REFRESH_TOKEN"),
    new KeyValuePair<string,string>("client_id","YOUR_CLIENT_ID"),
    new KeyValuePair<string,string>("client_secret","YOUR_CLIENT_SECRET"),
    new KeyValuePair<string,string>("grant_type","refresh_token")
});

var response = await client.PostAsync(
    "https://accounts.zoho.in/oauth/v2/token",
    content);

👉 Access token expires in ~1 hour



🆔 Step 5: Get Account ID

Call:

GET https://mail.zoho.in/api/accounts

Header:

Authorization: Zoho-oauthtoken ACCESS_TOKEN

👉 Response:

{
  "data": [
    {
      "accountId": "123456789",
      "emailAddress": "info@niceonecode.com"
    }
  ]
}


✉️ Step 6: Send Email via API

Endpoint:

POST https://mail.zoho.in/api/accounts/{accountId}/messages

Headers:

Authorization: Zoho-oauthtoken ACCESS_TOKEN
Content-Type: application/json

Body:

{
  "fromAddress": "NiceOneCode <info@niceonecode.com>",
  "toAddress": "user@gmail.com",
  "subject": "Test Email",
  "content": "Hello from Zoho API",
  "mailFormat": "html"
}


💻 .NET Working Code

var client = new HttpClient();

client.DefaultRequestHeaders.Add(
    "Authorization",
    "Zoho-oauthtoken " + accessToken);

var json = @"{
    ""fromAddress"": ""NiceOneCode <info@niceonecode.com>"",
    ""toAddress"": ""test@gmail.com"",
    ""subject"": ""Test"",
    ""content"": ""Hello from Zoho API"",
    ""mailFormat"": ""html""
}";

var content = new StringContent(json, Encoding.UTF8, "application/json");

var response = await client.PostAsync(
    $"https://mail.zoho.in/api/accounts/{accountId}/messages",
    content);


✅ Final Verdict

If you’re building production apps:

👉 Use Zoho Mail API instead of SMTP

✔ Works on shared hosting
✔ More secure
✔ No firewall issues

 

 

0 Comments
 Log In to Chat