31/03/2016 Doru Bulubasa

Cum sa trimiti email-uri din cod (C#)

Image blog

In ultima vreme, lucrand la diferitele update-uri necesare site-ului nostru sau a aplicatiilor pe care le avem in portofoliu (sau in lucru) ne-am lovit de nevoia de a expedia email-uri.

Am descoperit ca sunt ceva mai multe posibilitati de a face acest lucru:
1. SMTP (direct mail)
2. SQL DB Mail (aici avem nevoie de o instanta SQL Server)
3. Utilizarea unui SDK al unui serviciu de trimitere de mail-uri (noi fiind parteneri Microsoft, utilizam SendGrid API).

O sa descriem acum, in detaliu, cum se face trimiterea prin fiecare metoda.

SMTP

Aceasta metoda este cea mai uzuala si cea mai simpla de folosit. Nu iti trebuie decat acces la o adresa de mail si nimic mai mult. Codul este unul foarte simplu:

        protected void SendEmail()
        {
            SmtpClient smtpClient = new SmtpClient();
            smtpClient.Host = "mail.ludoprogramming.com";
            smtpClient.Credentials = new System.Net.NetworkCredential("UserName", "Password");
            smtpClient.Port = 25;//Usualy it is port 25 for custom domain
            MailAddress addr = new MailAddress("destination@mail.com");
            MailMessage mail = new MailMessage();
            mail.IsBodyHtml = true;
            mail.From = new MailAddress("no-reply@ludoprogramming.com", "Test email");
            mail.To.Add(addr);
            mail.Subject = "Email test subject";
            mail.Body = "This is the mail body! You can add here an HTML interface.";
          mail.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure | DeliveryNotificationOptions.OnSuccess | DeliveryNotificationOptions.Delay;
            mail.Headers.Add("Disposition-Notification-To", "marketing@ludoprogramming.com");
            AlternateView alternate = AlternateView.CreateAlternateViewFromString("This is the mail body! You can add here an HTML interface.",
                new System.Net.Mime.ContentType("text/html")); //the AlternateView is mainly for YAHOO
            mail.AlternateViews.Add(alternate);
            smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
            smtpClient.Send(mail);
        }

SQL DB Mail

Aceasta metoda este ceva mai complexa. In primul rand, trebuie activat SQL DB Mail pe SQL Server-ul nostru. Apoi trebuie setat profilul (gasiti aici mai multe detalii despre cum sa creati profilul).

Din punct de vedere al codul nu trebuie decat sa trimitem datele corecte la o anumita procedura stocata: sp_send_dbmail (este chiar mai simplu decat SMTP).

        protected void SendEmail()
        {
            SqlConnection SqlConn = new SqlConnection("data base connection string");
            SqlCommand sqlCmd = new SqlCommand("sp_send_dbmail", SqlConn);
            sqlCmd.CommandType = CommandType.StoredProcedure;
            List<SqlParameter> List = new List<SqlParameter>();
            List.Add(new SqlParameter { ParameterName = "@profile_name", Value = "SqlDbMailProfile", SqlDbType = SqlDbType.VarChar });
            List.Add(new SqlParameter { ParameterName = "@recipients", Value = "destination@mail.com", SqlDbType = SqlDbType.VarChar });
            List.Add(new SqlParameter { ParameterName = "@from_address", Value = "no-reply@ludoprogramming.com", SqlDbType = SqlDbType.VarChar });
            List.Add(new SqlParameter { ParameterName = "@subject", Value = "Email test subject", SqlDbType = SqlDbType.VarChar });
            List.Add(new SqlParameter { ParameterName = "@body_format", Value = "HTML", SqlDbType = SqlDbType.VarChar });
            List.Add(new SqlParameter { ParameterName = "@body", Value = "This is the mail body! You can add here an HTML interface.", SqlDbType = SqlDbType.VarChar });
            SqlConn.Open();
            sqlCmd.ExecuteNonQuery();
            SqlConn.Close();
        }

Cele doua metode de mai sus sunt recomandate pentru trimiterea de email-uri unul cate unul. Nu se recomanda trimiterea masiva de mesaje (oricum, trebuie verificate limitele impuse de servere-le de mail inainte de a face setarile).

SendGrid API

UtilizandAPI-ul SendGrid se poate trimite si masiv. Conditia de baza este insa urmatoarea: acele adrese de mail catre care se face expedierea sa fie corecte, iar utilizatorul sa fi acceptat sa primeasca acele mail-uri. In caz contrar, exista posibilitatea ca si reputatia profilului sa scada si sa atraga de la sine suspendarea sau chiar anularea contului.

Acestea fiind spuse, iata codul:

        protected void SendEmail()
        {
            SendGridMessage message = new SendGridMessage();
            string username = "SendGrid UserName";
            string pswd = "Password";
            message.AddTo("destination@mail.com");
            message.From = new MailAddress("no-reply@ludoprogramming.com", "");
            message.Subject = "Email test subject";
            message.Html = "This is the mail body! You can add here an HTML interface.";
            message.EnableClickTracking(true);
            message.EnableOpenTracking();
            NetworkCredential credentials = new NetworkCredential(username, pswd);
            Web transportWeb = new Web(credentials);
            transportWeb.DeliverAsync(message);
        }