public MailingModule()
        {
            this.RequiresAuthentication();

            Get["/mailing"] = parameters =>
            {
                return(View["View/mailing.sshtml",
                            new MailingViewModel(Translator, CurrentSession)]);
            };
            Get["/mailing/list"] = parameters =>
            {
                return(View["View/mailinglist.sshtml",
                            new MailingListViewModel(Translator, Database, CurrentSession)]);
            };
            Get["/mailing/add"] = parameters =>
            {
                return(View["View/mailingedit.sshtml",
                            new MailingEditViewModel(Translator, Database, CurrentSession)]);
            };
            Post["/mailing/add/{id}"] = parameters =>
            {
                string idString = parameters.id;
                var    model    = JsonConvert.DeserializeObject <MailingEditViewModel>(ReadBody());
                var    status   = CreateStatus();

                if (Guid.TryParse(idString, out Guid id))
                {
                    var mailing = new Mailing(id);
                    status.AssignStringRequired("Title", mailing.Title, model.Title);
                    status.AssignObjectIdString("RecipientFeed", mailing.RecipientFeed, model.RecipientFeed);
                    status.AssignObjectIdString("RecipientTag", mailing.RecipientTag, model.RecipientTag);
                    status.AssignEnumIntString("RecipientLanguage", mailing.RecipientLanguage, model.RecipientLanguage);
                    status.AssignObjectIdString("SenderGroup", mailing.Sender, model.SenderGroup);
                    status.AssignObjectIdString("Header", mailing.Header, model.Header);
                    status.AssignObjectIdString("Footer", mailing.Footer, model.Footer);
                    status.AssignStringRequired("Subject", mailing.Subject, model.Subject);
                    var worker = new HtmlWorker(model.HtmlText);
                    mailing.HtmlText.Value  = worker.CleanHtml;
                    mailing.PlainText.Value = worker.PlainText;
                    mailing.Creator.Value   = CurrentSession.User;

                    if (status.IsSuccess)
                    {
                        if (status.HasAccess(mailing.RecipientFeed.Value, PartAccess.Mailings, AccessRight.Write) &&
                            (mailing.Sender.Value == null || status.HasAccess(mailing.Sender.Value, PartAccess.Mailings, AccessRight.Write)))
                        {
                            Database.Save(mailing);
                            Notice("{0} added mailing {1}", CurrentSession.User.UserName.Value, mailing);
                        }
                    }
                }
                else
                {
                    status.SetErrorNotFound();
                }

                return(status.CreateJsonData());
            };
            Get["/mailing/edit/{id}"] = parameters =>
            {
                string idString = parameters.id;
                var    mailing  = Database.Query <Mailing>(idString);

                if (mailing != null)
                {
                    if (mailing.Status.Value == MailingStatus.New)
                    {
                        return(View["View/mailingedit.sshtml",
                                    new MailingEditViewModel(Translator, Database, CurrentSession, mailing)]);
                    }
                    else
                    {
                        return(View["View/mailingscheduled.sshtml",
                                    new MailingScheduledViewModel(Translator, Database, CurrentSession, mailing)]);
                    }
                }

                return(Response.AsRedirect("/mailing"));
            };
            Post["/mailing/edit/{id}"] = parameters =>
            {
                string idString = parameters.id;
                var    model    = JsonConvert.DeserializeObject <MailingEditViewModel>(ReadBody());
                var    mailing  = Database.Query <Mailing>(idString);
                var    status   = CreateStatus();

                if (status.ObjectNotNull(mailing))
                {
                    if (mailing.Status.Value == MailingStatus.New)
                    {
                        status.AssignStringRequired("Title", mailing.Title, model.Title);
                        status.AssignObjectIdString("RecipientFeed", mailing.RecipientFeed, model.RecipientFeed);
                        status.AssignObjectIdString("RecipientTag", mailing.RecipientTag, model.RecipientTag);
                        status.AssignEnumIntString("RecipientLanguage", mailing.RecipientLanguage, model.RecipientLanguage);
                        status.AssignObjectIdString("SenderGroup", mailing.Sender, model.SenderGroup);
                        status.AssignObjectIdString("Header", mailing.Header, model.Header);
                        status.AssignObjectIdString("Footer", mailing.Footer, model.Footer);
                        status.AssignStringRequired("Subject", mailing.Subject, model.Subject);
                        var worker = new HtmlWorker(model.HtmlText);
                        mailing.HtmlText.Value  = worker.CleanHtml;
                        mailing.PlainText.Value = worker.PlainText;
                        mailing.Creator.Value   = CurrentSession.User;

                        if (status.IsSuccess)
                        {
                            if (status.HasAccess(mailing.RecipientFeed.Value, PartAccess.Mailings, AccessRight.Write) &&
                                (mailing.Sender.Value == null || status.HasAccess(mailing.Sender.Value, PartAccess.Mailings, AccessRight.Write)))
                            {
                                Database.Save(mailing);
                                Notice("{0} changed mailing {1}", CurrentSession.User.UserName.Value, mailing);
                            }
                        }
                    }
                    else
                    {
                        status.SetErrorAccessDenied();
                    }
                }

                return(status.CreateJsonData());
            };
            Post["/mailing/test"] = parameters =>
            {
                var model  = JsonConvert.DeserializeObject <MailingEditViewModel>(ReadBody());
                var worker = new HtmlWorker(model.HtmlText);
                var header = Database.Query <MailingElement>(model.Header);
                var footer = Database.Query <MailingElement>(model.Footer);
                var sender = Database.Query <Group>(model.SenderGroup);

                var htmlText  = worker.CleanHtml;
                var plainText = worker.PlainText;

                if (header != null)
                {
                    htmlText  = HtmlWorker.ConcatHtml(header.HtmlText.Value, htmlText);
                    plainText = header.PlainText.Value + plainText;
                }

                if (footer != null)
                {
                    htmlText  = HtmlWorker.ConcatHtml(htmlText, footer.HtmlText.Value);
                    plainText = plainText + footer.PlainText.Value;
                }

                var contact = Database
                              .Query <Contact>()
                              .Where(p => HasAccess(p, PartAccess.Contact, AccessRight.Read))
                              .FirstOrDefault();

                if (contact == null)
                {
                    return(PostResult.Failed(
                               Translate("Mailing.Edit.Test.Failed", "Failed message on sending test mail in mailing edit page", "E-Mail could not be sent.")));
                }

                var templator = new Templator(new ContactContentProvider(Translator, contact));
                htmlText  = templator.Apply(htmlText);
                plainText = templator.Apply(plainText);

                try
                {
                    var language = CurrentSession.User.Language.Value;
                    var from     = new MailboxAddress(
                        sender.MailName.Value[language],
                        sender.MailAddress.Value[language]);
                    var to        = new MailboxAddress(model.TestAddress);
                    var senderKey = sender.GpgKeyId.Value == null ? null :
                                    new GpgPrivateKeyInfo(
                        sender.GpgKeyId.Value,
                        sender.GpgKeyPassphrase.Value);
                    var content  = new Multipart("alternative");
                    var textPart = new TextPart("plain")
                    {
                        Text = plainText
                    };
                    textPart.ContentTransferEncoding = ContentEncoding.QuotedPrintable;
                    content.Add(textPart);
                    var htmlPart = new TextPart("html")
                    {
                        Text = htmlText
                    };
                    htmlPart.ContentTransferEncoding = ContentEncoding.QuotedPrintable;
                    content.Add(htmlPart);

                    Global.Mail.Send(from, to, senderKey, null, model.Subject, content);
                    Notice("{0} tests mailing with subject {1}", CurrentSession.User.UserName.Value, model.Subject);

                    return(PostResult.Success(
                               Translate("Mailing.Edit.Test.Success", "Success message on sending test mail in mailing edit page", "Test E-Mail sent.")));
                }
                catch
                {
                    return(PostResult.Failed(
                               Translate("Mailing.Edit.Test.Failed", "Failed message on sending test mail in mailing edit page", "E-Mail could not be sent.")));
                }
            };
            Get["/mailing/send/{id}"] = parameters =>
            {
                string idString = parameters.id;
                var    mailing  = Database.Query <Mailing>(idString);

                if (mailing != null)
                {
                    if (HasAccess(mailing.RecipientFeed.Value, PartAccess.Mailings, AccessRight.Write) &&
                        (mailing.Sender.Value == null || HasAccess(mailing.Sender.Value, PartAccess.Mailings, AccessRight.Write)))
                    {
                        return(View["View/mailingsend.sshtml",
                                    new MailingSendViewModel(Translator, Database, CurrentSession, mailing)]);
                    }
                }

                return(AccessDenied());
            };
            Post["/mailing/send/{id}"] = parameters =>
            {
                string idString = parameters.id;
                var    model    = JsonConvert.DeserializeObject <MailingSendViewModel>(ReadBody());
                var    mailing  = Database.Query <Mailing>(idString);
                var    status   = CreateStatus();

                if (status.ObjectNotNull(mailing))
                {
                    status.AssignDateString("Date", mailing.SendingDate, model.Date, true);
                    status.AddAssignTimeString("Time", mailing.SendingDate, model.Time);

                    if (status.IsSuccess)
                    {
                        if (status.HasAccess(mailing.RecipientFeed.Value, PartAccess.Mailings, AccessRight.Write) &&
                            (mailing.Sender.Value == null || status.HasAccess(mailing.Sender.Value, PartAccess.Mailings, AccessRight.Write)))
                        {
                            mailing.SendingDate.Value = mailing.SendingDate.Value.Value.ToUniversalTime();
                            mailing.Status.Value      = MailingStatus.Scheduled;
                            Database.Save(mailing);
                            Notice("{0} sent mailing {1}", CurrentSession.User.UserName.Value, mailing);
                        }
                    }
                }

                return(status.CreateJsonData());
            };
            Get["/mailing/delete/{id}"] = parameters =>
            {
                string idString = parameters.id;
                var    mailing  = Database.Query <Mailing>(idString);
                var    status   = CreateStatus();

                if (status.ObjectNotNull(mailing))
                {
                    if (status.HasAccess(mailing.RecipientFeed.Value, PartAccess.Mailings, AccessRight.Write) &&
                        (mailing.Sender.Value == null || status.HasAccess(mailing.Sender.Value, PartAccess.Mailings, AccessRight.Write)))
                    {
                        using (var transaction = Database.BeginTransaction())
                        {
                            mailing.Delete(Database);
                            transaction.Commit();
                            Notice("{0} deleted mailing {1}", CurrentSession.User.UserName.Value, mailing);
                        }
                    }
                }

                return(status.CreateJsonData());
            };
            Get["/mailing/cancel/{id}"] = parameters =>
            {
                string idString = parameters.id;
                var    mailing  = Database.Query <Mailing>(idString);
                var    status   = CreateStatus();

                if (status.ObjectNotNull(mailing))
                {
                    if (status.HasAccess(mailing.RecipientFeed.Value, PartAccess.Mailings, AccessRight.Write) &&
                        (mailing.Sender.Value == null || status.HasAccess(mailing.Sender.Value, PartAccess.Mailings, AccessRight.Write)))
                    {
                        if (mailing.Status.Value == MailingStatus.Scheduled ||
                            mailing.Status.Value == MailingStatus.Sending)
                        {
                            using (var transaction = Database.BeginTransaction())
                            {
                                mailing.Status.Value = MailingStatus.Canceled;
                                Database.Save(mailing);
                                transaction.Commit();
                                Notice("{0} canceled mailing {1}", CurrentSession.User.UserName.Value, mailing);
                            }
                        }
                        else
                        {
                            status.SetErrorAccessDenied();
                        }
                    }
                }

                return(status.CreateJsonData());
            };
            Get["/mailing/copy/{id}"] = parameters =>
            {
                string idString = parameters.id;
                var    mailing  = Database.Query <Mailing>(idString);
                var    status   = CreateStatus();

                if (status.ObjectNotNull(mailing))
                {
                    if (status.HasAccess(mailing.RecipientFeed.Value, PartAccess.Mailings, AccessRight.Write) &&
                        (mailing.Sender.Value == null || status.HasAccess(mailing.Sender.Value, PartAccess.Mailings, AccessRight.Write)))
                    {
                        var newMailing = new Mailing(Guid.NewGuid());
                        newMailing.Title.Value = mailing.Title.Value +
                                                 Translate("Mailing.Copy.Postfix", "Postfix of copied mailings", " (Copy)");
                        newMailing.RecipientFeed.Value     = mailing.RecipientFeed.Value;
                        newMailing.RecipientTag.Value      = mailing.RecipientTag.Value;
                        newMailing.RecipientLanguage.Value = mailing.RecipientLanguage.Value;
                        newMailing.Sender.Value            = mailing.Sender.Value;
                        newMailing.Header.Value            = mailing.Header.Value;
                        newMailing.Footer.Value            = mailing.Footer.Value;
                        newMailing.Subject.Value           = mailing.Subject.Value;
                        newMailing.HtmlText.Value          = mailing.HtmlText.Value;
                        newMailing.PlainText.Value         = mailing.PlainText.Value;
                        newMailing.Creator.Value           = CurrentSession.User;
                        newMailing.CreatedDate.Value       = DateTime.UtcNow;
                        newMailing.Status.Value            = MailingStatus.New;
                        Database.Save(newMailing);
                        Notice("{0} copied mailing {1}", CurrentSession.User.UserName.Value, mailing);
                    }
                }

                return(status.CreateJsonData());
            };
        }
