Django module to easily send emails/sms/tts/push using django templates stored on database and managed through the Django Admin

Overview

Django-Db-Mailer

Build Status Code Health Codacy Python 2.7, 3.4+, pypy, pypy3 Current version on PyPi Documentation Status License

Documentation available at Read the Docs.

What's that

Django module to easily send emails/push/sms/tts using django templates stored in a database.
From box you can use it with django-celery for send background messages.
Also you have opportunity to create reports from logs by mail categories and slug.
Groups with Recipients and send by model signal also available by default.
Can be used without any depends from programming language as a external service.
That app very simple to install and use on your projects.

Installation

  1. Using pip:
$ pip install django-db-mailer
  1. Add the dbmail application to INSTALLED_APPS in your settings file (usually settings.py)
  2. Sync database (./manage.py migrate).

Mail API

from dbmail.models import MailTemplate
from dbmail import send_db_mail

# New dbmail template
MailTemplate.objects.create(
    name="Site welcome template",
    subject="[{{prefix}}] Welcome {{full_name}}!",
    message="Hi, {{username}}. Welcome to our site.",
    slug="welcome",
    is_html=False,
)

# Send message with created template
send_db_mail(
    # slug which defined on db template
    slug='welcome',

    # recipient can be list, or str separated with comma or simple string
    # '[email protected]' or '[email protected], [email protected]' or
    # ['[email protected]', '[email protected]'] or string Mail group slug
    recipient='[email protected]',

    # All *args params will be accessible on template context
    {
        'username': request.user.username,
        'full_name': request.user.get_full_name(),
        'signup_date': request.user.date_joined,
        'prefix': "DbMail",
    },

    # You can access to all model fields. For m2m and fk fields, you should use module_name
    MyModel.objects.get(pk=1),

    # Optional kwargs:
    # backend='dbmail.backends.mail',
    # provider='apps.utils.some.mail.provider',
    # from_email='[email protected]'
    # cc=['[email protected]'],
    # bcc=['[email protected]'],
    # user=User.objects.get(pk=1),
    #
    # language='ru',
    #
    # attachments=[(filename, content, mimetype)],
    # files=['hello.jpg', 'world.png'],
    # headers={'Custom-Header':'Some value'},
    #
    # queue='default',
    # retry_delay=300,
    # max_retries=3,
    # retry=True,
    # time_limit=30,
    # send_after=60,
    #
    # use_celery=True,
)

Sms API

from dbmail import send_db_sms


send_db_sms(
    # slug which defined on db template
    slug='welcome',

    # recipient can be list, or str separated with comma or simple string
    # '+79031234567' or +79031234567, +79031234568, +79031234569' or
    # ['+79031234567', '+79031234568'] or string Mail group slug
    recipient='+79031234567',

    # All *args params will be accessible on template context
    {
        'username': request.user.username,
        'full_name': request.user.get_full_name(),
        'signup_date': request.user.date_joined
    },

    # You can access to all model fields. For m2m and fk fields, you should use module_name
    MyModel.objects.get(pk=1),

    # Optional kwargs:
    # backend='dbmail.backends.sms',
    # provider='dbmail.providers.nexmo.sms',
    # from_email='DBMail'
    # user=User.objects.get(pk=1),
    #
    # language='ru',
    #
    # queue='default',
    # retry_delay=300,
    # max_retries=3,
    # retry=True,
    # time_limit=30,
    # send_after=60,
    #
    # use_celery=True,
)

Text to speech API

from dbmail import send_db_tts


send_db_tts(
    # slug which defined on db template
    slug='welcome',

    # recipient can be list, or str separated with comma or simple string
    # '+79031234567' or +79031234567, +79031234568, +79031234569' or
    # ['+79031234567', '+79031234568'] or string Mail group slug
    recipient='+79031234567',

    # All *args params will be accessible on template context
    {
        'username': request.user.username,
        'full_name': request.user.get_full_name(),
        'signup_date': request.user.date_joined
    },

    # You can access to all model fields. For m2m and fk fields, you should use module_name
    MyModel.objects.get(pk=1),

    # Optional kwargs:
    # backend='dbmail.backends.tts',
    # provider='dbmail.providers.nexmo.tts',
    # from_email='DBMail'
    # user=User.objects.get(pk=1),
    #
    # language='ru',
    #
    # queue='default',
    # retry_delay=300,
    # max_retries=3,
    # retry=True,
    # time_limit=30,
    # send_after=60,
    #
    # use_celery=True,
)

Text to speech supported by default provider. But maybe not supported by your provider.

Push notification API

from dbmail import send_db_push


send_db_push(
    # slug which defined on db template
    slug='welcome',

    # recipient can be list, or str separated with comma or simple string
    # '34cc3e5f0d2abf2ca0f9af170bd8cd2372a22f8a' or '34cc3e5f0d2abf2ca0f9af170bd8cd2372a22f8a, 34cc3e5f0d2abf2ca0f9af170bd8cd2372a22f8b' or
    # ['34cc3e5f0d2abf2ca0f9af170bd8cd2372a22f8a', '34cc3e5f0d2abf2ca0f9af170bd8cd2372a22f8b'] or string Mail group slug
    recipient='34cc3e5f0d2abf2ca0f9af170bd8cd2372a22f8c',

    # All *args params will be accessible on template context
    {
        'username': request.user.username,
        'full_name': request.user.get_full_name(),
        'signup_date': request.user.date_joined
    },

    # You can access to all model fields. For m2m and fk fields, you should use module_name
    MyModel.objects.get(pk=1),

    # Optional kwargs:
    # backend='dbmail.backends.push',
    # provider='dbmail.providers.prowl.push',
    # event='Server is down!',
    # from_email='ConsoleApp'
    # user=User.objects.get(pk=1),
    #
    # language='ru',
    #
    # queue='default',
    # retry_delay=300,
    # max_retries=3,
    # retry=True,
    # time_limit=30,
    # send_after=60,
    #
    # use_celery=True,
)

DBMail Backends

By default django-dbmail used 4 built-in backends (Mail/Sms/Tts/Push). But nothing prevents to write your own backend to work with all that you want.

DBMail Providers

Battery have some built-in providers for most popular services, which will be used without any dependencies with built-in backends.

Push notifications for mobile apps:

  • Apple APNs/APNs2
  • Google GCM
  • Microsoft Tile/Toast/Raw
  • BoxCar
  • Parse

Browser notifications:

  • GCM (Desktop: Google Chrome, FireFox; Mobile: Google Chrome on Android)
  • APNs (Desktop: Safari)
  • Centrifugo
  • PubNub
  • BoxCar
  • PushAll

Notifications for team:

  • Slack/Mattermost
  • Boxcar
  • Prowl
  • Pushover
  • PushAll

SMS notifications:

  • Nexmo
  • Twilio
  • IQsms
  • SmsAero
  • SmsBliss

Mail notifications:

  • SendinBlue
  • Any, which designed as django email backend

You can find providers settings on docs.

