coding

Отправка письма в html формате в django.

29 мая 2017 г.

Письмо в html формате выглядит намного привлекательнее и может содержать например фирменный логотип. Как отправить письмо в формате html? Все просто, в django уже все для этого есть.


Отправлять почту будем через smtp.

В settings.py для почты gmail.com у меня следующее:

# Почта
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'ваша_почта@gmail.com'
EMAIL_HOST_PASSWORD = 'ваш_пароль'
EMAIL_PORT = 587
EMAIL_USE_TLS = True

К примеру у нас на сайте имеется форма обратной связи, в которой пользователь вводит свои данные. Нам требуется при валидации формы отрендерить их в шаблон письма. Итак мы имеем в forms.py:

class ContactForm(forms.Form):
    '''Форма обратной связи'''
    name = forms.CharField(label='Ваше имя *', max_length=100,
                           widget=forms.TextInput(attrs={'placeholder': 'Ваше имя *'}))
    email = forms.EmailField(label='E-mail *', max_length=100,
                             widget=forms.EmailInput(attrs={'placeholder': 'E-mail *'}))
    title = forms.CharField(label='Тема письма *', max_length=200,
                            widget=forms.TextInput(attrs={'placeholder': 'Тема письма *'}))
    copy_mail = forms.BooleanField(required=False)
    message = forms.CharField(widget=forms.Textarea(attrs={'placeholder': 'Ваше сообщение *'}))


Здесь я думаю назначение всех полей понятно, единственное можно сказать про поле copy_mail - это чек бокс, который отмечает, нужно ли отправить копию письма его автору.

В этот же класс ContactForm добавим метод отправки формы (отправить форму можно конечно было бы и во вьюхе, но это будет не правильно с точки зрения повторного использования кода - лучше делать «тонкие» представления и «толстые» модели).

def send_html(self):
        '''Отправить письмо в HTML формате'''
        data = self.cleaned_data
        subject = 'Форма обратной связи сайта site.com'
        if data['copy_mail']:
            to = (settings.EMAIL_HOST_USER, data['email'])
        else:
            to = (settings.EMAIL_HOST_USER,)
        from_email = settings.EMAIL_HOST_USER
        context = {
            'name': data['name'],
            'email': data['email'],
            'title': data['title'],
            'message': data['message']
        }
        message = get_template('mail.html').render(context)
        msg = EmailMessage(subject, message, to=to, from_email=from_email)
        msg.content_subtype = 'html'
        try:
            msg.send()
        except:
            return False
        return True 

Итак, в методе send_html мы получаем валидные данные из формы - data = self.cleaned_data.
Если чекбокс copy_mail был отмечен пользователем, то будем отправлять копию письма еще и пользователю.
Далее создаем словарь context, который мы будем рендерить в шаблон письма.
Получаем шаблон письма и передаем в него контекст - get_template('mail.html').render(context).
Не забываем указывать формат письма content_subtype = 'html'.
И в конце отправляем наше письмо.

Кроме всего не забываем импортировать используемые классы и методы - from django.core.mail import EmailMessage и from django.template.loader import get_template.


Теперь что у нас в view.py:

class ContactView(AllPagesMixin, FormView):
    '''Страница контактов'''
    form_class = ContactForm
    template_name = 'shop/contact.html'
    success_url = 'success'
    def form_valid(self, form):
        if form.send_html():
            return super(ContactView, self).form_valid(form)
        else:
            return HttpResponse(status=400)

И сам шаблон письма mail.html:

<head></head>
<body>
<div style="width: 100%; background: #e74c3c; padding: 0 0 5px;">
    <a href="http://site.com"
       style="display: block; text-align: center; width: 100%; color: #fff; font-size: 24px; text-decoration: none;" target="_blank">
        <img src="http://site.com/images/logo.png" alt="logo">
    </a>
</div>
<p style="color: grey; font-size: 16px;">Автор письма:
    <span style="color: #222; font-weight: 500;">{{ name }}</span></p>
<p style="color: grey; font-size: 16px;">E-mail автора: <span style="color: #222; font-weight: 500;">
    <a href="mailto:{{ email }}">{{ email }}</a></span></p>
<div style="background: #f9f9f9; padding: 20px;">
    <h1 style="text-align: center; font-size: 22px; font-weight: 600;">{{ title }}</h1>
    <p style="font-size: 16px; line-height: 1.5; text-align: justify">{{ message }}</p>
</div>
</body>
</html>

С шаблоном есть нюансы, чтобы все правильно отображалось, лучше всего использовать самые распространенные теги типа <div> или <p> и все стили писать внутри этих тегов.

Просмотров - 354

Оставить комментарий

Комментарий будет размещен на сайте после прохождения модерации.

Комментарии