コード例 #1
0
        public IEnumerable <EmailMessageEntity> CreateEmailMessageInternal()
        {
            ExecuteQuery();

            foreach (EmailAddressEmbedded from in GetFrom())
            {
                foreach (List <EmailOwnerRecipientData> recipients in GetRecipients())
                {
                    CultureInfo ci = recipients.Where(a => a.Kind == EmailRecipientKind.To).Select(a => a.OwnerData.CultureInfo).FirstOrDefault().ToCultureInfo() ?? EmailLogic.Configuration.DefaultCulture.ToCultureInfo();

                    EmailMessageEntity email = new EmailMessageEntity
                    {
                        Target     = entity?.ToLite() ?? (this.systemEmail.UntypedEntity as Entity)?.ToLite(),
                        Recipients = recipients.Select(r => new EmailRecipientEntity(r.OwnerData)
                        {
                            Kind = r.Kind
                        }).ToMList(),
                        From            = from,
                        IsBodyHtml      = template.IsBodyHtml,
                        EditableMessage = template.EditableMessage,
                        Template        = template.ToLite(),
                        Attachments     = template.Attachments.SelectMany(g => EmailTemplateLogic.GenerateAttachment.Invoke(g, new EmailTemplateLogic.GenerateAttachmentContext
                        {
                            QueryDescription = this.qd,
                            ModelType        = template.SystemEmail.ToType(),
                            SystemEmail      = systemEmail,
                            CurrentRows      = currentRows,
                            ResultColumns    = dicTokenColumn,
                            Entity           = entity,
                            Template         = template,
                            Culture          = ci,
                        })).ToMList()
                    };

                    EmailTemplateMessageEmbedded message = template.GetCultureMessage(ci) ?? template.GetCultureMessage(EmailLogic.Configuration.DefaultCulture.ToCultureInfo());

                    if (message == null)
                    {
                        throw new InvalidOperationException("Message {0} does not have a message for CultureInfo {1} (or Default)".FormatWith(template, ci));
                    }

                    using (CultureInfoUtils.ChangeBothCultures(ci))
                    {
                        email.Subject = SubjectNode(message).Print(
                            new EmailTemplateParameters(entity, ci, dicTokenColumn, currentRows)
                        {
                            IsHtml      = false,
                            SystemEmail = systemEmail
                        });

                        email.Body = TextNode(message).Print(
                            new EmailTemplateParameters(entity, ci, dicTokenColumn, currentRows)
                        {
                            IsHtml      = template.IsBodyHtml,
                            SystemEmail = systemEmail,
                        });
                    }


                    yield return(email);
                }
            }
        }
コード例 #2
0
        private EmailMessageEntity CreateEmailMessageInternal(EmailFromEmbedded from, List <EmailOwnerRecipientData> recipients)
        {
            EmailMessageEntity email;

            try
            {
                var ci = this.cultureInfo ??
                         EmailTemplateLogic.GetCultureInfo?.Invoke(entity ?? model?.UntypedEntity as Entity) ??
                         recipients.Where(a => a.Kind == EmailRecipientKind.To).Select(a => a.OwnerData.CultureInfo).FirstOrDefault()?.ToCultureInfo() ??
                         EmailLogic.Configuration.DefaultCulture.ToCultureInfo();

                email = new EmailMessageEntity
                {
                    Target     = entity?.ToLite() ?? (this.model !.UntypedEntity as Entity)?.ToLite(),
                    Recipients = recipients.Select(r => new EmailRecipientEmbedded(r.OwnerData)
                    {
                        Kind = r.Kind
                    }).ToMList(),
                    From            = from,
                    IsBodyHtml      = template.IsBodyHtml,
                    EditableMessage = template.EditableMessage,
                    Template        = template.ToLite(),
                    Attachments     = template.Attachments.SelectMany(g => EmailTemplateLogic.GenerateAttachment.Invoke(g,
                                                                                                                        new EmailTemplateLogic.GenerateAttachmentContext(this.qd, template, dicTokenColumn, currentRows, ci)
                    {
                        ModelType = template.Model?.ToType(),
                        Model     = model,
                        Entity    = entity,
                    })).ToMList()
                };

                EmailTemplateMessageEmbedded?message =
                    template.GetCultureMessage(ci) ??
                    template.GetCultureMessage(ci.Parent) ??
                    template.GetCultureMessage(EmailLogic.Configuration.DefaultCulture.ToCultureInfo()) ??
                    template.GetCultureMessage(EmailLogic.Configuration.DefaultCulture.ToCultureInfo().Parent);

                if (message == null)
                {
                    throw new InvalidOperationException("Message {0} does not have a message for CultureInfo {1} (or Default)".FormatWith(template, ci));
                }

                using (CultureInfoUtils.ChangeBothCultures(ci))
                {
                    email.Subject = SubjectNode(message).Print(
                        new TextTemplateParameters(entity, ci, dicTokenColumn, currentRows)
                    {
                        IsHtml = false,
                        Model  = model
                    });

                    email.Body = new BigStringEmbedded(TextNode(message).Print(
                                                           new TextTemplateParameters(entity, ci, dicTokenColumn, currentRows)
                    {
                        IsHtml = template.IsBodyHtml,
                        Model  = model,
                    }));
                }
            }
            catch (Exception ex)
            {
                ex.Data["Template"] = this.template.ToLite();
                ex.Data["Model"]    = this.model;
                ex.Data["Entity"]   = this.entity;
                throw;
            }

            return(email);
        }