Demo installation

Docker

$ git clone --depth 1 -b master https://github.com/LPgenerator/django-db-mailer.git db-mailer
$ cd db-mailer
$ docker build -t dbmail .
$ docker run -it -d -p 8000:8000 --name dbmail dbmail
$ docker exec -i -t dbmail /bin/bash
$ cd /mailer/

Vagrant

$ git clone --depth 1 -b master https://github.com/LPgenerator/django-db-mailer.git db-mailer
$ cd db-mailer
$ vagrant up --provider virtualbox
$ vagrant ssh
$ cd /mailer/

OS X/Linux

$ sudo apt-get install -y virtualenvwrapper redis-server git python-dev libxml2-dev libxslt-dev zlib1g-dev || brew install pyenv-virtualenvwrapper redis git
$ source /usr/share/virtualenvwrapper/virtualenvwrapper.sh || source /usr/local/bin/virtualenvwrapper.sh
$ mkvirtualenv db-mailer
$ workon db-mailer
$ git clone --depth 1 https://github.com/LPgenerator/django-db-mailer.git db-mailer
$ cd db-mailer
$ python setup.py develop
$ cd demo
$ pip install -r requirements.txt
$ python manage.py migrate --noinput
$ python manage.py createsuperuser --username admin --email [email protected]
$ redis-server >& /dev/null &
$ python manage.py runserver >& /dev/null &
$ python manage.py celeryd -Q default >& /dev/null &

Open Shell:

$ python manage.py shell_plus --print-sql

Create new template:

from dbmail.models import MailTemplate
from dbmail import send_db_mail

MailTemplate.objects.create(
    name="Site welcome template",
    subject="Welcome",
    message="Welcome to our site. We are glad to see you.",
    slug="welcome",
    is_html=False,
)

Try to send test email with created template (without celery):

send_db_mail('welcome', '[email protected]', use_celery=False)

Send email using celery:

send_db_mail('welcome', '[email protected]')

Check mail logs:

from pprint import pprint
from django.forms.models import model_to_dict
from dbmail.models import MailLog

pprint([model_to_dict(obj) for obj in MailLog.objects.all()])

Open app in browser (login and password is admin/admin):

$ xdg-open http://127.0.0.1:8000/admin/dbmail/ >& /dev/null || open http://127.0.0.1:8000/admin/dbmail/ >& /dev/null

Additional information

Revision

For support template reversion, you can install django-reversion. Find information about compatibility with your Django versions here.

Editor

To enable editor, you may install and configure django-tinymce or django-ckeditor app.

Theme

django-db-mailer supported from box django-grappelli and django-suit skin. Information about compatibility available here.

Queue

Install and configure django-celery for background message sending with priorities. You can find celery settings examples on demo project. We recommended to use django-celery-mon with django-celery for monitoring celery and supervisor processes.

Premailer

For turns CSS blocks into style attributes, you can install premailer from PyPi.

Translation

For use different language on your mail templates, install django-modeltranslation or grappelli-modeltranslation. Add into settings.py:

MODELTRANSLATION_DEFAULT_LANGUAGE = 'en'
MODELTRANSLATION_LANGUAGES = ('ru', 'en')
MODELTRANSLATION_TRANSLATION_FILES = (
    'dbmail.translation',
)
INSTALLED_APPS = ('modeltranslation',) + INSTALLED_APPS
# INSTALLED_APPS = ('grappelli', 'grappelli_modeltranslation', 'modeltranslation',) + INSTALLED_APPS

Update dbmail fields:

$ ./manage.py sync_translation_fields --noinput

Postmark Django Backend

Install python-postmark app via pip. Configure your settings:

POSTMARK_API_KEY = ''
POSTMARK_SENDER = '[email protected]'
POSTMARK_TEST_MODE = False
EMAIL_BACKEND = 'postmark.django_backend.EmailBackend'

Amazon's Simple Email Service Django Backend

Install django-ses app via pip. Configure your settings:

EMAIL_BACKEND = 'django_ses.SESBackend'

# These are optional -- if they're set as environment variables they won't
# need to be set here as well
AWS_ACCESS_KEY_ID = 'YOUR-ACCESS-KEY-ID'
AWS_SECRET_ACCESS_KEY = 'YOUR-SECRET-ACCESS-KEY'

# Additionally, you can specify an optional region, like so:
AWS_SES_REGION_NAME = 'us-east-1'
AWS_SES_REGION_ENDPOINT = 'email.us-east-1.amazonaws.com'

Note: You can use any backends designed as django email backend

Tracking

$ pip install httpagentparser django-ipware geoip2

For track information about user, or about mail is read, you must be enable logging, and enable tracking on settings.

If you use Django 1.8, you should install geoip package instead of geoip2.

MJML

MJML is a markup language designed to reduce the pain of coding a responsive email. Install django-mjml app via pip and mjml via npm. And configure your settings:

INSTALLED_APPS = (
  ...,
  'mjml',
)

Older versions

Very simple version of this app, available here. That version do not include celery settings, bcc, api, mail settings, signals, mail groups and model browser.

Notes

All app features available only with django-celery and with Redis.

$ pip install redis hiredis django-celery

External API usage

from dbmail.models import ApiKey

ApiKey.objects.create(name='Test', api_key='ZzriUzE')
$ pip install httpie
$ http -f POST http://127.0.0.1:8000/dbmail/api/ api_key=ZzriUzE slug=welcome [email protected] data='{"name": "Ivan", "age": 20}'
    or
$ apt-get install curl || brew install curl
$ curl -X POST http://127.0.0.1:8000/dbmail/api/ --data 'api_key=ZzriUzE&slug=welcome&[email protected]&backend=mail'

API bandwidth is 1k+ rps on i7 2.3GHz

Responsive transactional HTML email templates

Fixtures with Base transactional HTML email templates was added into dbmail fixtures. This templates was optimized for desktop clients, web clients, mobile clients, various devices, various providers. Thanks for Mailgun Team. You can use it as default basic templates on your project.

python manage.py load_dbmail_base_templates

Publications

Screenshots

/screenshots/template_edit.jpg

/screenshots/templates_changelist.jpg

/screenshots/template_log_changelist.jpg

/screenshots/template_log_view.jpg

/screenshots/group_change.jpg

/screenshots/signal_edit.jpg

/screenshots/signals_changelist.jpg

/screenshots/apps_view.jpg

/screenshots/apps_browse_vars.jpg

/screenshots/smtp_changelist.jpg

/screenshots/apikey_changelist.jpg

/screenshots/bcc_changelist.jpg

/screenshots/template_compare.jpg

/screenshots/tracking_edit.jpg

/screenshots/base_template_changelist.jpg

/screenshots/subscriptions_change.jpg

/screenshots/subscriptions_changelist.jpg

Compatibility

  • Python: 2.7, pypy2.7, 3.4, 3.5, 3.6, 3.7, pypy3.5
  • Django: 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 1.10, 1.11, 2.0, 2.1
