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);
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }
示例#5
0
        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.");
            }
        }
示例#7
0
        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);
        }
示例#9
0
 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());
 }
示例#10
0
 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);
 }
示例#11
0
        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);
        }
示例#12
0
        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);
        }
示例#14
0
        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);
        }
示例#15
0
        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);
        }
示例#16
0
        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);
        }
示例#19
0
        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);
        }