2011-03-10 5 views
2

У меня есть контактная форма на 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 = ['[email protected]'] 

     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 не совсем подходят для табака, поэтому, пожалуйста, несите меня, если я пройду через это в основном.

Я хотел бы уточнить, что для получателя формы ([email protected]) нет способа получить форму контакта из значения поля электронной почты (введенный пользователем). Он всегда будет отправлен аутентифицированным письмом в мои settings.py, который на данный момент является моим личным адресом электронной почты?

Пользователь заполняет форму контакта и отправляет отправление, электронное письмо отправляется на адрес [email protected] из моего личного адреса электронной почты, и если пользователь решает сам cc, копия электронной почты отправляется им, также из моего личного письма.

Это не идеальное решение. Должен ли я создать электронное письмо, например [email protected], для моих настроек.py для отправки электронной почты?

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

ответ

0

Я хотел бы уточнить, что нет никакого способа для вида получателя ([email protected]), чтобы получить контактную форму от значения по электронной почте поле (введен пользователь). Он всегда будет отправлен аутентифицированным письмом в мои settings.py, который на данный момент является моим личным адресом электронной почты?

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

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

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

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

Будьте осторожны; в частности, be careful to strip out newlines in the reply to field. Я не знаю, выполнили бы это по умолчанию методы clean.

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

return redirect('/thanks/') 

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

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

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

+0

Там нет необходимости раздеваться новые строки из значений заголовка, Джанго будет расти BadHeaderError если он встречает новые линии. В документации объясняется, как следует обрабатывать исключение. В таких случаях я склонен повышать SuspiciousOperation и не беспокоить много. – Ski

0

Вот подпись send_mail из django documentation:

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/') 
    ... 
Смежные вопросы