Comments
  • Ошибка при создание шаблона

    Ошибка при создание шаблона

    Если ранее был создан шаблон с slug=None то класс MailTemplateAdmin ломается до след. перезапуска. Ошибка кроется скорей всего тут, позже покурю и пришлю пул реквест:

        def get_form(self, request, obj=None, **kwargs):
            if obj is not None:
                self.prepopulated_fields = {}
                if defaults.READ_ONLY_ENABLED:
                    self.readonly_fields = ['slug', 'context_note']
            else:
                self.prepopulated_fields = {'slug': ('name',)}
    
            return super(MailTemplateAdmin, self).get_form(
                request, obj=None, **kwargs)
    

    Вообще сама идея что-то менять в рантайме у ModelAdmin крайне опасная затея, так как в райнтайме используется всегда один экземпляр данного класса. Класс инстанциируется один раз и больше новых экземпляров не будет.

    bug 
    opened by sergio-bershadsky 21
  • Can't enable tracking option

    Can't enable tracking option

    I installed redis, django-redis, django-celery, httpagentparser, django-ipware and set DB_MAILER_TRACK_ENABLE and DB_MAILER_ENABLE_LOGGING to true, but when I sent email it doesn't create any record in track table. What did I do wrong? Maybe I missed some settings? I used AWS SES as email backend.

    question 
    opened by DimaKudosh 14
  • MRO problem using django-modeltranslation

    MRO problem using django-modeltranslation

    In dbmail/admin.py line 55, the definition of class TranslationModelAdmin causes a method resolution order error.

    I am using python 2.7.3, django 1.8.7 and modeltranslation 0.10.2.

    TypeError: Error when calling the metaclass bases
        Cannot create a consistent method resolution
    order (MRO) for bases ModelAdmin, TabbedDjangoJqueryTranslationAdmin
    
    bug 
    opened by bsvetchine 9
  • Migrations not working - Thinks table exists that does not

    Migrations not working - Thinks table exists that does not

    Getting the below error when upgrading from 2.02 to Current stable. Funny thing is, I've searched the table and there is NO dbmail_mailsubscription in the DB. So I don't know why this migration think's it's there.

    RHEL 6.6 Python 2.7.10

    (site)[bijenkins@bmositedev siteAppsite]$ python manage.py makemigrations --merge
    Merging dbmail
      Branch 0002_auto_20151013_1509
        - Alter field message on mailtemplate
      Branch 0007_auto_20150708_2016
        - Alter field email on mailfromemail
        - Alter field email on mailgroupemail
        - Alter field email on maillogemail
        - Alter field context_note on mailtemplate
        - Alter field from_email on mailtemplate
        - Alter field is_html on mailtemplate
        - Add field backend to maillog
        - Add field provider to maillog
        - Alter field backend on maillog
        - Create model MailBaseTemplate
        - Add field base to mailtemplate
        - Create model MailSubscription
        - Change Meta options on mailsubscription
        - Alter field address on mailsubscription
        - Alter field backend on mailsubscription
        - Alter field defer_at_allowed_hours on mailsubscription
        - Alter field end_hour on mailsubscription
        - Alter field is_checked on mailsubscription
        - Alter field is_enabled on mailsubscription
        - Alter field start_hour on mailsubscription
    
    Merging will only work if the operations printed above do not conflict
    with each other (working on different fields or models)
    Do you want to merge these migration branches? [y/N] y
    
    Created new merge migration /home/site/bijenkins/.pyenv/versions/site/lib/python2.7/site-packages/dbmail/migrations/0008_merge.py
    (site)[bijenkins@bmositedev siteAppsite]$ 
    (site)[bijenkins@bmositedev siteAppsite]$ python manage.py migrate
    DEBUG (0.000) SET SQL_AUTO_IS_NULL = 0; args=None
    DEBUG (0.001) SHOW TABLES; args=None
    DEBUG (0.001) SELECT `django_migrations`.`app`, `django_migrations`.`name` FROM `django_migrations`; args=()
    Operations to perform:
      Synchronize unmigrated apps: allauth, app, tinymce, django_rq, suit
      Apply all migrations: account, explorer, thunderdomeV2, sessions, admin, documentation, sites, auth, thunderdome, contenttypes, dbmail, servicepathtable, socialaccount
    Synchronizing apps without migrations:
    DEBUG (0.001) SHOW TABLES; args=None
      Creating tables...
      Installing custom SQL...
      Installing indexes...
    DEBUG (0.000) SET foreign_key_checks=0; args=None
    DEBUG (0.000) SET foreign_key_checks=1; args=None
    DEBUG (0.000) SET SQL_AUTO_IS_NULL = 0; args=None
    DEBUG (0.000) SET foreign_key_checks=0; args=None
    DEBUG (0.000) SET foreign_key_checks=1; args=None
    DEBUG (0.000) SET SQL_AUTO_IS_NULL = 0; args=None
    DEBUG (0.000) SET foreign_key_checks=0; args=None
    DEBUG (0.000) SET foreign_key_checks=1; args=None
    DEBUG (0.000) SET SQL_AUTO_IS_NULL = 0; args=None
    DEBUG (0.000) SET foreign_key_checks=0; args=None
    DEBUG (0.000) SET foreign_key_checks=1; args=None
    DEBUG (0.000) SET SQL_AUTO_IS_NULL = 0; args=None
    DEBUG (0.000) SET foreign_key_checks=0; args=None
    DEBUG (0.000) SET foreign_key_checks=1; args=None
    Running migrations:
      Applying dbmail.0002_auto_20150321_1539...DEBUG (0.000) SET SQL_AUTO_IS_NULL = 0; args=None
    DEBUG (0.001) 
                SELECT kc.`constraint_name`, kc.`column_name`,
                    kc.`referenced_table_name`, kc.`referenced_column_name`
                FROM information_schema.key_column_usage AS kc
                WHERE
                    kc.table_schema = 'siteV2' AND
                    kc.table_name = 'dbmail_mailtemplate'
            ; args=['siteV2', u'dbmail_mailtemplate']
    DEBUG (0.001) 
                SELECT c.constraint_name, c.constraint_type
                FROM information_schema.table_constraints AS c
                WHERE
                    c.table_schema = 'siteV2' AND
                    c.table_name = 'dbmail_mailtemplate'
            ; args=['siteV2', u'dbmail_mailtemplate']
    DEBUG (0.001) SHOW INDEX FROM `dbmail_mailtemplate`; args=None
    DEBUG (0.001) SHOW TABLES; args=None
    DEBUG (0.001) INSERT INTO `django_migrations` (`app`, `name`, `applied`) VALUES ('dbmail', '0002_auto_20150321_1539', '2015-10-23 00:56:52'); args=['dbmail', u'0002_auto_20150321_1539', u'2015-10-23 00:56:52']
     OK
      Applying dbmail.0003_maillog_backend...DEBUG ALTER TABLE `dbmail_maillog` ADD COLUMN `backend` varchar(25) DEFAULT %s NOT NULL; (params [u'mail'])
    DEBUG (0.013) ALTER TABLE `dbmail_maillog` ADD COLUMN `backend` varchar(25) DEFAULT 'mail' NOT NULL; args=[u'mail']
    DEBUG ALTER TABLE `dbmail_maillog` ALTER COLUMN `backend` DROP DEFAULT; (params [])
    DEBUG (0.003) ALTER TABLE `dbmail_maillog` ALTER COLUMN `backend` DROP DEFAULT; args=[]
    DEBUG CREATE INDEX `dbmail_maillog_b43fdd98` ON `dbmail_maillog` (`backend`); (params [])
    DEBUG (0.011) CREATE INDEX `dbmail_maillog_b43fdd98` ON `dbmail_maillog` (`backend`); args=[]
    DEBUG (0.001) SHOW TABLES; args=None
    DEBUG (0.000) INSERT INTO `django_migrations` (`app`, `name`, `applied`) VALUES ('dbmail', '0003_maillog_backend', '2015-10-23 00:56:52'); args=['dbmail', u'0003_maillog_backend', u'2015-10-23 00:56:52']
     OK
      Applying dbmail.0004_auto_20150321_2214...DEBUG ALTER TABLE `dbmail_maillog` ADD COLUMN `provider` varchar(250) NULL; (params [])
    DEBUG (0.014) ALTER TABLE `dbmail_maillog` ADD COLUMN `provider` varchar(250) NULL; args=[]
    DEBUG CREATE INDEX `dbmail_maillog_9e9f3d70` ON `dbmail_maillog` (`provider`); (params [])
    DEBUG (0.013) CREATE INDEX `dbmail_maillog_9e9f3d70` ON `dbmail_maillog` (`provider`); args=[]
    DEBUG (0.001) SHOW TABLES; args=None
    DEBUG (0.000) INSERT INTO `django_migrations` (`app`, `name`, `applied`) VALUES ('dbmail', '0004_auto_20150321_2214', '2015-10-23 00:56:52'); args=['dbmail', u'0004_auto_20150321_2214', u'2015-10-23 00:56:52']
     OK
      Applying dbmail.0005_auto_20150506_2201...DEBUG CREATE TABLE `dbmail_mailbasetemplate` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` varchar(100) NOT NULL UNIQUE, `message` longtext NOT NULL, `created` datetime NOT NULL, `updated` datetime NOT NULL); (params [])
    DEBUG (0.005) CREATE TABLE `dbmail_mailbasetemplate` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` varchar(100) NOT NULL UNIQUE, `message` longtext NOT NULL, `created` datetime NOT NULL, `updated` datetime NOT NULL); args=[]
    DEBUG ALTER TABLE `dbmail_mailtemplate` ADD COLUMN `base_id` integer NULL; (params [])
    DEBUG (0.004) ALTER TABLE `dbmail_mailtemplate` ADD COLUMN `base_id` integer NULL; args=[]
    DEBUG ALTER TABLE `dbmail_mailtemplate` ALTER COLUMN `base_id` DROP DEFAULT; (params [])
    DEBUG (0.003) ALTER TABLE `dbmail_mailtemplate` ALTER COLUMN `base_id` DROP DEFAULT; args=[]
    DEBUG CREATE INDEX `dbmail_mailtemplate_078dce83` ON `dbmail_mailtemplate` (`base_id`); (params [])
    DEBUG (0.004) CREATE INDEX `dbmail_mailtemplate_078dce83` ON `dbmail_mailtemplate` (`base_id`); args=[]
    DEBUG ALTER TABLE `dbmail_mailtemplate` ADD CONSTRAINT `dbmail_ma_base_id_6971ccd5fcd1b12f_fk_dbmail_mailbasetemplate_id` FOREIGN KEY (`base_id`) REFERENCES `dbmail_mailbasetemplate` (`id`); (params [])
    DEBUG (0.004) ALTER TABLE `dbmail_mailtemplate` ADD CONSTRAINT `dbmail_ma_base_id_6971ccd5fcd1b12f_fk_dbmail_mailbasetemplate_id` FOREIGN KEY (`base_id`) REFERENCES `dbmail_mailbasetemplate` (`id`); args=[]
    DEBUG (0.001) SHOW TABLES; args=None
    DEBUG (0.000) INSERT INTO `django_migrations` (`app`, `name`, `applied`) VALUES ('dbmail', '0005_auto_20150506_2201', '2015-10-23 00:56:53'); args=['dbmail', u'0005_auto_20150506_2201', u'2015-10-23 00:56:53']
     OK
      Applying dbmail.0006_auto_20150708_0714...DEBUG CREATE TABLE `dbmail_mailsubscription` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `backend` varchar(50) NOT NULL, `start_hour` varchar(5) NOT NULL, `end_hour` varchar(5) NOT NULL, `is_enabled` bool NOT NULL, `is_checked` bool NOT NULL, `defer_at_allowed_hours` bool NOT NULL, `address` varchar(60) NOT NULL, `user_id` integer NULL); (params [])
    DEBUG (0.005) CREATE TABLE `dbmail_mailsubscription` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `backend` varchar(50) NOT NULL, `start_hour` varchar(5) NOT NULL, `end_hour` varchar(5) NOT NULL, `is_enabled` bool NOT NULL, `is_checked` bool NOT NULL, `defer_at_allowed_hours` bool NOT NULL, `address` varchar(60) NOT NULL, `user_id` integer NULL); args=[]
    DEBUG ALTER TABLE `dbmail_mailsubscription` ADD CONSTRAINT `dbmail_mailsubscription_user_id_440cd6feeb7e77b0_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`); (params [])
    DEBUG (0.018) ALTER TABLE `dbmail_mailsubscription` ADD CONSTRAINT `dbmail_mailsubscription_user_id_440cd6feeb7e77b0_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`); args=[]
    Traceback (most recent call last):
      File "manage.py", line 17, in <module>
        execute_from_command_line(sys.argv)
      File "/home/site/bijenkins/.pyenv/versions/site/lib/python2.7/site-packages/django/core/management/__init__.py", line 385, in execute_from_command_line
        utility.execute()
      File "/home/site/bijenkins/.pyenv/versions/site/lib/python2.7/site-packages/django/core/management/__init__.py", line 377, in execute
        self.fetch_command(subcommand).run_from_argv(self.argv)
      File "/home/site/bijenkins/.pyenv/versions/site/lib/python2.7/site-packages/django/core/management/base.py", line 288, in run_from_argv
        self.execute(*args, **options.__dict__)
      File "/home/site/bijenkins/.pyenv/versions/site/lib/python2.7/site-packages/django/core/management/base.py", line 338, in execute
        output = self.handle(*args, **options)
      File "/home/site/bijenkins/.pyenv/versions/site/lib/python2.7/site-packages/django/core/management/commands/migrate.py", line 161, in handle
        executor.migrate(targets, plan, fake=options.get("fake", False))
      File "/home/site/bijenkins/.pyenv/versions/site/lib/python2.7/site-packages/django/db/migrations/executor.py", line 68, in migrate
        self.apply_migration(migration, fake=fake)
      File "/home/site/bijenkins/.pyenv/versions/site/lib/python2.7/site-packages/django/db/migrations/executor.py", line 102, in apply_migration
        migration.apply(project_state, schema_editor)
      File "/home/site/bijenkins/.pyenv/versions/site/lib/python2.7/site-packages/django/db/backends/schema.py", line 82, in __exit__
        self.execute(sql)
      File "/home/site/bijenkins/.pyenv/versions/site/lib/python2.7/site-packages/django/db/backends/schema.py", line 102, in execute
        cursor.execute(sql, params)
      File "/home/site/bijenkins/.pyenv/versions/site/lib/python2.7/site-packages/django/db/backends/utils.py", line 81, in execute
        return super(CursorDebugWrapper, self).execute(sql, params)
      File "/home/site/bijenkins/.pyenv/versions/site/lib/python2.7/site-packages/django/db/backends/utils.py", line 65, in execute
        return self.cursor.execute(sql, params)
      File "/home/site/bijenkins/.pyenv/versions/site/lib/python2.7/site-packages/django/db/utils.py", line 94, in __exit__
        six.reraise(dj_exc_type, dj_exc_value, traceback)
      File "/home/site/bijenkins/.pyenv/versions/site/lib/python2.7/site-packages/django/db/backends/utils.py", line 65, in execute
        return self.cursor.execute(sql, params)
      File "/home/site/bijenkins/.pyenv/versions/site/lib/python2.7/site-packages/django/db/backends/mysql/base.py", line 129, in execute
        return self.cursor.execute(query, args)
      File "/home/site/bijenkins/.pyenv/versions/site/lib/python2.7/site-packages/MySQLdb/cursors.py", line 205, in execute
        self.errorhandler(self, exc, value)
      File "/home/site/bijenkins/.pyenv/versions/site/lib/python2.7/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
        raise errorclass, errorvalue
    django.db.utils.OperationalError: (1005, "Can't create table 'siteV2.#sql-2187_223e' (errno: 150)")
    
    
    
    
    
    
    (ENV)[bijenkins@bmositedev siteAppsite]$ 
    (ENV)[bijenkins@server site]$ python manage.py syncdb
    DEBUG (0.001) SET SQL_AUTO_IS_NULL = 0; args=None
    DEBUG (0.001) SHOW TABLES; args=None
    DEBUG (0.001) SELECT `django_migrations`.`app`, `django_migrations`.`name` FROM `django_migrations`; args=()
    Operations to perform:
      Synchronize unmigrated apps: allauth, app, tinymce, django_rq, suit
      Apply all migrations: account, explorer, thunderdomeV2, sessions, admin, documentation, sites, auth, thunderdome, contenttypes, dbmail, servicepathtable, socialaccount
    Synchronizing apps without migrations:
    DEBUG (0.001) SHOW TABLES; args=None
      Creating tables...
      Installing custom SQL...
      Installing indexes...
    DEBUG (0.000) SET foreign_key_checks=0; args=None
    DEBUG (0.000) SET foreign_key_checks=1; args=None
    DEBUG (0.000) SET SQL_AUTO_IS_NULL = 0; args=None
    DEBUG (0.000) SET foreign_key_checks=0; args=None
    DEBUG (0.000) SET foreign_key_checks=1; args=None
    DEBUG (0.000) SET SQL_AUTO_IS_NULL = 0; args=None
    DEBUG (0.000) SET foreign_key_checks=0; args=None
    DEBUG (0.000) SET foreign_key_checks=1; args=None
    DEBUG (0.000) SET SQL_AUTO_IS_NULL = 0; args=None
    DEBUG (0.000) SET foreign_key_checks=0; args=None
    DEBUG (0.000) SET foreign_key_checks=1; args=None
    DEBUG (0.000) SET SQL_AUTO_IS_NULL = 0; args=None
    DEBUG (0.000) SET foreign_key_checks=0; args=None
    DEBUG (0.000) SET foreign_key_checks=1; args=None
    Running migrations:
      Applying dbmail.0006_auto_20150708_0714...DEBUG CREATE TABLE `dbmail_mailsubscription` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `backend` varchar(50) NOT NULL, `start_hour` varchar(5) NOT NULL, `end_hour` varchar(5) NOT NULL, `is_enabled` bool NOT NULL, `is_checked` bool NOT NULL, `defer_at_allowed_hours` bool NOT NULL, `address` varchar(60) NOT NULL, `user_id` integer NULL); (params [])
    DEBUG (0.000) SET SQL_AUTO_IS_NULL = 0; args=None
    DEBUG (0.001) CREATE TABLE `dbmail_mailsubscription` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `backend` varchar(50) NOT NULL, `start_hour` varchar(5) NOT NULL, `end_hour` varchar(5) NOT NULL, `is_enabled` bool NOT NULL, `is_checked` bool NOT NULL, `defer_at_allowed_hours` bool NOT NULL, `address` varchar(60) NOT NULL, `user_id` integer NULL); args=[]
    Traceback (most recent call last):
      File "manage.py", line 17, in <module>
        execute_from_command_line(sys.argv)
      File "/home/DOMAIN/bijenkins/.pyenv/versions/site/lib/python2.7/site-packages/django/core/management/__init__.py", line 385, in execute_from_command_line
        utility.execute()
      File "/home/DOMAIN/bijenkins/.pyenv/versions/site/lib/python2.7/site-packages/django/core/management/__init__.py", line 377, in execute
        self.fetch_command(subcommand).run_from_argv(self.argv)
      File "/home/DOMAIN/bijenkins/.pyenv/versions/site/lib/python2.7/site-packages/django/core/management/base.py", line 288, in run_from_argv
        self.execute(*args, **options.__dict__)
      File "/home/DOMAIN/bijenkins/.pyenv/versions/site/lib/python2.7/site-packages/django/core/management/base.py", line 338, in execute
        output = self.handle(*args, **options)
      File "/home/DOMAIN/bijenkins/.pyenv/versions/site/lib/python2.7/site-packages/django/core/management/base.py", line 533, in handle
        return self.handle_noargs(**options)
      File "/home/DOMAIN/bijenkins/.pyenv/versions/site/lib/python2.7/site-packages/django/core/management/commands/syncdb.py", line 27, in handle_noargs
        call_command("migrate", **options)
      File "/home/DOMAIN/bijenkins/.pyenv/versions/site/lib/python2.7/site-packages/django/core/management/__init__.py", line 115, in call_command
        return klass.execute(*args, **defaults)
      File "/home/DOMAIN/bijenkins/.pyenv/versions/site/lib/python2.7/site-packages/django/core/management/base.py", line 338, in execute
        output = self.handle(*args, **options)
      File "/home/DOMAIN/bijenkins/.pyenv/versions/site/lib/python2.7/site-packages/django/core/management/commands/migrate.py", line 161, in handle
        executor.migrate(targets, plan, fake=options.get("fake", False))
      File "/home/DOMAIN/bijenkins/.pyenv/versions/site/lib/python2.7/site-packages/django/db/migrations/executor.py", line 68, in migrate
        self.apply_migration(migration, fake=fake)
      File "/home/DOMAIN/bijenkins/.pyenv/versions/site/lib/python2.7/site-packages/django/db/migrations/executor.py", line 102, in apply_migration
        migration.apply(project_state, schema_editor)
      File "/home/DOMAIN/bijenkins/.pyenv/versions/site/lib/python2.7/site-packages/django/db/migrations/migration.py", line 108, in apply
        operation.database_forwards(self.app_label, schema_editor, project_state, new_state)
      File "/home/DOMAIN/bijenkins/.pyenv/versions/site/lib/python2.7/site-packages/django/db/migrations/operations/models.py", line 36, in database_forwards
        schema_editor.create_model(model)
      File "/home/DOMAIN/bijenkins/.pyenv/versions/site/lib/python2.7/site-packages/django/db/backends/schema.py", line 261, in create_model
        self.execute(sql, params)
      File "/home/DOMAIN/bijenkins/.pyenv/versions/site/lib/python2.7/site-packages/django/db/backends/schema.py", line 102, in execute
        cursor.execute(sql, params)
      File "/home/DOMAIN/bijenkins/.pyenv/versions/site/lib/python2.7/site-packages/django/db/backends/utils.py", line 81, in execute
        return super(CursorDebugWrapper, self).execute(sql, params)
      File "/home/DOMAIN/bijenkins/.pyenv/versions/site/lib/python2.7/site-packages/django/db/backends/utils.py", line 65, in execute
        return self.cursor.execute(sql, params)
      File "/home/DOMAIN/bijenkins/.pyenv/versions/site/lib/python2.7/site-packages/django/db/utils.py", line 94, in __exit__
        six.reraise(dj_exc_type, dj_exc_value, traceback)
      File "/home/DOMAIN/bijenkins/.pyenv/versions/site/lib/python2.7/site-packages/django/db/backends/utils.py", line 65, in execute
        return self.cursor.execute(sql, params)
      File "/home/DOMAIN/bijenkins/.pyenv/versions/site/lib/python2.7/site-packages/django/db/backends/mysql/base.py", line 129, in execute
        return self.cursor.execute(query, args)
      File "/home/DOMAIN/bijenkins/.pyenv/versions/site/lib/python2.7/site-packages/MySQLdb/cursors.py", line 205, in execute
        self.errorhandler(self, exc, value)
      File "/home/DOMAIN/bijenkins/.pyenv/versions/site/lib/python2.7/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
        raise errorclass, errorvalue
    django.db.utils.OperationalError: (1050, "Table 'dbmail_mailsubscription' already exists")
    
    
    mysql> use DBtest
    Database changed
    mysql> show tables;
    +----------------------------------------+
    | Tables_in_DBtest                     |
    +----------------------------------------+
    | Inventory_Warehouse                    |
    | Inventory_Warehouse_copy               |
    | Replace_List                           |
    | ThunderDome                            |
    | ThunderDome_End                        |
    | ThunderDome_log                        |
    | Waiting_Videos                         |
    | account_emailaddress                   |
    | account_emailconfirmation              |
    | auditor_misc_lines                     |
    | auditor_models                         |
    | auth_group                             |
    | auth_group_permissions                 |
    | auth_permission                        |
    | auth_user                              |
    | auth_user_groups                       |
    | auth_user_user_permissions             |
    | dbmail_apikey                          |
    | dbmail_mailbasetemplate                |
    | dbmail_mailbcc                         |
    | dbmail_mailcategory                    |
    | dbmail_mailfile                        |
    | dbmail_mailfromemail                   |
    | dbmail_mailfromemailcredential         |
    | dbmail_mailgroup                       |
    | dbmail_mailgroupemail                  |
    | dbmail_maillog                         |
    | dbmail_maillogemail                    |
    | dbmail_maillogexception                |
    | dbmail_maillogtrack                    |
    | dbmail_mailsubscription                |
    | dbmail_mailtemplate                    |
    | dbmail_mailtemplate_bcc_email          |
    | dbmail_signal                          |
    | dbmail_signaldeferreddispatch          |
    | dbmail_signallog                       |
    | django_admin_log     
    
    help wanted 
    opened by bijenkins 9
  • Using celery without djcelery

    Using celery without djcelery

    Hello, DB mailer works with celery only when djcelery is installed. But with latest version of celery it's possible to use celery with django without this library. How I can use db-mailer with celery without djcelery installed?

    opened by DimaKudosh 7
  • send_db_mail arguments for template + template tags

    send_db_mail arguments for template + template tags

    Hi guys,

    What is the working example of providing arguments to send_db_mail()?

    Following example is not working:

    send_db_mail(
        # slug which defined on db template
        slug='welcome',
    
        # recipient can be list, or str separated with comma or simple string
        # '[email protected]' or '[email protected], [email protected]' or
        # ['[email protected]', '[email protected]'] or string Mail group slug
        recipient='[email protected]',
    
        **# All *args params will be accessible on template context
        {
            'username': request.user.username,
            'full_name': request.user.get_full_name(),
            'signup_date': request.user.date_joined,
            'prefix': "DbMail",
        },**
    )
    

    because: SyntaxError: positional argument follows keyword argument

    Can you please write me how to pass arguments?

    Also I have another question. Is it possible to use tags inside of template? I want to render url in the template with something similar to {% url ... %} Thanks!

    opened by tyapkov 7
  • Image tag in CK-editor convert template tags from {{ image_url }} to %7B%7B%20image_url%20%7D%7D

    Image tag in CK-editor convert template tags from {{ image_url }} to %7B%7B%20image_url%20%7D%7D

    When using Ck-editor if you define a template tage for image_url as <img src={{ image_url }} Ck_ editor encode them to %7B%7B%20image_url%20%7D%7D and is not recognized by db-mailer while sending email. Any solution for this?

    question 
    opened by waqasraz 7
  • Django 1.10 support?

    Django 1.10 support?

    Hello,

    I'm hoping to use django-db-mailer in my project but I am using Django 1.10 and it looks like only 1.8 is supported.

    I was wondering if there are plans to add support for 1.10?

    I might be able to help with that effort but since I've never used django-db-mailer I don't know if I'm the best person for that.

    Thanks!

    opened by jeffcjohnson 5
  • Шаблонизатора для темы письма

    Шаблонизатора для темы письма

    Было бы здорово добавить поддержку шаблонов в теме письма. Сейчас приходится делать так:

    original_mail_template_subject = mail_template.subject
    mail_template.subject = _('Mail subject template «%s» [%s, %s]' %
                              (param1, param2, param3))
    mail_template.save()
    ....
    mail_template.subject = original_mail_template_subject
    mail_template.save()
    
    question 
    opened by ad-lebedev 5
  • Add option in sttings for custom HTMLField class.

    Add option in sttings for custom HTMLField class.

    Пользуюсь Вашим проектом и решил немного его улучшить.

    Вместо кучи блоков try/except в фале fields.py для всех мыслимых пользовательских HTML-полей для модели, я запилил импорт по строке вида 'app.fields.MyCustomModelHTMLField'.

    Теперь совсем не обязательно, чтобы батарейка, из которой берётся поле, была в INSTALLED_APPS. Достаточно, чтобы она просто была в доступна для импорта.

    opened by petrikoz 5
  • Double underscores

    Double underscores

    Хотелось бы услышать мнение автора на тему обильного использования двойных подчеркиваний особенно интересуют методы классов которые фактически не участвуют в наследование. Чем мотивируется такое желание сделать все методы приватными членами класса?

    enhancement question 
    opened by sergio-bershadsky 5
  • RemovedInDjango40Warning

    RemovedInDjango40Warning

    For Django Version 4.0+

    • RemovedInDjango40Warning: django.utils.translation.ugettext_lazy() is deprecated in favor of django.utils.translation.gettext_lazy().

    • RemovedInDjango40Warning: django.conf.urls.url() is deprecated in favor of django.urls.re_path().

    opened by Detrua 0
  • Bump django-debug-toolbar from 1.7 to 1.11.1 in /demo

    Bump django-debug-toolbar from 1.7 to 1.11.1 in /demo

    Bumps django-debug-toolbar from 1.7 to 1.11.1.

    Changelog

    Sourced from django-debug-toolbar's changelog.

    1.11.1 (2021-04-14)

    • Fixed SQL Injection vulnerability, CVE-2021-30459. The toolbar now calculates a signature on all fields for the SQL select, explain, and analyze forms.

    1.11 (2018-12-03)

    • Use defer on all <script> tags to avoid blocking HTML parsing, removed inline JavaScript.
    • Stop inlining images in CSS to avoid Content Security Policy errors altogether.
    • Reformatted the code using black <https://github.com/ambv/black>__.
    • Added the Django mail panel to the list of third-party panels.
    • Convert system check errors to warnings to accomodate exotic configurations.
    • Fixed a crash when explaining raw querysets.
    • Fixed an obscure unicode error with binary data fields.
    • Added MariaDB and Python 3.7 builds to the CI.

    1.10.1 (2018-09-11)

    • Fixed a problem where the duplicate query detection breaks for non-hashable query parameters.
    • Added support for structured types when recording SQL.
    • Made Travis CI also run one test no PostgreSQL.
    • Added fallbacks for inline images in CSS.
    • Improved cross-browser compatibility around URLSearchParams usage.
    • Fixed a few typos and redundancies in the documentation, removed mentions of django-debug-toolbar's jQuery which aren't accurate anymore.

    1.10 (2018-09-06)

    • Removed support for Django < 1.11.
    • Added support and testing for Django 2.1 and Python 3.7. No actual code changes were required.
    • Removed the jQuery dependency. This means that django-debug-toolbar now requires modern browsers with support for fetch, classList etc.
    • Added support for the server timing header.
    • Added a differentiation between similar and duplicate queries. Similar queries are what duplicate queries used to be (same SQL, different parameters).
    • Stopped hiding frames from Django's contrib apps in stacktraces by default.

    ... (truncated)

    Commits
    • bc08f69 Merge pull request from GHSA-pghf-347x-c2gj
    • c201ce3 django-debug-toolbar 1.11
    • 0a75be1 Update the change log
    • a4a5393 Merge pull request #1121 from matthiask/mariadb
    • 48a0e2e Reformat settings using black
    • 901aed7 Mark binary payload as binary (same thing BinaryField.get_db_prep_value does)
    • ad091e6 Test with a real BinaryField
    • 2f3193e Remove the MySQL USER
    • 762e5d9 Run tests with MariaDB too on Travis CI
    • e78ac8c Merge pull request #1107 from dbowd/patch-1
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • NullBooleanField is deprecated

    NullBooleanField is deprecated

    NullBooleanField is deprecated in Django 3.1.1 and it will be removed in Django 4.0.0. So have to replace NullBooleanField with BooleanField(null=True) to make it work for Django 4.x.

    opened by chetan1029 1
  • Fix twilio provider b64encode error in python3

    Fix twilio provider b64encode error in python3

    Fixes the following error when running with python3: TypeError: a bytes-like object is required, not 'str'

    This change changes nothing in python2 but casts to a bytestring in python3 which enables casting to a base64 string in both versions.

    opened by Esperk 2
  • pip installation failing in centos due to russian character in README.rst

    pip installation failing in centos due to russian character in README.rst

    Before to submit your pull-request:

    • Be sure that the unit tests pass
    • If you create a new feature, test your code, do not introduce new bugs
    • Avoid code duplication
    • Small pull-requests are easier to review and can be merged quickly
    • 1 pull-request == 1 feature/improvement
    opened by divyang27 1
  • Centos pip install db mailer failing Unicode     UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 15845: ordinal not in range(128)

    Centos pip install db mailer failing Unicode UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 15845: ordinal not in range(128)

    Do you want to request a feature or report a bug?

    What is the current behavior?

    If the current behavior is a bug, please provide the steps to reproduce and if possible a minimal demo of the problem

    Full traceback

    What is the expected behavior?

    Which versions of DbMail, Django and which Python / OS are affected by this issue? Did this work in previous versions of Cloning git://github.com/LPgenerator/django-db-mailer.git to /tmp/pip-req-build-8ul62wi0 Complete output from command python setup.py egg_info: Traceback (most recent call last): File "", line 1, in File "/tmp/pip-req-build-8ul62wi0/setup.py", line 11, in long_description=open('README.rst').read(), File "/home/centos/nsecfdenv/lib64/python3.6/encodings/ascii.py", line 26, in decode return codecs.ascii_decode(input, self.errors)[0] UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 15845: ordinal not in range(128)DbMail?

    opened by divyang27 0
