Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Test email options #283

Open
wants to merge 12 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,11 @@
using System.Collections.Generic;
using System.ComponentModel;
using System.Net;
using System.Net.Http;
using System.Net.Mail;
using System.Security;
using System.Threading;
using System.Threading.Tasks;
using System.Web.Http;
using FaultData.DataWriters.Emails;
using GSF.Configuration;
Expand Down Expand Up @@ -138,7 +141,8 @@ public IHttpActionResult SendTestEmail(int emailID, string userID, int eventID)

try
{
emailService.SendEmail(email, evt, new List<string>() { account.Email }, response.DataSourceResponses);
emailService.SendEmail(email, evt, new List<string>() { account.Email }, out EmailResponse resultEmail);
response.DataSourceResponses = resultEmail.DataSources;
return Ok(response);
}
catch (Exception ex)
Expand All @@ -149,6 +153,56 @@ public IHttpActionResult SendTestEmail(int emailID, string userID, int eventID)
}
}

[Route("testFile/{emailID:int}/{eventID:int}/{save:bool}"), HttpGet]
public async Task<HttpResponseMessage> TestEmailFile(int emailID, int eventID, bool save, CancellationToken cancellationToken)
{
string subject = null;

IHttpActionResult RunTest()
{
Settings settings = new Settings(GetConfigurator());
EventEmailSection eventEmailSettings = settings.EventEmailSettings;
EmailService emailService = new EmailService(CreateDbConnection, GetConfigurator());

using (AdoDataConnection connection = CreateDbConnection())
{
Event evt = new TableOperations<Event>(connection).QueryRecordWhere("ID = {0}", eventID);
if (evt is null)
return BadRequest($"Event with ID {eventID} does not exists");


EmailType email = new TableOperations<EmailType>(connection).QueryRecordWhere("ID = {0}", emailID);
if (email is null)
return BadRequest($"Email type with ID {emailID} does not exists");

try
{
emailService.SendEmail(email, evt, new List<string>() { }, save, out EmailResponse emailResponse);
subject = emailResponse.Subject;
return Ok(emailResponse.Body);
}
catch (Exception ex)
{
Exception wrapper = new Exception("Email type does not produce valid email please check the Template", ex);
return UnprocessibleEntity(wrapper.ToString());
}
}
}

IHttpActionResult testResult = RunTest();
HttpResponseMessage httpResponse = await testResult.ExecuteAsync(cancellationToken);

if (!(subject is null))
{
httpResponse.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment")
{
FileName = subject
};
}

return httpResponse;
}

[Route("testReport/{reportID:int}/{userID}/{current}"), HttpGet]
public IHttpActionResult SendTestReport(int reportID, string userID, string current)
{
Expand All @@ -173,7 +227,8 @@ public IHttpActionResult SendTestReport(int reportID, string userID, string curr
if (!DateTime.TryParse(current, out DateTime xdaNow))
xdaNow = DateTime.UtcNow;

emailService.SendScheduledEmail(report, new List<string>() { account.Email }, response.DataSourceResponses, xdaNow);
emailService.SendScheduledEmail(report, new List<string>() { account.Email }, out EmailResponse emailResponse, xdaNow);
response.DataSourceResponses = emailResponse.DataSources;
return Ok(response);
}
catch (Exception ex)
Expand Down
60 changes: 38 additions & 22 deletions Source/Libraries/FaultData/DataWriters/Emails/EmailService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,14 @@ public class DataSourceResponse

public EmailDataSource Model { get; set; }
}

public class EmailResponse
{
public List<DataSourceResponse> DataSources { get; } = new List<DataSourceResponse>();
public string Body { get; set; }
public string Subject { get; set; }
}

#endregion

#region [ Constructors ]
Expand Down Expand Up @@ -160,30 +168,34 @@ public bool SendEmail(EmailType email, List<int> eventIDs, Event evt, DateTime x
return true;
}

public void SendEmail(EmailType email, Event evt, List<string> recipients, List<DataSourceResponse> dataSourceResponses) =>
SendEmail(email, evt, recipients, new DateTime(), new List<int>(), false, dataSourceResponses);
public void SendEmail(EmailType email, Event evt, List<string> recipients, bool saveToFile, out EmailResponse response) =>
SendEmail(email, evt, recipients, new DateTime(), new List<int>(), saveToFile, out response);

public void SendEmail(EmailType email, Event evt, List<string> recipients, out EmailResponse response) =>
SendEmail(email, evt, recipients, new DateTime(), new List<int>(), false, out response);

public void SendEmail(EmailType email, Event evt, List<string> recipients) =>
SendEmail(email, evt, recipients, new DateTime(), new List<int>(), false, null);
SendEmail(email, evt, recipients, new DateTime(), new List<int>(), false, out EmailResponse _);

private void SendEmail(EmailType email, Event evt, List<string> recipients, DateTime xdaNow, List<int> eventIDs, bool saveToFile) =>
SendEmail(email, evt, recipients, xdaNow, eventIDs, saveToFile, null);
SendEmail(email, evt, recipients, xdaNow, eventIDs, saveToFile, out EmailResponse _);

private void SendEmail(EmailType email, Event evt, List<string> recipients, DateTime xdaNow, List<int> eventIDs, bool saveToFile, List<DataSourceResponse> dataSourceResponses)
private void SendEmail(EmailType email, Event evt, List<string> recipients, DateTime xdaNow, List<int> eventIDs, bool saveToFile, out EmailResponse response)
{
List<Attachment> attachments = new List<Attachment>();
List<DataSourceResponse> responses = dataSourceResponses ?? new List<DataSourceResponse>();

response = new EmailResponse();

try
{
LoadDataSources(email, evt, responses);
LoadDataSources(email, evt, response.DataSources);

Settings settings = new Settings(Configure);
XElement templateData = new XElement("data", responses.Select(r => r.Data));
XElement templateData = new XElement("data", response.DataSources.Select(r => r.Data));
XDocument htmlDocument = ApplyTemplate(email, templateData.ToString());
ApplyChartTransform(attachments, htmlDocument, settings.EmailSettings.MinimumChartSamplesPerCycle);
ApplyImageEmbedTransform(attachments, htmlDocument);
SendEmail(recipients, htmlDocument, attachments, email, settings, (saveToFile ? email.FilePath : null));
SendEmail(recipients, htmlDocument, attachments, email, settings, response, (saveToFile ? email.FilePath : null));
if (eventIDs.Count() > 0)
LoadSentEmail(email, xdaNow, recipients, htmlDocument, eventIDs);
}
Expand All @@ -205,28 +217,29 @@ public bool SendScheduledEmail(ScheduledEmailType email, DateTime xdaNow)
return true;
}

public void SendScheduledEmail(ScheduledEmailType email, List<string> recipients, List<DataSourceResponse> dataSourceResponses, DateTime xdaNow) =>
SendScheduledEmail(email, recipients, false, dataSourceResponses, xdaNow);
public void SendScheduledEmail(ScheduledEmailType email, List<string> recipients, out EmailResponse response, DateTime xdaNow) =>
SendScheduledEmail(email, recipients, false, out response, xdaNow);

public void SendScheduledEmail(ScheduledEmailType email, List<string> recipients, bool saveToFile, DateTime xdaNow) =>
SendScheduledEmail(email, recipients, saveToFile, null, xdaNow);
SendScheduledEmail(email, recipients, saveToFile, out EmailResponse _, xdaNow);

private void SendScheduledEmail(ScheduledEmailType email, List<string> recipients, bool saveToFile, List<DataSourceResponse> dataSourceResponses, DateTime xdaNow)
private void SendScheduledEmail(ScheduledEmailType email, List<string> recipients, bool saveToFile, out EmailResponse response, DateTime xdaNow)
{
List<Attachment> attachments = new List<Attachment>();
List<DataSourceResponse> responses = dataSourceResponses ?? new List<DataSourceResponse>();

response = new EmailResponse();

try
{
LoadDataSources(email, xdaNow, responses);
LoadDataSources(email, xdaNow, response.DataSources);

Settings settings = new Settings(Configure);
XElement templateData = new XElement("data", responses.Select(r => r.Data));
XElement templateData = new XElement("data", response.DataSources.Select(r => r.Data));
XDocument htmlDocument = ApplyTemplate(email, templateData.ToString());

ApplyChartTransform(attachments, htmlDocument, settings.EmailSettings.MinimumChartSamplesPerCycle);
ApplyImageEmbedTransform(attachments, htmlDocument);
SendEmail(recipients, htmlDocument, attachments, email, settings, (saveToFile ? email.FilePath : null));
SendEmail(recipients, htmlDocument, attachments, email, settings, response, (saveToFile ? email.FilePath : null));
LoadSentEmail(email, xdaNow, recipients, htmlDocument);
}
finally
Expand Down Expand Up @@ -631,11 +644,14 @@ public void ApplyImageEmbedTransform(List<Attachment> attachments, XDocument htm
}
}

private void SendEmail(List<string> recipients, XDocument htmlDocument, List<Attachment> attachments, EmailTypeBase emailType, Settings settings, string filePath=null)
private void SendEmail(List<string> recipients, XDocument htmlDocument, List<Attachment> attachments, EmailTypeBase emailType, Settings settings, EmailResponse email, string filePath = null)
{
EmailSection emailSettings = settings.EmailSettings;
string smtpServer = emailSettings.SMTPServer;

email.Body = GetBody(htmlDocument);
email.Subject = GetSubject(htmlDocument, emailType);

if (string.IsNullOrEmpty(smtpServer))
return;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see you put the calls to GetBody() and GetSubject() before checking for smtpServer. Should we also modify WriteEmailToFile() so it can be invoked even without an SMTP server?


Expand All @@ -652,8 +668,8 @@ private void SendEmail(List<string> recipients, XDocument htmlDocument, List<Att

string fromAddress = emailSettings.FromAddress;
emailMessage.From = new MailAddress(fromAddress);
emailMessage.Subject = GetSubject(htmlDocument,emailType);
emailMessage.Body = GetBody(htmlDocument);
emailMessage.Subject = email.Subject;
emailMessage.Body = email.Body;
emailMessage.IsBodyHtml = true;

if (recipients.Count == 0)
Expand Down Expand Up @@ -683,7 +699,7 @@ private void SendEmail(List<string> recipients, XDocument htmlDocument, List<Att
smtpClient.Send(emailMessage);

//Write the email to a File
WriteEmailToFile(filePath,emailMessage);
WriteEmailToFile(filePath, emailMessage);
}
}

Expand Down