Pass modal & trigger mail to email template

Former Member
Former Member

Hi Team,

I created email template and mail also triggering when I click "Send Preview Email" button from template.

I am  below two issues,

1. I want to pass my modal to template and I will show in the model related properties in Insert token pop up like below,

2. I want to trigger the email when click a button from my page, I want to call my particular email template and for more understanding check the below code and template

Code reference

using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Text;
using Telligent.Evolution.Extensibility;
using Telligent.Evolution.Extensibility.Api.Version1;
using Telligent.Evolution.Extensibility.Content.Version1;
using Telligent.Evolution.Extensibility.Email.Version1;
using Telligent.Evolution.Extensibility.Templating.Version1;
using Telligent.Evolution.Extensibility.UI.Version1;
using Telligent.Evolution.Extensibility.Version1;

namespace Telligent.Test.Widget.Extension
{
    public class TestContentType : IContentType, ITranslatablePlugin, IViewableContentType, ITemplatablePlugin, IEmailTemplatePreviewPlugin
    {
       private ITemplatablePluginController _controller;
       
          public void SetController(ITemplatablePluginController controller)
        {
            controller = _controller;
        }
	   
	   private TokenizedTemplate[] _defaultTemplates;
        public TokenizedTemplate[] DefaultTemplates
        {
            get
            {
                if (_defaultTemplates == null)
                {
                    var myTemplateBody = new TokenizedTemplate("body")
                    {
                        Name = "Email - Body",
                        Description = "Body of the email.",
                        ContextualDataTypeIds = new[]
                        {
                            ContentTypes.ContentTypeId
                        }
                    };
                    var myTemplateHeader = new TokenizedTemplate("header")
                    {
                        Name = "Email - Header",
                        Description = "Header of the email",
                        ContextualDataTypeIds = new[]
                        {
                            ContentTypes.ContentTypeId
                        }
                    };
                    var myTemplateFooter = new TokenizedTemplate("footer")
                    {
                        Name = "Email - Footer",
                        Description = "Footer of the email.",
                        ContextualDataTypeIds = new[]
                        {
                            ContentTypes.ContentTypeId
                        }
                    };
                    var myTemplateSubject = new TokenizedTemplate("subject")
                    {
                        Name = "Email - Subject",
                        Description = "Subject of the email.",
                        ContextualDataTypeIds = new[]
                        {
                            ContentTypes.ContentTypeId
                        }
                    };
                    myTemplateBody.Set("en-us", @"");
                    myTemplateHeader.Set("en-us", @"");
                    myTemplateHeader.Set("en-us", @"");
                    myTemplateSubject.Set("en-us", @"");

                    _defaultTemplates = new[] { myTemplateHeader, myTemplateSubject,myTemplateBody, myTemplateFooter };
                }
                return _defaultTemplates;
            }
        }
		
		    public string GetTemplateName(EmailTarget target)
        {
            return GetTemplateNameDetails(target);
        }

        string GetTemplateNameDetails(EmailTarget target)
        {
            switch (target)
            {
                case EmailTarget.Subject:
                    return "subject";
                case EmailTarget.Header:
                    return "header";
                case EmailTarget.Footer:
                    return "footer";
                case EmailTarget.Body:
                    return "body";
            }

            return string.Empty;
        }
		
		}
		
		}

Kindly help me to pass my modal and trigger email from button in my page, Thanks!

Regards,

Kiran Cherukuri.