Releases(2.4.0)
  • 2.4.0(Oct 8, 2018)

  • 2.3.19(Aug 1, 2017)

  • 2.3.14(Jan 27, 2017)

  • 2.3.12(Sep 14, 2016)

    • Django 1.10 support
    • Default mail provider
    • WebPush docs and examples (GC/FF/Safari)
    • Some fixes on push notification providers
    • Push subscriptions handlers
    • Add smsbliss provider
    • APNs/2: fix utf8
    • Push backend, push provider, model data and title fields
    • Logging fix
    Source code(tar.gz)
    Source code(zip)
  • 2.3.10(Jun 1, 2016)

  • 2.3.8(May 19, 2016)

    • GCM provider
    • APNs provider
    • MPNs provider
    • HTTP push provider
    • CentrifuGo provider
    • PushAll provider
    • Update docs
    • Different queues for each backends
    • Update URLs to work with django 1.9+ admin
    Source code(tar.gz)
    Source code(zip)
  • 2.3.6(Apr 17, 2016)

  • 2.3.5(Apr 11, 2016)

  • 2.3.4(Apr 4, 2016)

    • Added availability to pass unnamed args to send_confirmation_link func
    • Added availability to pass template context to notify method as named args
    • Unique address changed to db_index and some vars moved to settings
    Source code(tar.gz)
    Source code(zip)
  • 2.3.3(Jan 9, 2016)

  • 2.3(Dec 3, 2015)

    • Django 1.9 support
    • Responsive transactional HTML email templates
    • Custom backends examples
    • Update docs
    • context._meta.module_name fix
    • BaseTemplate translation
    • pre_send/post_send signals + StopSendingException
    • grappelli-modeltranslation support
    • intial_signals fix
    • Subscription api
    • LXC provider for vagrant
    Source code(tar.gz)
    Source code(zip)
  • 2.2(Sep 19, 2015)

    • Basic templates on db
    • Python 3 support
    • PEP8/Migrations/smtp hmac fixes
    • Manual cache clean
    • Update translation/docs
    • Subscription functionality
    • DEBUG all calls by logging to stdout
    • SmsAero/Twilio/IQSms providers
    • Backward compatibility fix
    • django-ckeditor/django-suit support
    • vagrant-cachier support
    Source code(tar.gz)
    Source code(zip)
  • 2.1(Apr 30, 2015)

    Docker/Vagrant demo Sms/Tts/Push api Custom backends and providers support Api examples on common languages Some improvements and fixes Update Translations Update docs Django 1.8 support Landscape checks Travis CI Tox

    Source code(tar.gz)
    Source code(zip)
  • 2.0.1(Mar 18, 2015)

    • Translation support
    • BCC functionality
    • API functionality
    • SMTP settings
    • Signals functionality
    • Email groups functionality
    • Test template functionality
    • New management commands
    • Model browser
    • Caching requests
    • Wrapper header
    • Premailer support
    • Reversion support
    • Reversion compare support
    • Save all exceptions
    • Enable/disable logging
    • Enable/disable readonly fields
    • Translation updates
    • Docs updates
    • Demo updates
    • Makefile updates
    • Django 1.7 support
    • Added use_celery flag for debug/local development
    • Added constant for allow/disallow some models on admin
    • Comma separated groups
    • Fixed problems with readonly and prepopulated fields
    • Fixed bug with save logs when template is disabled
    • Fixed Site.DoesNotExist exception, when site app was not used
    • Fixed Translation/Static installation
    • Fixed problem with improperly configured static path
    • Files attachments functionality & etc.
    Source code(tar.gz)
    Source code(zip)
