/// <summary> /// Expands the fields in the template using the lookup provider /// </summary> /// <param name="fieldsLookup">A TFS lookup provider</param> /// <param name="template">The HTML like template</param> /// <returns>An expanded message</returns> internal static string ExpandTemplateFields(IFieldLookupProvider fieldsLookup, string template) { // process the work item fields string returnValue = template; // Process work item fields int endIndex = -1; int startIndex = template.IndexOf(EmailTemplate.FieldTag, endIndex + 1); while (startIndex > -1) { endIndex = template.IndexOf(EmailTemplate.FieldTag, startIndex + 1); var fieldName = template.Substring(startIndex + 2, endIndex - startIndex - 2); returnValue = returnValue.Replace(string.Format("{1}{0}{1}", fieldName, EmailTemplate.FieldTag), fieldsLookup.LookupWorkItemFieldValue(fieldName)); startIndex = template.IndexOf(EmailTemplate.FieldTag, endIndex + 1); } // Process alert fields endIndex = -1; startIndex = template.IndexOf(EmailTemplate.AlertTag, endIndex + 1); while (startIndex > -1) { endIndex = template.IndexOf(EmailTemplate.AlertTag, startIndex + 1); var fieldName = template.Substring(startIndex + 2, endIndex - startIndex - 2); returnValue = returnValue.Replace(string.Format("{1}{0}{1}", fieldName, EmailTemplate.AlertTag), fieldsLookup.LookupAlertFieldValue(fieldName)); startIndex = template.IndexOf(EmailTemplate.AlertTag, endIndex + 1); } return(returnValue); }
/// <summary> /// Sends the email build from a work item /// </summary> /// <param name="fieldsLookupProvider">The provider that extracts the data from Azure DevOps</param> /// <param name="templatePath">The path to the HTML (like) template file</param> /// <param name="includeAllWorkItemFields">If true all available work item fields are appended to the email body</param> /// <param name="includeAllAlertFields">If true all available alert fields are appended to the email body</param> public void SendEmailAlert( IFieldLookupProvider fieldsLookupProvider, string templatePath, bool includeAllWorkItemFields, bool includeAllAlertFields) { if (fieldsLookupProvider == null) { throw new ArgumentNullException("fieldsLookupProvider", "The fieldsLookupProvider cannot be null"); } var template = EmailTemplate.LoadTemplate(templatePath, fieldsLookupProvider.GetWorkItemType); if (template != null) { using (var msg = new MailMessage()) { var addresses = fieldsLookupProvider.GetInterestedEmailAddresses(this.domain); if (string.IsNullOrEmpty(addresses) == false) { msg.To.Add(addresses); msg.From = new MailAddress(this.fromAddress); msg.Subject = EmailHelper.ExpandTemplateFields(fieldsLookupProvider, template.Title); msg.IsBodyHtml = true; msg.Body = EmailHelper.ExpandTemplateFields(fieldsLookupProvider, template.Body); if (includeAllWorkItemFields == true) { msg.Body += fieldsLookupProvider.GetAllWorkItemFields(template.WiFieldHeader); } if (includeAllAlertFields == true) { msg.Body += fieldsLookupProvider.GetAllAlertFields(template.AlertFieldHeader); } using (var client = new SmtpClient(this.smptServer, this.port)) { if (string.IsNullOrEmpty(this.username)) { client.Credentials = CredentialCache.DefaultNetworkCredentials; } else { client.Credentials = new System.Net.NetworkCredential(this.username, this.password); } client.Send(msg); } logger.Info(string.Format("AzureDevOpsEventsProcessor: '{0}' email sent to {1}", msg.Subject, msg.To[0].Address)); } else { logger.Info(string.Format("AzureDevOpsEventsProcessor: '{0}' No email sent as no interested parties", msg.Subject)); } } } }