Beispiel #2
0
        private void RunSending(IDatabase database, Mailing mailing)
        {
            int remainingCount = 0;

            foreach (var sending in database.Query <Sending>(DC.Equal("mailingid", mailing.Id.Value)))
            {
                if (sending.Status.Value == SendingStatus.Created)
                {
                    if (_maxMailsCount > 0)
                    {
                        _maxMailsCount--;
                        var header    = mailing.Header.Value;
                        var footer    = mailing.Footer.Value;
                        var htmlText  = mailing.HtmlText.Value;
                        var plainText = mailing.PlainText.Value;

                        if (header != null)
                        {
                            htmlText  = HtmlWorker.ConcatHtml(header.HtmlText.Value, htmlText);
                            plainText = header.PlainText.Value + plainText;
                        }

                        if (footer != null)
                        {
                            htmlText  = HtmlWorker.ConcatHtml(htmlText, footer.HtmlText.Value);
                            plainText = plainText + footer.PlainText.Value;
                        }

                        var translation = new Translation(database);
                        var translator  = new Translator(translation, sending.Address.Value.Contact.Value.Language.Value);
                        var templator   = new Templator(new ContactContentProvider(translator, sending.Address.Value.Contact.Value));
                        htmlText  = templator.Apply(htmlText);
                        plainText = templator.Apply(plainText);

                        try
                        {
                            var language = sending.Address.Value.Contact.Value.Language.Value;
                            var from     = new MimeKit.MailboxAddress(
                                mailing.Sender.Value.MailName.Value[language],
                                mailing.Sender.Value.MailAddress.Value[language]);
                            var to = new MimeKit.MailboxAddress(
                                sending.Address.Value.Contact.Value.ShortHand,
                                sending.Address.Value.Address.Value);
                            var senderKey = mailing.Sender.Value.GpgKeyId.Value == null ? null :
                                            new GpgPrivateKeyInfo(
                                mailing.Sender.Value.GpgKeyId.Value,
                                mailing.Sender.Value.GpgKeyPassphrase.Value);
                            var content  = new Multipart("alternative");
                            var textPart = new TextPart("plain")
                            {
                                Text = plainText
                            };
                            textPart.ContentTransferEncoding = ContentEncoding.QuotedPrintable;
                            content.Add(textPart);
                            var htmlPart = new TextPart("html")
                            {
                                Text = htmlText
                            };
                            htmlPart.ContentTransferEncoding = ContentEncoding.QuotedPrintable;
                            content.Add(htmlPart);

                            Global.Mail.Send(from, to, senderKey, null, mailing.Subject.Value, content);
                            sending.Status.Value   = SendingStatus.Sent;
                            sending.SentDate.Value = DateTime.UtcNow;
                            database.Save(sending);
                            Journal(database, mailing, sending.Address.Value.Contact.Value,
                                    "MailTask.Journal.Sent",
                                    "Journal entry sent mail",
                                    "Task sent mail {0}",
                                    t => mailing.Title.Value);
                        }
                        catch (Exception exception)
                        {
                            sending.Status.Value         = SendingStatus.Failed;
                            sending.FailureMessage.Value = exception.Message;
                            sending.SentDate.Value       = DateTime.UtcNow;
                            database.Save(sending);
                            Journal(database, mailing, sending.Address.Value.Contact.Value,
                                    "MailTask.Journal.Failed",
                                    "Journal entry sending mail failed",
                                    "Task failed sending mail {0}",
                                    t => mailing.Title.Value);
                        }
                    }
                    else
                    {
                        remainingCount++;
                    }
                }
            }

            if (remainingCount < 1)
            {
                mailing.Status.Value   = MailingStatus.Sent;
                mailing.SentDate.Value = DateTime.UtcNow;
                database.Save(mailing);
                Global.Log.Notice("Mailing {0} has finished sending", mailing.Title);
            }
            else
            {
                Global.Log.Notice("Mailing {0} needs to send {1} more mails", mailing.Title, remainingCount);
            }
        }