An API to send emails through python3's smtplib module.

An API to send emails through python3's smtplib module. Just configure your SMTP server credentials and you are ready to send a lot of emails through API, designed to be used as a newsletter service.

Adnan Ahmad 15 Nov 24, 2022
A Django app that allows you to send email asynchronously in Django. Supports HTML email, database backed templates and logging.

Django Post Office Django Post Office is a simple app to send and manage your emails in Django. Some awesome features are: Allows you to send email as

User Inspired 856 Dec 25, 2022
Send Emails through the terminal , fast and secure

Send Emails through the terminal , fast and secure

null 11 Aug 7, 2022
Use Django admin to manage drip campaign emails using querysets on Django's User model.

Django Drip Drip campaigns are pre-written sets of emails sent to customers or prospects over time. Django Drips lets you use the admin to manage drip

Zapier 630 Nov 16, 2022
Churn Emails Inbox - Churn Emails Inbox Using Python

Churn Emails Inbox In this project, I have used the Python programming langauge

null 2 Nov 13, 2022
Envia-emails - A Python Program that creates emails

Envia-emails Os emails é algo muito importante e usado. Pensando nisso, eu criei

José Rodolfo 2 Mar 5, 2022
Temp-SMS-Receive - A Program Which Allows You To Receive Temp SMS

