正确的联系表单技术?
我在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,它仍然可以工作。
这里是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/')
...
没有必要剥去头值的新线,Django会上升BadHeaderError如果它遇到了新的问题。这是在文件中解释如何处理这个例外。在这种情况下,我倾向于提出SuspiciousOperation,并且不会打扰很多。 – Ski 2011-03-10 19:30:56