Отправка e-mail в Django

Отличная статья по настройке POSTFIX: https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-postfix-as-a-send-only-smtp-server-on-ubuntu-16-04

Отправка e-mail в Django довольно проста. Во-первых, необходимо иметь локальный SMTP-сервер или определить конфигурацию внешнего SMTP-сервера, добавив следующие параметры в файл Settings.py проекта:

  • EMAIL_HOST : The SMTP server host. По умолчанию localhost .
  • EMAIL_PORT : The SMTP port по умолчанию 25.
  • EMAIL_HOST_USER : Username для SMTP server.
  • EMAIL_HOST_PASSWORD : Password для SMTP server.
  • EMAIL_USE_TLS : Использовать ли безопасное подключение TLS.
  • EMAIL_USE_SSL : Использование неявного TLS-безопасного подключения.

Если у вас нет локального SMTP-сервера, можно использовать SMTP-сервер поставщика услуг электронной почты. Приведенная ниже примерная конфигурация допустима для отправки сообщений электронной почты через серверы Gmail с использованием учетной записи Google:

EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = '[email protected]'
EMAIL_HOST_PASSWORD = 'your_password'
EMAIL_PORT = 587
EMAIL_USE_TLS = True

Выполните в консоли python manage.py, чтобы открыть оболочку Python и отправить сообщение по электронной почте следующим образом:

>>> from django.core.mail import send_mail
>>> send_mail('Django mail', 'This e-mail was sent with Django.', 
'[email protected]', ['[email protected]'], fail_silently=False)

send_mail() в качестве необходимых аргументов учитывает тему письма, сообщение, отправителя и список получателей. Установив необязательный аргумент fail_silently=False, мы сообщаем, что он вызывает исключение, если сообщение не может быть отправлено. Если отображается сообщение 1, то письмо успешно отправлено. При отправке сообщений электронной почты Gmail с предыдущей конфигурацией, возможно, потребуется включить доступ для менее защищенных приложений на https://www.google.com/settings/security/lesssecureapps

Отредактируйте представление post_share в файле views.py приложения блога:

from django.core.mail import send_mail

def post_share(request, post_id):
    # Retrieve post by id
    post = get_object_or_404(Post, id=post_id, status='published')
    sent = False
    if request.method == 'POST':
        # Form was submitted
        form = EmailPostForm(request.POST)
        if form.is_valid():
            # Form fields passed validation
            cd = form.cleaned_data
            post_url = request.build_absolute_uri(post.get_absolute_url())
            subject = '{} ({}) recommends you reading "{}"'.format(cd['name'], cd['email'], post.title)
            message = 'Read "{}" at {}\n\n{}\'s comments: {}'.format(post.title, post_url, cd['name'], cd['comments'])
            send_mail(subject, message, '[email protected]',[cd['to']])
            sent = True
    else:
        form = EmailPostForm()
    return render(request, 'blog/post/share.html', {'post': post,
                                                    'form': form,
                                                    'sent': sent})

Обратите внимание, что мы объявляем переменную sent и присваиваем ей значение true, когда почта была отправлена. Мы собираемся использовать эту переменную позже в шаблоне для отображения сообщения об успешном выполнении формы. Поскольку мы должны включить ссылку на отправляемый пост в электронном сообщении, мы извлекаем абсолютный путь нему с помощью метода get_absolute_url(). Этот путь используется в качестве входных данных для request.build_absolute_uri() для построения полного URL-адреса, включая схему HTTP и имя хоста. Мы строим тему и текст сообщения с помощью валидных данных проверенной формы и, наконец, отправляем сообщение на адрес электронной почты, содержащийся в поле «Кому».

Теперь, когда представление завершено, не забудьте добавить для него новый шаблон URL-адреса. Откройте файл urls.py приложения блога и добавьте шаблон URL-адреса post_share, как показано ниже:

urlpatterns = [
    # ...
    url(r'^(?P<post_id>\d+)/share/$', views.post_share, name='post_share'),
]

results matching ""

    No results matching ""