Welcome to Temp-SMS-Receive ?? A Program Which Allows You To Receive Temp SMS AP

Sandaru Ashen Fernando 21 Dec 10, 2022
Bulk send personalized emails using a .csv file and Gmail API (via EZGmail)

GSender Bulk send personalized emails using a .csv file and Gmail API (via EZGmail). Installation Install requirements.txt. Follow the EZGmail Install

null 1 Nov 23, 2021
Convert emails without attachments to pdf and send as email

Email to PDF to email This script will check an imap folder for unread emails. Any unread email that does not have an attachment will be converted to

Robert Luke 21 Nov 22, 2022
A spammer to send mass emails to teachers. (Education Purposes only!)

Securly-Extension-Spammer A spammer to send mass emails to teachers. (Education Purposes only!) Setup Just go a securly blocked page(You can do this b

null 3 Jan 25, 2022
Pysces (read: Pisces) is a program to help you send emails with an user-customizable time-based scheduling.

Pysces (Python Scheduled-Custom-Email-Sender) Pysces (read: Pisces) is a program to help you send emails with an user-customizable time-based email se

Peter 1 Jun 16, 2022
Will iterate through a list of emails on an attached csv file and email all of them a message of your choice

Email_Bot Will iterate through a list of emails on an attached csv file and email all of them a message of your choice. Before using, make sure you al

J. Brandon Walker 1 Nov 30, 2021
A python program capable of accessing passwords associated with emails through leaked databases.

passfind A python program capable of accessing passwords associated with emails through leaked databases. A python program capable of accessing passwo

null 6 Aug 14, 2022
this is django project through this project you can easily sends message to any email

SEND-EMAIL this is django project through this project you can easily sends message to any email home when you run the server then you will see this t

Ankit jadhav 1 Oct 17, 2021
PGP encrypted / multipart templated emails for Django

Created by Stephen McDonald Introduction django-email-extras is a Django reusable app providing the ability to send PGP encrypted and multipart emails

stephenmcd 75 May 14, 2022
A functional demo of the O365 Module to send an email on an authenticated, tokenized account.

O365_email A functional demo of the O365 Module to send an email on an authenticated, tokenized account. Prep Create an app in Azure Developer's porta

null 2 Oct 14, 2022
Collection of emails sent from the Hungarian gov and Viktor Orbán to the citizens of Hungary

Public list of Hungary and Viktor Orbán's emails since March 2021 Collection of emails sent from the Hungarian government and Viktor Orbán to the citi

Miguel Sozinho Ramalho 1 Mar 28, 2022
It s a useful project for developers ... It checks available and unavailable emails

EmailChecker It s a useful project for developers ... It checks available and unavailable emails Installation : pip install EmailChecker Domains are

Sidra ELEzz 19 Jan 1, 2023
This python script will generate passwords for your emails, With certain lengths, And saves them into plain text files.

How to use. Change the Default length of genereated password in default.length.txt Type the email for your account. Type the website that the email an

null 2 Dec 26, 2021