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