Skip to main content

Email confirmation app for django

Project description

Django Email Verification

PyPI PyPI - Python Version PyPI - Django Version PyPI - License GitHub Workflow Status codecov

Requirements

  • Python >= 3.8
  • Django >= 3.1

General concept

Schema

Installation

You can install by:

pip3 install django-email-verification

and import by:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    ...
    'django_email_verification',  # you have to add this
]

Settings parameters

You have to add these parameters to the settings, you have to include all of them except the last one:

def verified_callback(user):
    user.is_active = True


EMAIL_VERIFIED_CALLBACK = verified_callback
EMAIL_FROM_ADDRESS = 'noreply@aliasaddress.com'
EMAIL_MAIL_SUBJECT = 'Confirm your email'
EMAIL_MAIL_HTML = 'mail_body.html'
EMAIL_MAIL_PLAIN = 'mail_body.txt'
EMAIL_TOKEN_LIFE = 60 * 60
EMAIL_PAGE_TEMPLATE = 'confirm_template.html'
EMAIL_PAGE_DOMAIN = 'http://mydomain.com/'

# For Django Email Backend
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'mymail@gmail.com'
EMAIL_HOST_PASSWORD = 'mYC00lP4ssw0rd'  # os.environ['password_key'] suggested
EMAIL_USE_TLS = True

In detail:

  • EMAIL_VERIFIED_CALLBACK: the function that will be called when the user successfully verifies the email. Takes the user object as argument.
  • EMAIL_FROM_ADDRESS: this can be the same as EMAIL_HOST_USER or an alias address if required.
  • EMAIL_MAIL_:
    • SUBJECT: the mail default subject.
    • HTML: the mail body template in form of html.
    • PLAIN: the mail body template in form of .txt file.
  • EMAIL_TOKEN_LIFE: the lifespan of the email link (in seconds).
  • EMAIL_PAGE_TEMPLATE: the template of the success/error view.
  • EMAIL_PAGE_DOMAIN: the domain of the confirmation link (usually your site's domain).

For the Django Email Backend fields look at the official documentation.

Templates examples

The EMAIL_MAIL_HTML should look like this ({{ link }}(str), {{ expiry }}(datetime) and user(Model) are passed during the rendering):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Email Confirmation</title>
</head>
<body>
<h1>You are almost there, {{ user.username }}!</h1><br>
<h2>Please click <a href="{{ link }}">here</a> to confirm your account</h2>
<h2>The token expires on {{ expiry|time:"TIME_FORMAT" }}</h2>
</body>
</html>

The EMAIL_MAIL_PLAIN should look like this ({{ link }}(str), {{ expiry }}(datetime) and user(Model) are passed during the rendering):

You are almost there, {{ user.username }}!
Please click the following link to confirm your account: {{ link }}
The token expires on {{ expiry|time:"TIME_FORMAT" }}

The EMAIL_PAGE_TEMPLATE should look like this ({{ success }}(bool), {{ user }}(Model) and {{ request }}(WSGIRequest) are passed during the rendering):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Confirmation</title>
</head>
<body>
{% if success %}
{{ user.username }}, your account is confirmed!
{% else %}
Error, invalid token!
{% endif %}
</body>
</html>

Email sending

After you have created the user you can send the confirm email

from django.shortcuts import render
from django.contrib.auth import get_user_model
from django_email_verification import send_email


def my_functional_view(request):
    ...
    user = get_user_model().objects.create(username=username, password=password, email=email)
    user.is_active = False  # Example
    send_email(user)
    return render(...)

send_email(user) sends an email with the defined template (and the pseudo-random generated token) to the user.

IMPORTANT: You have to manually set the user to inactive before sending the email.

If you are using class based views, then it is necessary to call the superclass before calling the send_confirm method.

from django.views.generic.edit import FormView
from django_email_verification import send_email


class MyClassView(FormView):

    def form_valid(self, form):
        user = form.save()
        returnVal = super(MyClassView, self).form_valid(form)
        send_email(user)
        return returnVal

Token verification

You have to include the urls in urls.py

from django.contrib import admin
from django.urls import path, include
from django_email_verification import urls as email_urls

urlpatterns = [
    path('admin/', admin.site.urls),
    ...
    path('email/', include(email_urls)),
]

When a request arrives to https.//mydomain.com/email/<base64-email>/<token> the package verifies the token and:

  • if it corresponds to a pending token it renders the EMAIL_PAGE_TEMPLATE passing success=True and deletes the token
  • if it doesn't correspond it renders the EMAIL_PAGE_TEMPLATE passing success=False

Console backend for development

If you want to use the console email backend provided by django, then define:

EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

You can use all the django email backends and also your custom one.

Custom salt for token generation

Pass the custom_salt keyword parameter to the send_confirm method as follows:

send_email(user, custom_salt=my_custom_key_salt)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django-email-verification-0.1.0.tar.gz (12.4 kB view details)

Uploaded Source

Built Distribution

django_email_verification-0.1.0-py3-none-any.whl (12.5 kB view details)

Uploaded Python 3

File details

Details for the file django-email-verification-0.1.0.tar.gz.

File metadata

  • Download URL: django-email-verification-0.1.0.tar.gz
  • Upload date:
  • Size: 12.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/49.2.1 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for django-email-verification-0.1.0.tar.gz
Algorithm Hash digest
SHA256 0b2bac4f0de734f45b28bf640b0a0252251bfac6c1bfa8e0bd44ba56fd9c9e83
MD5 97933758b49caa61ee6430094a996fff
BLAKE2b-256 6cb495e4b312e5d2bf97bd00c639dd24a1b71e0258a91644511a5afb1cc68e96

See more details on using hashes here.

File details

Details for the file django_email_verification-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: django_email_verification-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 12.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/49.2.1 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for django_email_verification-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 3285c118f8effdc917aeb98ac119ea33af92b0b2e0856d841567c16bf65dd6b7
MD5 3bbbf0f3e5dc2847db123452f21597d9
BLAKE2b-256 b4ef35d64d7a2c2259cc065aadef0eb9127b928f16a3333f8ceee3511198a29d

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page