Правильная техника для контактной формы? - PullRequest
2 голосов
/ 10 марта 2011

У меня есть контактная форма на shantiyoga.ca / contact

С видом

def contact(request):

    template = 'contact.html'

    form = ContactForm(request.POST or None)    
    if form.is_valid(): # All validation rules pass

        subject = form.cleaned_data['subject']
        message = "%s\n\n%s" % (form.cleaned_data['message'], form.cleaned_data['sender'])
        cc_myself = form.cleaned_data['cc_myself']

        recipients = ['contact@shantiyoga.ca']

        sender = form.cleaned_data['sender']
        if cc_myself:
            recipients.append(sender)

        headers = {'Reply-To': form.cleaned_data['sender']}  

        from django.core.mail import send_mail
        send_mail(subject,message,sender,recipients,headers)

        return redirect('/thanks/')

    return render_to_response(template, {'form': form, 'current':'contact'}, context_instance=RequestContext(request))

, который работает довольно хорошо.Я не очень хорошо разбираюсь в Django, и мои навыки Python не совсем хороши, поэтому, пожалуйста, потерпите меня, если я сделаю это простым способом.

Я хотел бы уточнить, что нет никакого способадля получателя формы (contact@shantiyoga.ca), чтобы получить контактную форму из значения поля электронной почты (введено пользователем).Он всегда будет отправляться по электронной почте с подтверждением подлинности в мой файл settings.py, который на данный момент является моим личным адресом электронной почты?

Пользователь заполняет контактную форму и нажимает кнопку отправить, электронное письмо отправляется на адрес contact @ shantiyoga.Приблизительно из моего личного электронного письма, и если пользователь решит сделать это самостоятельно, ему отправляется копия электронного письма, в том числе и из моего личного электронного письма.

Это не идеально, если я создаю электронное письмо, например contactform@shantiyoga.ca, для моего settings.py для отправки электронного письма с?

Кроме того, headers = {'Reply-To': form.cleaned_data['sender']}, похоже, нечто-то делать, и я не могу найти документацию, описывающую его правильное использование, кто-нибудь имел успех, используя эту технику?

Спасибо за ваше время, Ной

Ответы [ 2 ]

0 голосов
/ 10 марта 2011

Вот подпись send_mail из документации django :

send_mail(subject, message, from_email, recipient_list, fail_silently=False, auth_user=None, auth_password=None, connection=None)

Как видите, аргумент headers отсутствует.

Вам нужно будет использовать EmailMessage объект напрямую.

Было бы также неплохо убрать форматирование электронной почты из вида. Я бы написал все что-нибудь более подобное:

from django.core.mail.message import EmailMessage
from django.conf import settings

class ContactsEmailMessage(EmailMessage):
    def __init__(self, sender, subject, message, cc_myself):
        super(ContactEmailMessage, self).__init__(
            subject=subject,
            body=self._get_message(self, sender, message),
            from=settings.DEFAULT_FROM_EMAIL,
            to=settings.CONTACT_RECIPIENTS,
            headers=self._get_headers(sender),
            cc=(sender, ) if cc_myself else None
        )

    def _format_message(self, sender, message):
        return "%s\n\n%s" % (sender, message)

    def _get_headers(self, sender):
        return {
            'reply-to': sender
        }

Теперь вы можете написать чистый и удобный для чтения вид:

from myproject.mail.message import ContactsEmailMessage, BadHeaderError
from django.core.exceptions import SuspiciousOperation

def contact(request):
    ...
    form = ContactForm(request.POST or None)    
    if form.is_valid(): # All validation rules pass
        try:
            message = ContactsEmailMessage(**form.cleaned_data)
            message.send()
        except BadHeaderError:
            # django will raise this error if user will try to pass suspicious new-line
            # characters to "sender" or other fields. This is safe-guard from
            # header injections
            raise SuspiciousOperation()

        return redirect('/thanks/')
    ...
0 голосов
/ 10 марта 2011

Я хотел бы уточнить, что у получателя формы (contact@shantiyoga.ca) нет возможности получить контактную форму из значения поля электронной почты (введено пользователем).Оно всегда будет отправлено по электронной почте с проверкой подлинности в мой файл settings.py, который на данный момент является моим личным адресом электронной почты?

Вы устанавливаете отправителя письма на sender, но используете EMAIL_HOST,правильный?В этом случае будьте осторожны, чтобы ваша учетная запись SMTP позволяла отправлять электронную почту от пользователей, не являющихся вашим доменом.Обычно, если у вас есть аутентифицированная учетная запись на этом сервере, вы можете установить в поле From: все, что захотите.

Короче говоря, это письмо попадет в ваш почтовый ящик, который выглядит какsender переменная.Поэтому, когда вы нажмете кнопку «Ответить», вы сможете отправить их обратно по электронной почте, и я думаю, что вы хотите.Однако оно будет отправлено с использованием SMTP-сервера, данные аутентификации которого вы предоставляете.Существует разрыв между возможностью отправки электронной почты (SMTP) и возможностью ее получения, что, по-моему, привело вас в замешательство.

Я никогда не пробовал этого, но для добавления дополнительных заголовков я считаю, что вам нужноиспользовать объект EmailMessage .Согласно документам, вы бы:

e = EmailMessage(headers={'Reply-To':...
e.send()

Будьте осторожны при этом;в частности, будьте осторожны, чтобы исключить новые строки в ответе на поле .Я не знаю, будут ли это делать методы по умолчанию clean.

Наконец, в вашем django / python нет ничего плохого.Единственное, что я хотел бы сказать для осознания, это не использовать это:

return redirect('/thanks/')

, а вместо этого:

return HttpResponseRedirect(reverse('myapp.views.method',args=tuple,kwargs=dict))

Это дает вам возможность не жестко кодировать URL-адреса вваше приложение.Метод reverse будет искать их по сравнению с urls.py для вас, так что вы можете перемещать приложение / менять URL-адреса, и оно все равно будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...