Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

This is a newsletter addon for Websauna framework. It is intended for automatic newsletter generation from the site content.

Features

  • Automatic newsletter generation from site content

  • Admin interface for newsletter preview and send

  • Import all site users as newsletter subscribers

  • Outbound email through Mailgun

  • Unsubscribe management through Mailgun

  • Redis based newsletter state management (when the last letter went out, etc.)

  • Websauna’s Celery based task subsystem is used to run long running operations asynchronously

Installation

To run this package you need Python 3.4+, PostgresSQL and Redis.

You need to provide your own site-specific INewsletter implementation that populates the news letter content.

Installing Python package

Install this package using pip.

Setup newsletter renderer

You need to register a site specific newsletter that is responsible for rendering your newsletter HTML payload. Do this in your Initializer.configure_views. Example:

# Configure newsletter renderer
from mysite.views.newsletter import NewsletterRenderer
from websauna.newsletter.interfaces import INewsletterGenerator
registry = self.config.registry
registry.registerAdapter(factory=NewsletterRenderer, required=(IRequest,), provided=INewsletterGenerator)

For more information see demo.py.

Setting up the secrets

Add Mailgun API keys and such in myapp/conf/development-secrets.ini.

Example:

[mailgun]
# Get from Mailgun
api_key = x

# What is the mailing list we use in the test suite
mailing_list = unit-testing@mailgun.websauna.org

# Outbound domain used for the newslettering
domain = mailgun.websauna.org

# From: email we use to send the newsletter
from = MyApp Newsletter <newsletter-demo@websauna.org>

Create Mailgun mailing list object

Easiest to do this through ws-shell using production configuraition:

ws-shell tokenmarket/conf/production.ini

Then using %cpaste notebook shell command:

from websauna.system.core.utils import get_secrets
from websauna.newsletter.mailgun import Mailgun
secrets = get_secrets(request.registry)
list_address = secrets["mailgun.mailing_list"]
mailgun = Mailgun(request.registry)
mailgun.create_list(list_address, "MyApp newsletter")

You get a reply:

{'list': {'access_level': 'readonly',
  'address': 'newsletter@example.com',
  'created_at': 'Wed, 25 Jan 2017 17:08:56 -0000',
  'description': 'TokenMarket newsletter',
  'members_count': 0,
  'name': ''},
 'message': 'Mailing list has been created'}

Integration subscription for on your site

A boostrap based mini subscription form is provided with the packag. It is ideal e.g. to place in the site footer.

Simply in your template do:

<h3>Follow</h3>
{% include "newsletter/subscription_form.html" %}

For more information run the demo and view demotemplates/site/footer.html.

Usage

Sending and preview

Visit Newsletter tab in the admin interface to preview and send out newsletters.

Resetting the news collection date

You can manually set the newsletter state, when the last newsletter was sent, from shell:

import datetime
from websauna.newsletter.state import NewsletterState

state = NewsletterState(request)
state.set_last_send_timestamp(datetime.datetime(2016, 12, 24).replace(tzinfo=datetime.timezone.utc))

State is managed in Redis.

Exporting subscribers

In console:

from websauna.system.core.utils import get_secrets
from websauna.newsletter.mailgun import Mailgun
secrets = get_secrets(request.registry)
list_address = secrets["mailgun.mailing_list"]
mailgun = Mailgun(request.registry)
print(mailgun.list_members(list_address))  # TODO: pagination

Importing email subscribers

Note that importing website users is supported in the admin interface.

Example:

subscribers = """
mikko@example.com
pete@example.com
"""

from websauna.system.core.utils import get_secrets
from websauna.newsletter.mailgun import Mailgun
from websauna.newsletter.views import subscribe_email

secrets = get_secrets(request.registry)
list_address = secrets["mailgun.mailing_list"]
mailgun = Mailgun(request.registry)

for s in subscribers.split():
    s = s.strip()
    if s:
        subscribe_email(request, s)

Local development mode

You can development this addon locally.

Activate the virtual environment of your Websauna application.

Then:

cd newsletter  # This is the folder with setup.py file
pip install -e .
psql create newsletter_dev
ws-sync-db  ws://websauna/newsletter/conf/development.ini
pserve  ws://websauna/newsletter/conf/development.ini --reload

Running the test suite

First create test database:

# Create database used for unit testing
psql create newsletter_test

Install test and dev dependencies (run in the folder with setup.py):

pip install -e ".[dev,test]"

Run test suite using py.test running:

py.test

Manually testing with Celery

Make sure Celery is not eager in development.ini:

websauna.celery_config =
    {
        "broker_url":  "redis://localhost:6379/15",
        "task_always_eager": False,
    }

Start demo (Terminal 1):

pserve ws://websauna/newsletter/conf/development.ini

Start Celery (Terminal 2):

ws-celery  ws://websauna/newsletter/conf/development.ini -- worker

TODO

  • Double confirmation to the mailing list subscription

More information

Please see https://websauna.org/

Changelog for Websauna Newsletter

1.0a2 (2018-04-22)

  • Fix missing ‘namespace_packages’.

1.0a1 (2018-03-06)

  • Initial Release

Release files for websauna.newsletter 1.0a2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for websauna.newsletter 1.0a2
File Size Uploaded
websauna.newsletter-1.0a2.tar.gz 33.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for websauna.newsletter 1.0a2
File Interpreter ABI Platform
websauna.newsletter-1.0a2-py3-none-any.whl Python 3 none any Details

Total release size: 71.7 kB

Release files / websauna.newsletter-1.0a2.tar.gz

Download URL websauna.newsletter-1.0a2.tar.gz
Size 33.0 kB
Tags Source
SHA-256 checksum
How to use checksums
6e77e71410cbabb476002d0e083b1a37919aac6079c626da082c516cc480bcd7
BLAKE2b-256 checksum
How to use checksums
f213ce01b7e4e2aa124648a8a57b8bb61960b40983b24da6690f3751d5e2611c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Release files / websauna.newsletter-1.0a2-py3-none-any.whl

Download URL websauna.newsletter-1.0a2-py3-none-any.whl
Size 38.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
24db9391cfed36b773a7344c51a68960713554837b378ffd63fa2e324db759e5
BLAKE2b-256 checksum
How to use checksums
020eefaed0fb43d25328bc409087d7255d042d582219c194e34c61e0d645f2d7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Release history Release notifications | RSS feed

This release

1.0a2 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page