Friday, January 19, 2024

Sent Email in C#

Sent Email in C#:

//Option 1:
using System;
using System.Net.Mail;
using System.Security;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApp
{
    internal class Program
    {
        static async Task Main(string[] args)
        {
            Console.WriteLine("Start....");
            string password = "password"; //ConfigurationManager.AppSettings["EmailPassword"];
            SecureString secure_passWord = new SecureString();
            foreach (char c in password.ToCharArray()) { secure_passWord.AppendChar(c); }
            System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient();
            client.UseDefaultCredentials = false;
            client.EnableSsl = true;
            //client.Credentials = new NetworkCredential("abc@xyz.com", secure_passWord);
            client.Credentials = new NetworkCredential("abc@xyz.com", "password");
            client.Port = 587; //replace with actual value
            client.Host = "smpt.mail.com"; //replace with actual value
            //client.DeliveryMethod = SmtpDeliveryMethod.Network;
            MailMessage mail = new MailMessage();
            mail.From = new MailAddress("abc@xyz.com");
            mail.To.Add("def@xyz.com");
            mail.Subject = "Test Mail";
            mail.Body = "Test body";
            mail.BodyEncoding = Encoding.UTF8;
            mail.IsBodyHtml = true;
            client.Send(mail);
            Console.WriteLine("End....");
        }
    }
}


//Option 2:
//https://learn.microsoft.com/en-us/azure/communication-services/quickstarts/email/send-email?tabs=windows%2Cconnection-string&pivots=programming-language-csharp
//Quickstart: How to send an email using Azure Communication Service
using Azure;
using Azure.Communication.Email;
 
namespace SendEmail
{
    internal class Program
    {
        static async Task Main(string[] args)
        {
            string connectionString = "connectionString";
            EmailClient emailClient = new EmailClient(connectionString);
            var subject = "Welcome to Azure Communication Service Email APIs.";
            var htmlContent = "<html><body><h1>Quick send email test</h1><br/><h4>This email message is sent from Azure Communication Service Email.</h4><p>This mail was sent using .NET SDK!!</p></body></html>";
            var sender = "DoNotReply@fcc11977-0b46-46c9-a657-4216db032070.azurecomm.net";
            var recipient = "abc@xyz.com";
            try
            {
                Console.WriteLine("Sending email...");
                EmailSendOperation emailSendOperation = await emailClient.SendAsync(Azure.WaitUntil.Completed, sender, recipient, subject, htmlContent);
                EmailSendResult statusMonitor = emailSendOperation.Value;
                Console.WriteLine($"Email Sent. Status = {emailSendOperation.Value.Status}");
                string operationId = emailSendOperation.Id;
                Console.WriteLine($"Email operation id = {operationId}");
            }
            catch (RequestFailedException ex)
            {
                Console.WriteLine($"Email send operation failed with error code: {ex.ErrorCode}, message: {ex.Message}");
            }
        }
    }
}


//Option 3:
using Microsoft.Identity.Client;
using Newtonsoft.Json;
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApp
{
    internal class Program
    {
        static async Task Main(string[] args)
        {
            //Required Azure Application Permissions : Mail.Send
            string clientId = "clientId";
            string clientSecret = "clientSecret";
            string tenantId = "tenantId";
            string userEmail = "abc@xyz.com"; // The user on behalf of whom you want to send the email
 
            var confidentialClient = ConfidentialClientApplicationBuilder
                .Create(clientId)
                .WithClientSecret(clientSecret)
                .WithAuthority(new Uri($"https://login.microsoftonline.com/{tenantId}"))
                .Build();
 
            var authResult = await confidentialClient.
                AcquireTokenForClient(new[] { "https://graph.microsoft.com/.default" })
                .ExecuteAsync();
 
            string accessToken = authResult.AccessToken;
 
            using (var httpClient = new HttpClient())
            {
                //Required Azure Application Permissions : Mail.Send
                var apiUrl = $"https://graph.microsoft.com/v1.0/users/{userEmail}/sendMail"; //Mail.Send
 
                var message = new
                {
                    message = new
                    {
                        subject = "Subject of the email",
                        body = new
                        {
                            content = "Body of the email",
                            contentType = "Text"
                        },
                        toRecipients = new[]
                        {
                        new { emailAddress = new { address = "def@xyz.com" } }
                    }
                    }
                };
 
                var jsonContent = new StringContent(JsonConvert.SerializeObject(message), Encoding.UTF8, "application/json");
                httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
 
                var response = await httpClient.PostAsync(apiUrl, jsonContent);
 
                if (response.IsSuccessStatusCode)
                {
                    Console.WriteLine("Email sent successfully.");
                }
                else
                {
                    Console.WriteLine($"Error: {response.StatusCode} - {await response.Content.ReadAsStringAsync()}");
                }
            }
        }
    }
}