コード例 #3
0
        public IEnumerable <EmailMessageEntity> CreateEmailMessageInternal()
        {
            ExecuteQuery();

            foreach (EmailAddressEmbedded from in GetFrom())
            {
                foreach (List <EmailOwnerRecipientData> recipients in GetRecipients())
                {
                    CultureInfo ci = recipients.Where(a => a.Kind == EmailRecipientKind.To).Select(a => a.OwnerData.CultureInfo).FirstOrDefault()?.ToCultureInfo() ??
                                     EmailLogic.Configuration.DefaultCulture.ToCultureInfo();

                    EmailMessageEntity email = new EmailMessageEntity
                    {
                        Target     = entity?.ToLite() ?? (this.model !.UntypedEntity as Entity)?.ToLite(),
                        Recipients = recipients.Select(r => new EmailRecipientEmbedded(r.OwnerData)
                        {
                            Kind = r.Kind
                        }).ToMList(),
                        From            = from,
                        IsBodyHtml      = template.IsBodyHtml,
                        EditableMessage = template.EditableMessage,
                        Template        = template.ToLite(),
                        Attachments     = template.Attachments.SelectMany(g => EmailTemplateLogic.GenerateAttachment.Invoke(g,
                                                                                                                            new EmailTemplateLogic.GenerateAttachmentContext(this.qd, template, dicTokenColumn, currentRows, ci)
                        {
                            ModelType = template.Model?.ToType(),
                            Model     = model,
                            Entity    = entity,
                        })).ToMList()
                    };

                    EmailTemplateMessageEmbedded message = template.GetCultureMessage(ci) ?? template.GetCultureMessage(EmailLogic.Configuration.DefaultCulture.ToCultureInfo());

                    if (message == null)
                    {
                        throw new InvalidOperationException("Message {0} does not have a message for CultureInfo {1} (or Default)".FormatWith(template, ci));
                    }

                    using (CultureInfoUtils.ChangeBothCultures(ci))
                    {
                        email.Subject = SubjectNode(message).Print(
                            new TextTemplateParameters(entity, ci, dicTokenColumn, currentRows)
                        {
                            IsHtml = false,
                            Model  = model
                        });

                        email.Body = TextNode(message).Print(
                            new TextTemplateParameters(entity, ci, dicTokenColumn, currentRows)
                        {
                            IsHtml = template.IsBodyHtml,
                            Model  = model,
                        });
                    }


                    yield return(email);
                }
            }
        }

        TextTemplateParser.BlockNode TextNode(EmailTemplateMessageEmbedded message)
        {
            if (message.TextParsedNode == null)
            {
                string body = message.Text;

                if (template.MasterTemplate != null)
                {
                    var emt  = template.MasterTemplate.RetrieveAndRemember();
                    var emtm = emt.GetCultureMessage(message.CultureInfo.ToCultureInfo()) ??
                               emt.GetCultureMessage(EmailLogic.Configuration.DefaultCulture.ToCultureInfo());

                    if (emtm != null)
                    {
                        body = EmailMasterTemplateEntity.MasterTemplateContentRegex.Replace(emtm.Text, m => body);
                    }
                }

                message.TextParsedNode = TextTemplateParser.Parse(body, qd, template.Model?.ToType());
            }

            return((TextTemplateParser.BlockNode)message.TextParsedNode);
        }

        TextTemplateParser.BlockNode SubjectNode(EmailTemplateMessageEmbedded message)
        {
            if (message.SubjectParsedNode == null)
            {
                message.SubjectParsedNode = TextTemplateParser.Parse(message.Subject, qd, template.Model?.ToType());
            }

            return((TextTemplateParser.BlockNode)message.SubjectParsedNode);
        }

        IEnumerable <EmailAddressEmbedded> GetFrom()
        {
            if (template.From != null)
            {
                if (template.From.Token != null)
                {
                    ResultColumn owner = dicTokenColumn.GetOrThrow(template.From.Token.Token);

                    if (!template.SendDifferentMessages)
                    {
                        yield return(new EmailAddressEmbedded(currentRows.Select(r => (EmailOwnerData)r[owner] !).Distinct().SingleEx()));
                    }
                    else
                    {
                        var groups = currentRows.GroupBy(r => (EmailOwnerData)r[owner] !);

                        if (groups.Count() == 1 && groups.Single().Key?.Owner == null)
                        {
                            yield break;
                        }
                        else
                        {
                            foreach (var gr in groups)
                            {
                                var old = currentRows;
                                currentRows = gr;

                                yield return(new EmailAddressEmbedded(gr.Key));

                                currentRows = old;
                            }
                        }
                    }
                }
                else
                {
                    yield return(new EmailAddressEmbedded(new EmailOwnerData
                    {
                        CultureInfo = null,
                        Email = template.From.EmailAddress !,
                        DisplayName = template.From.DisplayName,
                    }));