Exemplo n.º 1
0
        /// <summary>
        /// Sends an activation request
        /// </summary>
        /// <param name="name">The recipient name</param>
        /// <param name="email">The recipient email</param>
        /// <param name="activationcode">The activation code</param>
        /// <param name="language">The language the message is sent in</param>
        /// <param name="requestIP">The IP requesting the signup email</param>
        /// <returns>An awaitable task</returns>
        public static async Task SendAsync(string name, string email, string activationcode, string language, string requestIP)
        {
            if (DatabaseInstance.Current != null)
            {
                throw new InvalidOperationException("Cannot send email from within a transaction scope");
            }

            var logEntry = new Database.SentEmailLog()
            {
                From      = EmailSignupSettings.FromEmail,
                To        = email,
                When      = DateTime.Now,
                Type      = Database.EmailType.ActivationEmail,
                Delivered = false,
                RequestIP = requestIP
            };

            var markdown = string.Empty;
            var subject  = string.Empty;

            // Insert the email log record
            await DatabaseInstance.GetInstance().RunInTransactionAsync(db =>
            {
                // Grab the subject and body at the same time
                markdown = Services.TextHelper.GetTextFromDb(db, TextConstants.ChangeEmailRequestBody, language);
                subject  = Services.TextHelper.GetTextFromDb(db, TextConstants.ChangeEmailRequestSubject, language);

                if (string.IsNullOrWhiteSpace(markdown))
                {
                    throw new DataException("Database is missing a template for the email body");
                }
                if (string.IsNullOrWhiteSpace(subject))
                {
                    throw new DataException("Database is missing a template for the email subject");
                }

                markdown = BasicTemplating.ReplaceInTemplate(markdown, new {
                    activationcode,
                    username = name
                });

                subject = BasicTemplating.ReplaceInTemplate(subject, new {
                    activationcode,
                    username = name
                });

                logEntry.Subject = subject;
                db.InsertItem(logEntry);
            });

            var text = MarkdownRenderer.RenderAsText(markdown);

            markdown = MarkdownRenderer.RenderAsHtml(markdown);

            // Deliver the email to the server
            await SparkPost.SendEmailAsync(SparkPost.Transmission.Create(
                                               EmailSignupSettings.FromName,
                                               EmailSignupSettings.FromEmail,
                                               name,
                                               email,
                                               subject,
                                               markdown,
                                               text,
                                               true
                                               ));

            // Record that we succeeded delivering the email to the server
            logEntry.Delivered = true;
            await DatabaseInstance.GetInstance().RunInTransactionAsync(db => db.UpdateItem(logEntry));
        }