正确的联系表单技术?

问题描述:

我在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],如果用户决定自行抄送,则会将电子邮件副本发送给他们,也从我的个人电子邮件。

这不是很理想,我应该创建像[email protected]电子邮件我settings.py从发送电子邮件?

此外,headers = {'Reply-To': form.cleaned_data['sender']}似乎没有做任何事情,我似乎无法找到描述其正确用法的文档,有没有人有成功使用这种技术?

谢谢您的时间, 诺亚

我想澄清这是没有办法的形式接收方([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)) 

这给你不硬编码的网址到您的应用程序的能力。 reverse方法会从你的urls.py查找它们,所以你可以移动你的应用程序/更改URL,它仍然可以工作。

+0

没有必要剥去头值的新线,Django会上升BadHeaderError如果它遇到了新的问题。这是在文件中解释如何处理这个例外。在这种情况下,我倾向于提出SuspiciousOperation,并且不会打扰很多。 – Ski 2011-03-10 19:30:56

这里是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/') 
    ...