Open Closed

CMS Kit Pro Newsletter – Is There Any Built-in Functionality to Send Emails to Subscribers? #10701


User avatar
0
abpdevPro created

Hi ABP Support Team,

We are evaluating the Newsletter feature available in CMS Kit Pro and would like to understand its capabilities regarding email delivery.

Based on the CMS Kit Pro Newsletter documentation, we can see that the module currently supports:

Newsletter subscription management Subscriber listing Exporting subscribers as CSV

However, we could not find any documentation related to sending emails or managing newsletter campaigns.

Could you please clarify the following: We need guidance on:

Does CMS Kit Pro provide any built-in functionality to send emails/newsletters to subscribed users?

If email sending is supported, what is the recommended approach and which APIs/services should be used?

Is there any UI available for creating and sending newsletter campaigns?

If this functionality is not currently included, is the expected approach to export subscribers and implement a custom email campaign solution using ABP's Emailing infrastructure or an external provider?

Thanks in advance for your recommendation and the best-practice steps to implement it


Markdown supported.
Copy, paste, or drag & drop images and files (max 100 MB per file, 100 MB total per post)

2 Answer(s)
  • User Avatar
    0
    AI-Bot created
    Support Team ABP Agent
    • CMS Kit Pro Newsletter is a subscription management feature (subscribe/unsubscribe, list subscribers, export to CSV). It does not include built-in email delivery / campaign management (no “create campaign”, “compose email”, “send to subscribers” UI or app service in the module).

    • Recommended approach is to implement your own “campaign sender” (or integrate an external provider) and use CMS Kit Pro Newsletter only as the subscriber store:

      1. Get subscribers (from CMS Kit Newsletter subscription data; e.g., by category if you use categories).
      2. Render email content (recommended: ABP Text Template system so admins can edit templates without redeploying).
      3. Send emails using ABP’s emailing infrastructure (IEmailSender), typically via QueueAsync(...) to avoid blocking and to use background jobs.
      4. Optional: store “campaigns”, “sent items”, “failures”, “unsubscribe links”, tracking, etc. in your own tables, because CMS Kit Pro Newsletter doesn’t provide these.
    • If you don’t want to build this yourself, the practical alternative is exactly what you suggested: export subscribers (CSV) and use an external email marketing provider (SendGrid / Mailchimp / etc.) for campaigns, scheduling, analytics, throttling, bounce handling, etc.

    Sources:

    • https://abp.io/docs/10.2/modules/cms-kit-pro/newsletter
    • https://abp.io/community/articles/ciqle4sd

    This response was generated by AI. If it didn’t solve your problem, feel free to post a new answer — our support team will jump in to help you soon.

    Markdown supported.
    Copy, paste, or drag & drop images and files (max 100 MB per file, 100 MB total per post)
  • User Avatar
    0
    maliming created
    Support Team Fullstack Developer

    Hi,

    The CMS Kit Pro Newsletter module is a subscription store — it handles subscribe / unsubscribe, the preferences UI, the admin list, and CSV export. The only emails it sends are lifecycle ones (double opt-in confirmation, "subscription confirmed", "preferences updated", "unsubscribed"). There's no broadcast / campaign API, no compose UI, and no admin menu to send a newsletter to your subscribers — that's outside the module's scope.

    To send newsletters, build it on top of ABP's own building blocks. The module uses these same pieces internally for its lifecycle emails, so you're on the same path:

    1. Fetch confirmed subscribers — inject IRepository<NewsletterRecord, Guid> and filter by IsEmailConfirmed (and by Preference if you keep multiple lists).
    2. Render the body with ITemplateRenderer (ABP Text Templating) so the template can be edited later without redeploying.
    3. Send each email with IEmailSender.QueueAsync(...). QueueAsync goes through ABP's background job system, so the request doesn't block and large lists won't time out.

    A minimal sender service:

    using System;
    using System.Linq;
    using System.Threading.Tasks;
    using Volo.Abp.Application.Services;
    using Volo.Abp.Domain.Repositories;
    using Volo.Abp.Emailing;
    using Volo.Abp.TextTemplating;
    using Volo.CmsKit.Newsletters;
    
    public class NewsletterBroadcastService : ApplicationService
    {
        private readonly IRepository<NewsletterRecord, Guid> _newsletterRepository;
        private readonly IEmailSender _emailSender;
        private readonly ITemplateRenderer _templateRenderer;
    
        public NewsletterBroadcastService(
            IRepository<NewsletterRecord, Guid> newsletterRepository,
            IEmailSender emailSender,
            ITemplateRenderer templateRenderer)
        {
            _newsletterRepository = newsletterRepository;
            _emailSender = emailSender;
            _templateRenderer = templateRenderer;
        }
    
        public virtual async Task BroadcastAsync(string preference, string subject, object templateModel)
        {
            var subscribers = await _newsletterRepository.GetListAsync(
                x => x.IsEmailConfirmed == true &&
                     x.Preferences.Any(p => p.Preference == preference));
    
            var body = await _templateRenderer.RenderAsync("MyNewsletterTemplate", templateModel);
    
            foreach (var subscriber in subscribers)
            {
                await _emailSender.QueueAsync(subscriber.EmailAddress, subject, body);
            }
        }
    }
    

    A few things to keep in mind: only send to confirmed subscribers, respect their preferences and any unsubscribe state, and stay inside the current tenant boundary (the repository already filters by CurrentTenant). For larger lists, push each per-subscriber send into a background job (IBackgroundJobManager.EnqueueAsync(...)) instead of looping in the service, so each one gets its own retry / failure handling.

    Anything beyond that — campaign history, scheduling, A/B testing, open / click tracking, bounce handling — isn't part of the module, so you'll need to add it yourself (your own tables, jobs, etc.).

    Thanks

    Markdown supported.
    Copy, paste, or drag & drop images and files (max 100 MB per file, 100 MB total per post)
Boost Your Development
ABP Live Training
Packages
See Trainings
Mastering ABP Framework Book
The Official Guide
Mastering
ABP Framework
Learn More
Mastering ABP Framework Book
Made with ❤️ on ABP v10.8.0-preview. Updated on September 16, 2026, 14:50
1
ABP Assistant
🔐 You need to be logged in to use the chatbot. Please log in first.