Difference between revisions of "CSharp:.Net Email"
From Aino Wiki
(→Verifica server SMTP) |
(No difference)
|
Latest revision as of 15:04, 18 March 2022
Libreria standard .Net
Invio di e-mail mediante server SMTP.
Uso
Esempio reale
using NLog; using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.IO; using System.Net.Mail; using System.Reflection; //...etc private static Logger m_logger = LogManager.GetCurrentClassLogger(); //...etc /// <summary> /// Invio di una e-mail usando la libreria standard di .Net. /// Esecuzione protetta ovvero se c'è un errore o scatta una eccezione non si interrompe ma /// restituisce in uscita il messaggio di errore. /// </summary> /// <param name="smtpSrv"></param> /// <param name="smtpPort"></param> /// <param name="isSSL"></param> /// <param name="isAnonymous"></param> /// <param name="smtpDomain"></param> /// <param name="senderAlias"></param> /// <param name="userEmail"></param> /// <param name="userPw"></param> /// <param name="toEmailCSV"></param> /// <param name="CCEmailCSV"></param> /// <param name="BCCEmailCSV"></param> /// <param name="subject"></param> /// <param name="body"></param> /// <param name="attachFilePathCSV"></param> /// <param name="logVerboseLevel">0=(Default) Nessun log! 1=Solo Errori, 2=Errori e Waring, 3=Information, 4=Tutto!</param> /// <returns>Messaggio di errore</returns> public static string SendEmail(string smtpSrv, int smtpPort , bool isSSL, bool isAnonymous , string smtpDomain, string senderAlias , string userEmail, string userPw , string toEmailCSV, string CCEmailCSV, string BCCEmailCSV , string subject , string body , string attachFilePathCSV , int logVerboseLevel = 0) // 0=Nessun log! 1=Solo Errori, 2=Errori e Waring, 3=Information, 4=Tutto! { string strErrorMessage = string.Empty; string emailTo = string.Empty; string firstAttachFileNameFullPath = string.Empty; MailMessage email = new MailMessage(); try { #region Log if (logVerboseLevel >= 4) m_logger.Debug("Send e-mail with Dot NET Lib"); if (smtpPort <= 0) { if (logVerboseLevel >= 2) m_logger.Warn("No port nr supplied, setting 25 default."); smtpPort = 25; } #endregion #region Normalizzazione CSV toEmailCSV = toEmailCSV.Replace(',', ';'); string[] arrEmailToDest = toEmailCSV.Split(new char[] { ';' } , StringSplitOptions.RemoveEmptyEntries); CCEmailCSV = CCEmailCSV.Replace(',', ';'); string[] arrEmailCCDest = CCEmailCSV.Split(new char[] { ';' } , StringSplitOptions.RemoveEmptyEntries); BCCEmailCSV = BCCEmailCSV.Replace(',', ';'); string[] arrEmailBCCDest = BCCEmailCSV.Split(new char[] { ';' } , StringSplitOptions.RemoveEmptyEntries); //userPw = string.IsNullOrWhiteSpace(userPw) ? null : userPw; string[] arrAttachFilePath = attachFilePathCSV.Split(new char[] { ';' } , StringSplitOptions.RemoveEmptyEntries); #endregion SmtpClient client = new SmtpClient(); client.Port = smtpPort; client.Host = smtpSrv; client.EnableSsl = isSSL; //client.ClientCertificates //client.Timeout = timeout; //In milliseconds client.DeliveryMethod = SmtpDeliveryMethod.Network; client.UseDefaultCredentials = false; if (!isAnonymous) { if (string.IsNullOrWhiteSpace(smtpDomain)) { client.Credentials = new System.Net.NetworkCredential(userEmail, userPw); } else { client.Credentials = new System.Net.NetworkCredential(userEmail, userPw, smtpDomain); } } #region Composizione Mitt. e Destinatari email.Sender = new MailAddress(userEmail, senderAlias); email.From = new MailAddress(userEmail, senderAlias); // Destinatari in TO foreach (string destEmail in arrEmailToDest) { email.To.Add(new MailAddress(destEmail, destEmail)); emailTo = destEmail; } // Destinatari in CC foreach (string destEmail in arrEmailCCDest) { email.CC.Add(new MailAddress(destEmail, destEmail)); } // Destinatari in BCC foreach (string destEmail in arrEmailBCCDest) { email.Bcc.Add(new MailAddress(destEmail, destEmail)); } #endregion email.Subject = subject; email.IsBodyHtml = false; email.Body = body ?? string.Empty; //email.BodyEncoding = UTF8Encoding.UTF8; email.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure; #region Composizione allegati if (arrAttachFilePath != null && arrAttachFilePath.Length > 0) { foreach (string fileNameFullPath in arrAttachFilePath) { Attachment fileAttach = new Attachment(fileNameFullPath); email.Attachments.Add(fileAttach); } firstAttachFileNameFullPath = arrAttachFilePath[0]; } #endregion #region Log e INVIO ! if (logVerboseLevel >= 4) m_logger.Debug("\r\n" + "\tServer: \"{0}\"\t\tPort: \"{1}\"\r\n" + "\tSMTP Domain: \"{2}\"\r\n" + "\tSender Alias: \"{3}\"\r\n" + "\tIsAnonymous: \"{4}\"\r\n" + "\tUserName: \"{5}\"\r\n" + "\tSSL?: \"{6}\"\r\n" + "\tTo: \"{7}\"\r\n" + "\tNr To: \"{8}\"\r\n" + "\tCC CSV: \"{9}\"\r\n" + "\tBCC CSV: \"{10}\"\r\n" + "\tAttachFileFullPath: \"{11}\"\r\n" + "\tSubject: \"{12}\"\r\n" + "\tBody: \"{13}\"\r\n" , client.Host, client.Port , smtpDomain, senderAlias , isAnonymous , userEmail , client.EnableSsl , emailTo, arrEmailToDest.Length, CCEmailCSV, BCCEmailCSV , firstAttachFileNameFullPath , subject , body ?? "<Empty>"); client.Send(email); //INVIO !!! if (logVerboseLevel >= 3) m_logger.Info("E-mail sent"); // Se ci son stati allegati occorre "staccarli" dall'oggetto 'client' per evitare che // successivamente non li si possa cancellare perché risultanti in uso ! if (email.Attachments != null) { for (int i = email.Attachments.Count - 1; i >= 0; i--) { email.Attachments[i].Dispose(); } email.Attachments.Clear(); email.Attachments.Dispose(); if (logVerboseLevel >= 4) m_logger.Info("Attachments disposed"); } #endregion email.Dispose(); email = null; } catch (Exception ex) { string fullError = ex.Message; if (logVerboseLevel >= 2) m_logger.Error(ex); Exception iEx = ex; while (iEx.InnerException != null && !string.IsNullOrWhiteSpace(iEx.InnerException.Message)) { fullError = string.Format("{0} {1}", fullError, iEx.InnerException.Message); iEx = iEx.InnerException; } strErrorMessage = string.Format("Error sending e-mail: '{0}'\r\nTo '{1}'" , fullError, toEmailCSV); } return strErrorMessage; }
Verifica server SMTP
public static bool? SMTP_Hello(string smtpSrv, int smtpPort, bool isSSL , out string srvSMTPResponse) { bool? srvUP = null; srvSMTPResponse = string.Empty; try { using (var client = new TcpClient()) { client.Connect(smtpSrv, smtpPort); // As GMail requires SSL we should use SslStream // If your SMTP server doesn't support SSL you can // work directly with the underlying stream if (isSSL) { using (var stream = client.GetStream()) using (var sslStream = new SslStream(stream)) { sslStream.AuthenticateAsClient(smtpSrv); using (var writer = new StreamWriter(sslStream)) using (var reader = new StreamReader(sslStream)) { writer.WriteLine("EHLO " + smtpSrv); writer.Flush(); srvSMTPResponse = reader.ReadLine(); m_logger.Info(srvSMTPResponse); //Console.WriteLine(reader.ReadLine()); // GMail responds with: 220 mx.google.com ESMTP } } } else { using (var stream = client.GetStream()) using (var writer = new StreamWriter(stream)) using (var reader = new StreamReader(stream)) { writer.WriteLine("EHLO " + smtpSrv); writer.Flush(); srvSMTPResponse = reader.ReadLine(); m_logger.Info(srvSMTPResponse); } } } srvUP = true; } catch (Exception ex) { srvUP = false; srvSMTPResponse = ex.Message; m_logger.Error(ex.Message); } return srvUP; }
Mappa e Link
Visual Studio | MS SQL | Dizionario
Parole chiave: