public void CreateMessage(QueuedEmailMessage message) { var id = 0; _sqlObjectFactory.GetConnection().Using(connection => id = Convert.ToInt32( connection.Command("INSERT INTO pf_QueuedEmailMessage (FromEmail, FromName, ToEmail, ToName, Subject, Body, HtmlBody, QueueTime) VALUES (@FromEmail, @FromName, @ToEmail, @ToName, @Subject, @Body, @HtmlBody, @QueueTime)") .AddParameter("@FromEmail", message.FromEmail) .AddParameter("@FromName", message.FromName) .AddParameter("@ToEmail", message.ToEmail) .AddParameter("@ToName", message.ToName) .AddParameter("@Subject", message.Subject) .AddParameter("@Body", message.Body) .AddParameter("@HtmlBody", message.HtmlBody.GetObjectOrDbNull()) .AddParameter("@QueueTime", message.QueueTime) .ExecuteAndReturnIdentity())); if (id == 0) { throw new Exception("MessageID was not returned from creation of a QueuedEmailMessage."); } var payload = new EmailQueuePayload { MessageID = id, EmailQueuePayloadType = EmailQueuePayloadType.FullMessage }; WriteMessageToEmailQueue(payload); }
public void ComposeAndQueue(User user, string resetLink) { if (user == null) { throw new ArgumentNullException("user"); } if (String.IsNullOrEmpty(resetLink)) { throw new ArgumentException("resetLink"); } var settings = _settingsManager.Current; var body = String.Format(Resources.ForgotPasswordEmail , settings.ForumTitle, resetLink, settings.MailSignature, Environment.NewLine); var message = new QueuedEmailMessage { Body = body, Subject = String.Format(Resources.ForgotPasswordSubject, settings.ForumTitle), ToEmail = user.Email, ToName = user.Name, FromEmail = settings.MailerAddress, FromName = settings.ForumTitle, QueueTime = DateTime.UtcNow }; _queuedQueuedEmailRepo.CreateMessage(message); }
public async Task ComposeAndQueue(User toUser, User fromUser, string ip, string subject, string text) { if (await IsUserEmailable(toUser) == false) { throw new Exception("Can't send e-mail to a user who hides their details."); } if (toUser == null) { throw new ArgumentNullException("toUser"); } if (fromUser == null) { throw new ArgumentNullException("fromUser"); } var settings = _settingsManager.Current; var body = $@"E-mail sent via {settings.ForumTitle} (senders's IP: {ip}): {text} ______________________ {settings.MailSignature}"; var message = new QueuedEmailMessage { Body = body, Subject = subject, ToEmail = toUser.Email, ToName = toUser.Name, FromEmail = fromUser.Email, FromName = fromUser.Name, QueueTime = DateTime.UtcNow }; await _queuedEmailService.CreateAndQueueEmail(message); }
public QueuedEmailMessage GetMessage(int messageID) { QueuedEmailMessage message = null; _sqlObjectFactory.GetConnection().Using(connection => message = connection.QuerySingleOrDefault <QueuedEmailMessage>("SELECT MessageID, FromEmail, FromName, ToEmail, ToName, Subject, Body, HtmlBody, QueueTime FROM pf_QueuedEmailMessage WHERE MessageID = @MessageID", new { messageID })); return(message); }
public void CreateAndQueueEmail(QueuedEmailMessage queuedEmailMessage) { var id = _queuedEmailMessageRepository.CreateMessage(queuedEmailMessage); var tenantID = _tenantService.GetTenant(); var payload = new EmailQueuePayload { MessageID = id, EmailQueuePayloadType = EmailQueuePayloadType.FullMessage, TenantID = tenantID }; _emailQueueRepository.Enqueue(payload); }
public static async Task RunAsync([QueueTrigger(PopForums.AzureKit.Queue.EmailQueueRepository.QueueName)] string jsonPayload, ILogger log, ExecutionContext context) { var stopwatch = new Stopwatch(); stopwatch.Start(); Config.SetPopForumsAppEnvironment(context.FunctionAppDirectory, "local.settings.json"); var services = new ServiceCollection(); services.AddPopForumsBase(); services.AddPopForumsSql(); services.AddPopForumsAzureFunctionsAndQueues(); var serviceProvider = services.BuildServiceProvider(); var queuedEmailRepo = serviceProvider.GetService <IQueuedEmailMessageRepository>(); var smtpWrapper = serviceProvider.GetService <ISmtpWrapper>(); var serviceHeartbeatService = serviceProvider.GetService <IServiceHeartbeatService>(); var errorLog = serviceProvider.GetService <IErrorLog>(); QueuedEmailMessage message = null; try { var payload = JsonSerializer.Deserialize <EmailQueuePayload>(jsonPayload); message = queuedEmailRepo.GetMessage(payload.MessageID).Result; if (payload.EmailQueuePayloadType == EmailQueuePayloadType.MassMessage) { message.ToEmail = payload.ToEmail; message.ToName = payload.ToName; } smtpWrapper.Send(message); } catch (Exception exc) { if (message == null) { errorLog.Log(exc, ErrorSeverity.Email, "There was no message for the MailWorker to send."); } else { errorLog.Log(exc, ErrorSeverity.Email, $"MessageID: {message.MessageID}, To: <{message.ToEmail}> {message.ToName}, Subject: {message.Subject}"); } log.LogError(exc, $"Exception thrown running {nameof(EmailProcessor)}"); } stopwatch.Stop(); log.LogInformation($"C# Queue {nameof(EmailProcessor)} function processed ({stopwatch.ElapsedMilliseconds}ms): {jsonPayload}"); try { await serviceHeartbeatService.RecordHeartbeat(typeof(EmailProcessor).FullName, "AzureFunction"); } catch (Exception exc) { // we don't want to risk spamming anyone because of a database failure log.LogError(exc, $"Logging the service heartbeat for {nameof(EmailProcessor)} failed."); } }
public void CreateAndQueueEmailCallsRepoWithMessage() { var service = GetService(); var message = new QueuedEmailMessage(); _queuedEmailMessageRepo.Setup(x => x.CreateMessage(message)).Returns(1); _tenantService.Setup(x => x.GetTenant()).Returns(""); service.CreateAndQueueEmail(message); _queuedEmailMessageRepo.Verify(x => x.CreateMessage(message), Times.Once); }
public async Task <int> CreateMessage(QueuedEmailMessage message) { Task <int> id = null; await _sqlObjectFactory.GetConnection().UsingAsync(connection => id = connection.QuerySingleAsync <int>("INSERT INTO pf_QueuedEmailMessage (FromEmail, FromName, ToEmail, ToName, Subject, Body, HtmlBody, QueueTime) VALUES (@FromEmail, @FromName, @ToEmail, @ToName, @Subject, @Body, @HtmlBody, @QueueTime);SELECT CAST(SCOPE_IDENTITY() as int)", new { message.FromEmail, message.FromName, message.ToEmail, message.ToName, message.Subject, message.Body, message.HtmlBody, message.QueueTime })); if (id.Result == 0) { throw new Exception("MessageID was not returned from creation of a QueuedEmailMessage."); } return(await id); }
public void CreateMessage(QueuedEmailMessage message) { _sqlObjectFactory.GetConnection().Using(connection => connection.Command("INSERT INTO pf_QueuedEmailMessage (FromEmail, FromName, ToEmail, ToName, Subject, Body, HtmlBody, QueueTime) VALUES (@FromEmail, @FromName, @ToEmail, @ToName, @Subject, @Body, @HtmlBody, @QueueTime)") .AddParameter("@FromEmail", message.FromEmail) .AddParameter("@FromName", message.FromName) .AddParameter("@ToEmail", message.ToEmail) .AddParameter("@ToName", message.ToName) .AddParameter("@Subject", message.Subject) .AddParameter("@Body", message.Body) .AddParameter("@HtmlBody", message.HtmlBody.GetObjectOrDbNull()) .AddParameter("@QueueTime", message.QueueTime) .ExecuteNonQuery()); }
public async Task ComposeAndQueue(Topic topic, User user, string topicLink, string unsubscribeLink) { var settings = _settingsManager.Current; var body = string.Format(Resources.SubscribedEmailBody, settings.ForumTitle, topic.Title, topicLink, unsubscribeLink, settings.MailSignature, Environment.NewLine); var message = new QueuedEmailMessage { Body = body, Subject = String.Format(Resources.SubscribedEmailSubject, topic.Title), ToEmail = user.Email, ToName = user.Name, FromEmail = settings.MailerAddress, FromName = settings.ForumTitle, QueueTime = DateTime.UtcNow }; await _queuedEmailService.CreateAndQueueEmail(message); }
public void CreateMessage(QueuedEmailMessage message) { var id = 0; _sqlObjectFactory.GetConnection().Using(connection => id = connection.QuerySingle <int>("INSERT INTO pf_QueuedEmailMessage (FromEmail, FromName, ToEmail, ToName, Subject, Body, HtmlBody, QueueTime) VALUES (@FromEmail, @FromName, @ToEmail, @ToName, @Subject, @Body, @HtmlBody, @QueueTime);SELECT CAST(SCOPE_IDENTITY() as int)", new { message.FromEmail, message.FromName, message.ToEmail, message.ToName, message.Subject, message.Body, message.HtmlBody, message.QueueTime })); if (id == 0) { throw new Exception("MessageID was not returned from creation of a QueuedEmailMessage."); } var payload = new EmailQueuePayload { MessageID = id, EmailQueuePayloadType = EmailQueuePayloadType.FullMessage }; WriteMessageToEmailQueue(payload); }
public void CreateAndQueueEmailCallsEmailQueueWithCorrectPayload() { var service = GetService(); var messageID = 123; var message = new QueuedEmailMessage(); _queuedEmailMessageRepo.Setup(x => x.CreateMessage(message)).Returns(messageID); var tenantID = "t1"; _tenantService.Setup(x => x.GetTenant()).Returns(tenantID); var payload = new EmailQueuePayload(); _emailQueueRepo.Setup(x => x.Enqueue(It.IsAny <EmailQueuePayload>())).Callback <EmailQueuePayload>(p => payload = p); service.CreateAndQueueEmail(message); Assert.Equal(messageID, payload.MessageID); Assert.Equal(EmailQueuePayloadType.FullMessage, payload.EmailQueuePayloadType); Assert.Equal(tenantID, payload.TenantID); }
public void ComposeAndQueue(User user, string subject, string body, string htmlBody, string unsubscribeLink) { var settings = _settingsManager.Current; var ps = $"{Environment.NewLine}{Environment.NewLine}Unsubscribe: {unsubscribeLink}"; var message = new QueuedEmailMessage { Body = body + ps, Subject = subject, ToEmail = user.Email, ToName = user.Name, FromEmail = settings.MailerAddress, FromName = settings.ForumTitle, QueueTime = DateTime.UtcNow }; if (!string.IsNullOrWhiteSpace(htmlBody)) { message.HtmlBody = $"{htmlBody}<p>Unsubscribe: <a href=\"{unsubscribeLink}\">{unsubscribeLink}</a></p>"; } _queuedEmailService.CreateAndQueueEmail(message); }
public void ComposeAndQueue(User user, string subject, string body, string htmlBody, string unsubscribeLink) { var settings = _settingsManager.Current; var ps = String.Format("{1}{1}Unsubscribe: {0}", unsubscribeLink, Environment.NewLine); var message = new QueuedEmailMessage { Body = body + ps, Subject = subject, ToEmail = user.Email, ToName = user.Name, FromEmail = settings.MailerAddress, FromName = settings.ForumTitle, QueueTime = DateTime.UtcNow }; if (!String.IsNullOrWhiteSpace(htmlBody)) { message.HtmlBody = String.Format("{0}<p>Unsubscribe: <a href=\"{1}\">{1}</a></p>", htmlBody, unsubscribeLink); } _queuedQueuedEmailRepo.CreateMessage(message); }
public QueuedEmailMessage GetOldestQueuedEmailMessage() { QueuedEmailMessage message = null; _sqlObjectFactory.GetConnection().Using(connection => connection.Command("SELECT TOP 1 MessageID, FromEmail, FromName, ToEmail, ToName, Subject, Body, HtmlBody, QueueTime FROM pf_QueuedEmailMessage ORDER BY QueueTime") .ExecuteReader() .ReadOne(r => message = new QueuedEmailMessage { MessageID = r.GetInt32(0), FromEmail = r.GetString(1), FromName = r.GetString(2), ToEmail = r.GetString(3), ToName = r.GetString(4), Subject = r.GetString(5), Body = r.GetString(6), HtmlBody = r.NullStringDbHelper(7), QueueTime = r.GetDateTime(8) })); return(message); }
public QueuedEmailMessage GetOldestQueuedEmailMessage() { var payload = DequeueEmailQueuePayload(); if (payload == null) { return(null); } if (payload.EmailQueuePayloadType != EmailQueuePayloadType.FullMessage) { throw new NotImplementedException($"EmailQueuePayloadType {payload.EmailQueuePayloadType} not implemented."); } QueuedEmailMessage message = null; _sqlObjectFactory.GetConnection().Using(connection => message = connection.QuerySingleOrDefault <QueuedEmailMessage>("SELECT MessageID, FromEmail, FromName, ToEmail, ToName, Subject, Body, HtmlBody, QueueTime FROM pf_QueuedEmailMessage WHERE MessageID = @MessageID", new { payload.MessageID })); if (message == null) { throw new Exception($"Queued email with MessageID {payload.MessageID} was not found."); } return(message); }
public SmtpStatusCode Send(QueuedEmailMessage message) { if (message == null) { throw new ArgumentNullException("message"); } var from = new MailAddress(message.FromEmail, message.FromName); var to = new MailAddress(message.ToEmail, message.ToName); var mailMessage = new MailMessage(from, to) { Subject = message.Subject, Body = message.Body }; if (!String.IsNullOrWhiteSpace(message.HtmlBody)) { var altView = AlternateView.CreateAlternateViewFromString(message.HtmlBody, Encoding.UTF8, "text/html"); altView.TransferEncoding = TransferEncoding.SevenBit; mailMessage.AlternateViews.Add(altView); } mailMessage.Headers.Add("X-MessageID", message.MessageID.ToString()); return(Send(mailMessage)); }
public QueuedEmailMessage GetOldestQueuedEmailMessage() { var payload = DequeueEmailQueuePayload(); if (payload == null) { return(null); } if (payload.EmailQueuePayloadType != EmailQueuePayloadType.FullMessage) { throw new NotImplementedException($"EmailQueuePayloadType {payload.EmailQueuePayloadType} not implemented."); } QueuedEmailMessage message = null; _sqlObjectFactory.GetConnection().Using(connection => connection.Command("SELECT MessageID, FromEmail, FromName, ToEmail, ToName, Subject, Body, HtmlBody, QueueTime FROM pf_QueuedEmailMessage WHERE MessageID = @MessageID") .AddParameter("@MessageID", payload.MessageID) .ExecuteReader() .ReadOne(r => message = new QueuedEmailMessage { MessageID = r.GetInt32(0), FromEmail = r.GetString(1), FromName = r.GetString(2), ToEmail = r.GetString(3), ToName = r.GetString(4), Subject = r.GetString(5), Body = r.GetString(6), HtmlBody = r.NullStringDbHelper(7), QueueTime = r.GetDateTime(8) })); if (message == null) { throw new Exception($"Queued email with MessageID {payload.MessageID} was not found."); } return(message); }
public void ComposeAndQueue(User toUser, User fromUser, string ip, string subject, string text) { if (!IsUserEmailable(toUser)) { throw new Exception("Can't send e-mail to a user who hides their details."); } if (toUser == null) { throw new ArgumentNullException("toUser"); } if (fromUser == null) { throw new ArgumentNullException("fromUser"); } var settings = _settingsManager.Current; var body = String.Format(@"E-mail sent via {0} (senders's IP: {1}): {2} ______________________ {3}" , settings.ForumTitle, ip, text, settings.MailSignature); var message = new QueuedEmailMessage { Body = body, Subject = subject, ToEmail = toUser.Email, ToName = toUser.Name, FromEmail = fromUser.Email, FromName = fromUser.Name, QueueTime = DateTime.UtcNow }; _queuedQueuedEmailRepo.CreateMessage(message); }