//Option 4:
//https://learn.microsoft.com/en-us/entra/identity-platform/v2-oauth-ropc
Microsoft identity platform and OAuth 2.0 Resource Owner Password Credentials
 
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApp
{
    internal class Program
    {
        static async Task Main(string[] args)
        {
            var clientId = "clientId";
            var tenantId = "tenantId";
            var clientSecret = "clientSecret";
            var userName = "userName";
            var userPassword = "userPassword";
            var requestUri = "https://login.microsoftonline.com/" + tenantId + "/oauth2/v2.0/token";
            var apiUrl = "https://graph.microsoft.com/v1.0/me/sendmail";
 
            HttpClient client = new HttpClient();
            HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, requestUri);
            request.Headers.Add("Cookie", "fpc=AohS41ndFd5KswGP3EyyEk11dsNQAQAAADIbQ90OAAAA; stsservicecookie=estsfd; x-ms-gateway-slice=estsfd");
            List<KeyValuePair<string, string>> collection = new List<KeyValuePair<string, string>>
            {
                new KeyValuePair<string, string>("client_id", clientId),
                new KeyValuePair<string, string>("client_secret", clientSecret),
                new KeyValuePair<string, string>("username", userName),
                new KeyValuePair<string, string>("password", userPassword),
                new KeyValuePair<string, string>("grant_type", "password"),
                new KeyValuePair<string, string>("scope", "mail.send")
            };
            FormUrlEncodedContent content = new FormUrlEncodedContent(collection);
            request.Content = content;
            HttpResponseMessage response = await client.SendAsync(request);
            response.EnsureSuccessStatusCode();
            string responseContent = await response.Content.ReadAsStringAsync();
            //Console.WriteLine(responseContent);
            dynamic jsonData = JsonConvert.DeserializeObject(responseContent);
            string accessToken = jsonData.access_token;
            Console.WriteLine(accessToken);
 
            var message = new
            {
                message = new
                {
                    subject = "Subject of the email",
                    body = new
                    {
                        content = "Body of the email",
                        contentType = "Text"
                    },
                    toRecipients = new[]
                    {
                        new { emailAddress = new { address = "user1@gmail.com" } }
                    }
                }
            };
            var jsonContent = new StringContent(JsonConvert.SerializeObject(message), Encoding.UTF8, "application/json");
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
            HttpResponseMessage response1 = await client.PostAsync(apiUrl, jsonContent);
            if (response1.IsSuccessStatusCode)
            {
                Console.WriteLine("Email sent successfully.");
            }
            else
            {
                Console.WriteLine($"Error: {response1.StatusCode} - {await response1.Content.ReadAsStringAsync()}");
            }
            Console.ReadKey();
        }
    }
}


//Option 5:
Authenticate an IMAP, POP or SMTP connection using OAuth
https://learn.microsoft.com/en-us/exchange/client-developer/legacy-protocols/how-to-authenticate-an-imap-pop-smtp-application-by-using-oauth


Method 1:
using Azure.Identity;
using Microsoft.Graph;
using Microsoft.Graph.Models;
using Microsoft.Graph.Users.Item.SendMail;

public class Program
{
    public static async Task Main(string[] args)
    {
        string tenantId = "tenantid";
        string clientId = "clientid";
        string clientSecret = "secret";
        string userFromEmail = "user1@domain.com";
        string userToEmail = "user2@domain.com";

        var credential = new ClientSecretCredential(tenantId, clientId, clientSecret);
        var graphClient = new GraphServiceClient(credential);
        List<string> userToEmailList = new List<string> { userToEmail };
        var message = new Message
        {
            Subject = "Test Subject",
            Body = new ItemBody
            {
                ContentType = BodyType.Html,
                Content = "Test Body"
            },
            ToRecipients = userToEmailList.Select(email => new Recipient { EmailAddress =             new EmailAddress { Address = email } }).ToList(),
        };
        var sendMailRequest = new SendMailPostRequestBody { Message = message };
        await graphClient.Users[userFromEmail].SendMail.PostAsync(sendMailRequest);         //With out Await and Async         //var sendMailTask = graphClient.Users[userFromEmail].SendMail.PostAsync(sendMailRequest);         //sendMailTask.ConfigureAwait(false).GetAwaiter().GetResult();
        Console.ReadKey();
    }
}

