Отправка письма в html формате в django.
29 мая 2017 г.
djangoПисьмо в 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:
'''Форма обратной связи'''
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 добавим метод отправки формы (отправить форму можно конечно было бы и во вьюхе, но это будет не правильно с точки зрения повторного использования кода - лучше делать «тонкие» представления и «толстые» модели).
'''Отправить письмо в 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:
'''Страница контактов'''
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:
<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
Комментарий будет размещен на сайте после прохождения модерации.