前提:配置settings.py
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_USE_TLS = False EMAIL_HOST = 'smtp.126.com' # 主機 EMAIL_PORT = 25 # 端口 EMAIL_HOST_USER = 'xxxxxxxxx@126.com' # 發件人郵箱 EMAIL_HOST_PASSWORD = 'xxxxxxx' # 密碼 DEFAULT_FROM_EMAIL = 'mail@126.com' # 發件人
1.forms.py
from django import forms class ContactForm(forms.Form): subject = forms.CharField()
from_email = forms.EmailField() # 發件方 to_email = forms.EmailField() # 收件方 message = forms.CharField()
對應的url模式為:
url(r'^contact/$', contact)
對應的表單樣式為:

在上圖中收件方利用qq郵箱失敗,但可以利用126和outlook郵箱。
2.views.py
from django.core.mail import send_mail from django.shortcuts import render_to_response from contact.forms import ContactForm from django.http import HttpResponseRedirect, HttpResponse from django.template import RequestContext def contact(request): if request.method == 'POST': form = ContactForm(request.POST) if form.is_valid(): cd = form.cleaned_data send_mail( # 調用django庫中的send_main函數 cd['subject'], # 主題 cd['message'], # 內容 cd.get('from_email'), # 發件人
[cd.get('to_email')] # 收件人列表
) return HttpResponseRedirect('/contact/thanks/') # 發送成功則重定向到thanks頁面 else: form = ContactForm() # 失敗則為空表單 return render_to_response('contact_form.html', {'form': form}, context_instance=RequestContext(request)) # 發送失敗則返回表單頁面 def thanks(request): html = "<html><body><strong>Thanks</body></html>" # 簡單的頁面顯示Thanks
return HttpResponse(html)
url(r'^contact/thanks/$', thanks)為感謝頁面url
3.contact_form.html
<html>
<head>
<title>Contact us</title>
</head>
<body>
<h1>Contact us</h1><form action="" method="post"> {% csrf_token %} <table> {{ form.as_table }} </table>
<input type="submit" value="Submit">
</form>
</body>
</html>
4.發送結果


5.流程解釋
首先訪問contact/時,urls將其指向views.py中的contact函數(由語句url(r'^contact/$', contact))實現。
因為此時沒有提交任何東西,所以語句 request.method=='POST'不成立,直接執行 form = ContactForm()語句,並返回 contact_form.html頁面。
此時填寫好表單提交后,若數據合法則送郵件,然后執行語句重定向到 /contact/thanks 網頁。若數據不合法,則在contact_form.html頁面上保留有填好的錯誤表單,並有錯誤提示(見下圖)。