moreunderstanding
[edited by: kiran at 1:16 PM (GMT 0) on Fri, Aug 6 2021]
Parents
  • Former Member
    0 Former Member

    Hi kiran,

    Take a look at the related Developer Training for Templates  Template-based Email and Tokens  Registering Tokens for Templates to see if they can help answer your questions.

    1. We don't expose a way to extend the functionality of existing token types beyond the list found in the token Developer Training article. Investigate ITokenizedTemplateDataTypeContainerToken implementation to see if that fulfills your requirement.

    2. To trigger an email manually with a button, you would need to expose a method on your plugin type that performs the actions that might typically be performed when handling a platform event. Then it's just a matter of calling that method directly when the button is clicked.

  • Former Member
    0 Former Member in reply to Former Member

    Hi  ,

    Thanks for reply,

    I implemented the token based registration code but I didn't see any connection between my template based email code & registration code below,

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using Telligent.Evolution.Api.Plugins.TokenizedTemplates;
    using Telligent.Evolution.Extensibility.Api.Entities.Version1;
    using Telligent.Evolution.Extensibility.Api.Version1;
    using Telligent.Evolution.Extensibility.Templating.Version1;
    using Telligent.Evolution.Extensibility.Version1;
    
    namespace Telligent.Evolution.Samples
    {
        public class Person
        {
            public string Name { get; set; }
            public int Age { get; set; }
            public DateTime Birthday { get; set; }
    
            public List<BlogPost> AuthoredPosts { get; set; }
            public BlogPost FavoritePost { get; set; }
    
            public bool IsBirthdayToday()
            {
                return DateTime.Now.Date.Equals(Birthday.Date);
            }
        }
    
        public class SampleBasicToken : ITokenizedTemplatePrimitiveToken
        {
            public string Name { get; private set; }
            public string Description { get; private set; }
            public Guid Id { get; private set; }
            public Guid? DataTypeId { get; private set; }
            public PrimitiveType ValueType { get; private set; }
            private readonly Func<TemplateContext, object> _resolve;
            public object Resolve(TemplateContext context)
            {
                return _resolve(context);
            }
    
            private readonly string _preview;
            public string Preview()
            {
                return _preview;
            }
    
            public SampleBasicToken(string name, string description,
                Guid id, Guid? dataTypeId, PrimitiveType valueType,
                Func<TemplateContext, object> resolveFunction, string preview = null)
            {
                Name = name;
                Description = description;
                Id = id;
                DataTypeId = dataTypeId;
                ValueType = valueType;
                _resolve = resolveFunction;
    
                _preview = preview ?? Name;
            }
        }
    
        public class SampleDataTypeContainerToken : ITokenizedTemplateDataTypeContainerToken
        {
            public string Name { get; private set; }
            public string Description { get; private set; }
            public Guid Id { get; private set; }
            public Guid? DataTypeId { get; private set; }
            public Guid[] ContextualDataTypeIds { get; private set; }
            private readonly Action<TemplateContext> _resolve;
            public void Resolve(TemplateContext context)
            {
                _resolve(context);
            }
    
            public SampleDataTypeContainerToken(string name, string description,
                Guid id, Guid? dataTypeId, Guid[] contextualDataTypeIds,
                Action<TemplateContext> resolveFunction)
            {
                Name = name;
                Description = description;
                Id = id;
                DataTypeId = dataTypeId;
                ContextualDataTypeIds = contextualDataTypeIds;
                _resolve = resolveFunction;
            }
        }
    
        public class SampleEnumerableToken : ITokenizedTemplateEnumerableToken
        {
            public string Name { get; private set; }
            public string Description { get; private set; }
            public Guid Id { get; private set; }
            public Guid? DataTypeId { get; private set; }
            public Guid[] ContextualDataTypeIds { get; private set; }
            private readonly Func<TemplateContext, IEnumerable<TemplateContext>> _resolve;
            public IEnumerable<TemplateContext> Resolve(TemplateContext context)
            {
                return _resolve(context);
            }
    
            public SampleEnumerableToken(string name, string description, Guid id,
                Guid? dataTypeId, Guid[] contextualDataTypeIds,
                Func<TemplateContext, IEnumerable<TemplateContext>> resolveFunction)
            {
                Name = name;
                Description = description;
                Id = id;
                DataTypeId = dataTypeId;
                ContextualDataTypeIds = contextualDataTypeIds;
                _resolve = resolveFunction;
            }
        }
    
        public class PersonTokens : ITokenRegistrar, ITranslatablePlugin
        {
            #region IPlugin
            public string Name
            {
                get { return "Person Tokens"; }
            }
    
            public string Description
            {
                get { return "Registers tokens for Person data in templates."; }
            }
    
            public void Initialize() { }
            #endregion
    
            // Generate a custom Guid to represent
            private readonly Guid _dataTypeId = new Guid("93EB3FBC-A4D3-4551-961A-B42569ACAA1D");
    
            public void RegisterTokens(ITokenizedTemplateTokenController tokenController)
            {
                // Naming convention allows consistency in display in the token drop-down menu.
                tokenController.Register(new TokenizedTemplateToken("PersonName",
                    "PersonName_Description", _controller,
                    // A unique, static id is needed for each token
                    Guid.Parse("8E616115-5F0C-45B7-B24D-71E6B3E70C3F"),
                    _dataTypeId,
                    PrimitiveType.String,
                    context => context.Get<Person>(_dataTypeId).Name));
    
                tokenController.Register(new TokenizedTemplateToken("PersonAge",
                    "PersonAge_Description", _controller,
                    Guid.Parse("6AE6E349-2000-4704-9D15-D4860E3719DA"),
                    _dataTypeId,
                    PrimitiveType.Int,
                    context => context.Get<Person>(_dataTypeId).Age));
    
                tokenController.Register(new TokenizedTemplateToken("PersonBirthday",
                    "PersonBirthday_Description", _controller,
                    Guid.Parse("DE874A2F-D72E-4449-BDA5-21DD5452C017"),
                    _dataTypeId,
                    PrimitiveType.DateTime,
                    context => context.Get<Person>(_dataTypeId).Birthday));
    
                tokenController.Register(new TokenizedTemplateToken("PersonIsBirthdayToday",
                    "PersonIsBirthdayToday_Description", _controller,
                    Guid.Parse("71A654F1-9A4F-4D29-A594-FC350697DFED"),
                    _dataTypeId,
                    PrimitiveType.Bool,
                    context => context.Get<Person>(_dataTypeId).IsBirthdayToday()));
    
                tokenController.Register(new TokenizedTemplateDataTypeContainerToken("PersonFavoritePost",
                    "PersonFavoritePost_Description", _controller,
                    Guid.Parse("DC9CAAFD-89B9-4EE9-B5C7-403AB6FE1BF9"),
                    _dataTypeId,
                    new[] { PublicApi.Users.ContentTypeId },
                    context => context.AddItem(Telligent.RewardPoint.Widget.Extension.ContentTypes.ContentTypeId,
                                    context.Get<Person>(_dataTypeId).FavoritePost)));
    
                tokenController.Register(new TokenizedTemplateEnumerableToken("PersonAuthoredPosts_Description",
                    "PersonAuthoredPosts_Description", _controller,
                    Guid.Parse("079B01BA-65FA-4C93-B22E-2A4C28132553"),
                    _dataTypeId,
                    new[] { PublicApi.Users.ContentTypeId },
                    context => context.Get<Person>(_dataTypeId).AuthoredPosts.Select(post =>
                    {
                        var itemContext = new TemplateContext();
                        itemContext.AddItem(Telligent.RewardPoint.Widget.Extension.ContentTypes.ContentTypeId, post);
                        return itemContext;
                    })));
            }
    
            #region ITranslatablePlugin
            private Translation[] _defaultTranslations;
            public Translation[] DefaultTranslations
            {
                get
                {
                    if (_defaultTranslations == null)
                    {
                        var enUs = new Translation("en-us");
                        enUs.Set("PersonName", "Person: Name");
                        enUs.Set("PersonName_Description", "The name of the person.");
                        enUs.Set("PersonAge", "Person: Age");
                        enUs.Set("PersonAge_Description", "The age of the person.");
                        enUs.Set("PersonBirthday", "Person: Birthday");
                        enUs.Set("PersonBirthday_Description", "The person's birthday.");
                        enUs.Set("PersonIsBirthdayToday", "Person: Is Birthday Today");
                        enUs.Set("PersonIsBirthdayToday_Description", "True if today is the person's birthday.");
                        enUs.Set("PersonFavoritePost", "Person: Favorite Post");
                        enUs.Set("PersonFavoritePost_Description", "The person's favorite blog post.");
                        enUs.Set("PersonAuthoredPosts", "Person: Authored Posts List");
                        enUs.Set("PersonAuthoredPosts_Description", "List of blog posts this person has created.");
    
                        _defaultTranslations = new[] { enUs };
                    }
                    return _defaultTranslations;
                }
            }
    
            private ITranslatablePluginController _controller;
            public void SetController(ITranslatablePluginController controller)
            {
                _controller = controller;
            }
            #endregion
        }
    }

    You can check the above code and help me how to include my template code here and trigger this particular email template, thanks!

  • Former Member
    0 Former Member in reply to Former Member

    In order for the token(s) to appear available to a template, you need to include the token's DataTypeId in the template's ContextualDataTypeIds list.

  • Former Member
    0 Former Member in reply to Former Member

    After passing my DataTypeId  to ContextualDataTypeIds  list, Now I can see my values in tokens' dropdown.Thanks  

    And I have two major issues for me 

    1.I want to trigger newly created email template from custom api and api code given below.

     public static object SaveEmployeeDetails(string employeeData)
            {
                try
                {
                    using (SqlConnection con = new SqlConnection(connectionString))
                    {
                        con.Open();
                        JavaScriptSerializer objJavaScriptSerializer = new JavaScriptSerializer();
                        EmployeeItems ObjEmployeeItems = objJavaScriptSerializer.Deserialize<EmployeeItems>(employeeData);
    
                        SqlCommand cmd = new SqlCommand("Employee_Add", con);
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.Parameters.Add("@rewardId", SqlDbType.Varchar).Value = ObjEmployeeItems.Name;
                        cmd.Parameters.Add("@createdByUser", SqlDbType.Int).Value = ObjCouponItems.CreatedByUser;
                        DataSet ds = new DataSet();
                        SqlDataAdapter da = new SqlDataAdapter();
                        da.SelectCommand = cmd;
                        da.Fill(ds);
    					
    					//I want to trigger my email template here
    					
                        return ds.Tables[0].Rows[0][0].ToString();
                    }
                }
                catch (Exception ex)
                {
                    return ex.Message.ToString();
                }
            }

    2. How can I pass data to my model? Because data will be change for every time.

    Please help me to resolve these two issues. Thanks!

  • Former Member
    0 Former Member in reply to Former Member

    The Developer Training on templated email has more detail on this:  Template-based Email 

    Specifically, the syntax for rendering and sending an email using templates. Below I've copied the example from that page using Blog posts:

    void BlogPost_AfterCreate(BlogPostAfterCreateEventArgs e)
    {
        BlogPost post = Apis.Get<IBlogPosts>().Get(e.ContentId);
    
        var context = new TemplateContext { PostTarget = "Email" };
        context.AddItem(PublicApi.BlogPosts.ContentTypeId, post);
    
        string renderedSubject = _controller.RenderTokenString("subject", context);
        string renderedBody = _controller.RenderTokenString("body", context);
    
        Apis.Get<ISendEmail>().Send(new SendEmailOptions
            {
                Subject = renderedSubject,
                Body = renderedBody,
                ToEmail = "recipient@test.com"
            });
    }

  • Former Member
    0 Former Member in reply to Former Member

    I tried like above blogs example but _controller(ITemplatablePluginController _controller) will be null and when I am checking RenderTokenString() method, I got below exception

    Can you check the above code sample why _controller will be null and Can I miss any code to full _controller. Full sample code below for creating template.

    using System;
    using System.Collections.Generic;
    using System.Collections.Specialized;
    using System.Text;
    using Telligent.Evolution.Extensibility;
    using Telligent.Evolution.Extensibility.Api.Version1;
    using Telligent.Evolution.Extensibility.Content.Version1;
    using Telligent.Evolution.Extensibility.Email.Version1;
    using Telligent.Evolution.Extensibility.Templating.Version1;
    using Telligent.Evolution.Extensibility.UI.Version1;
    using Telligent.Evolution.Extensibility.Version1;
    
    namespace Telligent.Test.Widget.Extension
    {
        public class TestContentType : IContentType, ITranslatablePlugin, IViewableContentType, ITemplatablePlugin, IEmailTemplatePreviewPlugin
        {
           private ITemplatablePluginController _controller;
           
              public void SetController(ITemplatablePluginController controller)
            {
                controller = _controller;
            }
    	   
    	   private TokenizedTemplate[] _defaultTemplates;
            public TokenizedTemplate[] DefaultTemplates
            {
                get
                {
                    if (_defaultTemplates == null)
                    {
                        var myTemplateBody = new TokenizedTemplate("body")
                        {
                            Name = "Email - Body",
                            Description = "Body of the email.",
                            ContextualDataTypeIds = new[]
                            {
                                ContentTypes.DataTypeId
                            }
                        };
                        var myTemplateHeader = new TokenizedTemplate("header")
                        {
                            Name = "Email - Header",
                            Description = "Header of the email",
                            ContextualDataTypeIds = new[]
                            {
                                ContentTypes.DataTypeId
                            }
                        };
                        var myTemplateFooter = new TokenizedTemplate("footer")
                        {
                            Name = "Email - Footer",
                            Description = "Footer of the email.",
                            ContextualDataTypeIds = new[]
                            {
                                ContentTypes.DataTypeId
                            }
                        };
                        var myTemplateSubject = new TokenizedTemplate("subject")
                        {
                            Name = "Email - Subject",
                            Description = "Subject of the email.",
                            ContextualDataTypeIds = new[]
                            {
                                ContentTypes.DataTypeId
                            }
                        };
                        myTemplateBody.Set("en-us", @"");
                        myTemplateHeader.Set("en-us", @"");
                        myTemplateHeader.Set("en-us", @"");
                        myTemplateSubject.Set("en-us", @"");
    
                        _defaultTemplates = new[] { myTemplateHeader, myTemplateSubject,myTemplateBody, myTemplateFooter };
                    }
                    return _defaultTemplates;
                }
            }
    		
    		    public string GetTemplateName(EmailTarget target)
            {
                return GetTemplateNameDetails(target);
            }
    
            string GetTemplateNameDetails(EmailTarget target)
            {
                switch (target)
                {
                    case EmailTarget.Subject:
                        return "subject";
                    case EmailTarget.Header:
                        return "header";
                    case EmailTarget.Footer:
                        return "footer";
                    case EmailTarget.Body:
                        return "body";
                }
    
                return string.Empty;
            }
    		
    		 public void SendEmail(Guid rewardId)
            {
                CouponItems post = PointsCouponData.GetCouponDetails(rewardId.ToString());
    
                var context = new TemplateContext { PostTarget = "Test Redeemption" };
                context.AddItem(ContentTypes.ContentTypeId, post);
    
                string renderedSubject = _controller.RenderTokenString("subject", context);
                string renderedBody = _controller.RenderTokenString("body", context);
    
                Apis.Get<ISendEmail>().Send(new SendEmailOptions
                {
                    Subject = renderedSubject,
                    Body = renderedBody,
                    ToEmail = "test1@gmail.com"
                });
            }
    		
    		}
    		
    		}

    Please check the above samples and help me If I miss any interface or code, thanks!

  • Former Member
    0 Former Member in reply to Former Member

    SetController has the assignment backward, you need to assign your local _controller = controller, the passed in controller reference.

  • Former Member
    0 Former Member in reply to Former Member

    Thanks  , Its working and I can trigger mail with email template. Once again Thanks a lot....

  • Hi Steven Heffner (sheffner),
    I am currently working on integrating Pendo analytics to calculate the Email Click-Through Rate for our Email Campaigns. I have developed a custom Email Template plugin for our Daily and Weekly Email Digests by following the guidelines provided at Telligent Community Developer Training(community.telligent.com/.../template-based-email).
    I have made progress with the custom template, but I've hit a roadblock with the event registration in the Initialize() method of the IPlugin interface. I'm uncertain about which specific event should be used to trigger the analytics and add the tracking parameters for the Daily and Weekly Digest emails.
    Could you please advise on the appropriate event to register for capturing the click-through data? Your guidance on this matter would be greatly appreciated.
    Thank you for your support.
    Best regards,
    Kavitha Rekkala

Reply
  • Hi Steven Heffner (sheffner),
    I am currently working on integrating Pendo analytics to calculate the Email Click-Through Rate for our Email Campaigns. I have developed a custom Email Template plugin for our Daily and Weekly Email Digests by following the guidelines provided at Telligent Community Developer Training(community.telligent.com/.../template-based-email).
    I have made progress with the custom template, but I've hit a roadblock with the event registration in the Initialize() method of the IPlugin interface. I'm uncertain about which specific event should be used to trigger the analytics and add the tracking parameters for the Daily and Weekly Digest emails.
    Could you please advise on the appropriate event to register for capturing the click-through data? Your guidance on this matter would be greatly appreciated.
    Thank you for your support.
    Best regards,
    Kavitha Rekkala

Children
No Data