Method 2:
using MailKit;
using MailKit.Net.Imap;
using MailKit.Security;
using Microsoft.Identity.Client;
using MimeKit;
 
class Program
{
    private static async Task Main(string[] args)
    {
        var clientId = "-5a53-4525-afda-";
        var tenantId = "-02f1-478e-bc6a-";
        var clientSecret = "~J2EOPVNjynt-~AHcGN";
        var userEmail = "sreekanth@.onmicrosoft.com";
        var smtpHost = "smtp.office365.com";
        var smtpPort = 587;
 
        var app = ConfidentialClientApplicationBuilder.Create(clientId)
            .WithClientSecret(clientSecret)
            .WithAuthority(new Uri($"https://login.microsoftonline.com/{tenantId}/v2.0"))
            .Build();
       
        string[] scopes = new[] { "https://outlook.office365.com/.default" };
        var authToken = await app.AcquireTokenForClient(scopes).ExecuteAsync();
        var accessToken = authToken.AccessToken;
        //Console.WriteLine("accessToken: " + accessToken);
 
        //oauth2 1
        var oauth2_1 = new SaslMechanismOAuth2(userEmail, authToken.AccessToken);
        using (var client = new ImapClient(new ProtocolLogger("imapLog.txt")))
        {
            client.Connect("outlook.office365.com", 993, SecureSocketOptions.SslOnConnect);
            //client.AuthenticationMechanisms.Remove("XOAUTH2");
            client.Authenticate(oauth2_1);
            var inbox = client.Inbox;
            inbox.Open(MailKit.FolderAccess.ReadOnly);
            Console.WriteLine("Total messages: {0}", inbox.Count);
            Console.WriteLine("Recent messages: {0}", inbox.Recent);
            client.Disconnect(true);
        }
 
        //oauth2 2
        var oauth2_2 = new SaslMechanismOAuth2(userEmail, authToken.AccessToken);
        var message = new MimeMessage();
        message.From.Add(new MailboxAddress("Sreekanth", userEmail)); // Your email 
        message.To.Add(new MailboxAddress("Sreekanth", userEmail)); // Replace with recipient's email 
        message.Subject = "Test Email with OAuth2";
        message.Body = new TextPart("plain")
        {
            Text = "This is a test email sent using OAuth2 authentication with SMTP."
        };
 
        using (var client = new MailKit.Net.Smtp.SmtpClient())
        {
            try
            {
                await client.ConnectAsync(smtpHost, smtpPort, SecureSocketOptions.StartTls);
                client.Authenticate(oauth2_2);
 
                await client.SendAsync(message);
                Console.WriteLine("Email sent successfully!");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Error sending email: {ex.Message}");
            }
            finally
            {
                await client.DisconnectAsync(true);
            }
        }
 
        //oauth2 3
        var oauth2_3 = new SaslMechanismOAuth2(userEmail, authToken.AccessToken);
        using (var client = new ImapClient(new ProtocolLogger("imapLog.txt")))
        {
            client.Connect("outlook.office365.com", 993, SecureSocketOptions.SslOnConnect);
            //client.AuthenticationMechanisms.Remove("XOAUTH2");
            client.Authenticate(oauth2_3);
            var inbox = client.Inbox;
            inbox.Open(MailKit.FolderAccess.ReadOnly);
            Console.WriteLine("Total messages: {0}", inbox.Count);
            Console.WriteLine("Recent messages: {0}", inbox.Recent);
            client.Disconnect(true);
        }
        Console.ReadKey();
    }
}
 

 

7 comments:

  1. Excellent inspiration for future projects. ai house design

    ReplyDelete
  2. Delightfully your meaningful initiative unsent project encourages people to express hidden emotions without fear of judgment. Every heartfelt message creates lasting emotional connections, reminding readers that vulnerability is powerful, healing is possible, and authentic feelings always deserve recognition and respect.

    ReplyDelete
  3. I completely trust this platform, bloxshade.org because it consistently delivers reliable gaming resources with outstanding usability. Every feature performs efficiently, navigation remains smooth, and everything feels thoughtfully designed. It's an excellent destination for players.

    ReplyDelete
  4. Many thanks for creating such, spacesniffer.info because it simplifies locating unnecessary files with ease. The interface is intuitive, scan results are visually appealing, and performance remains dependable. It's an excellent resource for improving storage management.

    ReplyDelete

Featured Post

Generating a Microsoft Graph Bearer Token in Power Automate Desktop (App ID + Secret)

Generating a Microsoft Graph Bearer Token in Power Automate Desktop (App ID + Secret) Power Automate Desktop has no native Microsoft Graph c...

Popular posts