最近在加緊學習python2.7+django1.2,作業系統使用的是ubutntu11.
而且充分利用了SAESina AppEngine)幾乎免費的雲端服務,還可以更好的實踐在生產環境的效果。
新浪SAE的python環境的詳細情況,可以參看:SAE Python 開發人員手冊。
今天學到了發送郵件這一課。剛開始沒有使用sae的郵件服務,直接使用django.core.mail.send_mail函數。
首先在settings.py檔案中設定如下
- # email function, email notification
- EMAIL_ADMIN="jorden008@gmail.com"
-
- EMAIL_USE_TLS=True #是否需要傳輸層安全
- EMAIL_HOST="smtp.gmail.com" #發送郵件的主機地址
- EMAIL_PORT=587#25#465 #連接埠
- EMAIL_HOST_USER="jorden008@gmail.com" #驗證帳號
- EMAIL_HOST_PASSWORD ="login_password"#驗證密碼
- DEFAULT_FROM_EMAIL="jorden008@gmail.com"#預設的from地址
準備使用gmail作為郵件發送代理,設定了host等資訊。
在代碼中按照下面的格式寫即可
- from django.core.mail import send_mail
-
- mail_body=" %s posted a new comment on the entry %s." % (comment.name, comment.content_object)
-
- def send_mail('new comment posted', mail_body, settings.EMAIL_HOST_USER, [settings.EMAIL_ADMIN],
- fail_silently=False):
可是就是現實失敗,幾次嘗試都沒有成功,上網搜尋了一些資料也未果。
然後開啟django shell,嘗試在shell中發送。
進入程式根目錄,啟動shell
- python manage.py shell
進入shell之後,鍵入下面的代碼
- from django.core.mail import send_mail
- send_mail('title','content','jorden008@163.com',['jorden008@163.com'])
還是報錯,提示我應該使用application-specific passwords,還給出一個地址,我開啟看完之後,恍然大悟,也想起來了,之前進行android開發也遇到過類似情況,是google的設定,使用代碼或者是第三方工具利用gmail作為代理髮郵件的話,不能使用gmail的登入密碼,需要申請一個臨時密碼,然後使用臨時密碼發送,這個臨時密碼是在google的使用者後台介面產生了,還可以隨時手動收回這個密碼,這樣加強了對於登入密碼的保護,其實有點像是oauth的token,或者是令牌,會失效的,可以收回。詳細情況參看http://support.google.com/accounts/bin/answer.py?hl=en&answer=185833。
於是我通過上面的網址進入下面的頁面
650) this.width=650;" border="0" alt="" src="http://www.bkjia.com/uploads/allimg/131228/134523G49-0.png" />
點擊紅框中的連結,登入之後,在頁面下部的name輸入框中輸入一個字串,沒有特殊要求,可以理解為這個臨時密碼的範圍,點擊generate password】,將出現的密碼替換settings.py中密碼項。重新進入shell,再次嘗試發送郵件,這回成功了,返回了1,返回1表示發送成功,可以到郵箱裡面查看了。
可是我的網頁還是沒有發送成功,我就開啟SAE Python 開發人員手冊,看看有沒有什麼主意的地方,看到有一頁叫做可用的服務列表】,寫到了郵件服務,我就用sae的send_mail替換了django.core.mail.send_mail。代碼更正為下面的部分。
需要去掉django.core.mail.send_mail的引用,添加sae.mail.send_mail的引用。
- from sae.mail import send_mail
-
- mail_body=" %s posted a new comment on the entry %s." % (comment.name, comment.content_object)
-
- send_mail(settings.EMAIL_ADMIN,"new comment posted",mail_body ,
- (settings.EMAIL_HOST,settings.EMAIL_PORT,settings.EMAIL_HOST_USER,settings.EMAIL_HOST_PASSWORD,settings.EMAIL_USE_TLS)
- )
在此開啟網頁,點擊發送郵件,一切ok了。
總結
搞定了,有幾個問題需要大家注意:
1.使用gmail發送郵件,其中的驗證用的密碼不能使用google的登陸密碼,使用第三方經過gmail發郵件,需要使用application
specification password,具體的設定和說明,可以參看http://support.google.com/accounts/bin/answer.py?hl=en&answer=185833
2.使用國內的郵件供應商例如:新浪,163,qq等),直接使用郵箱登陸密碼驗證就可以發送。
3.我是在sae的環境中測試發送郵件,這時候,不能使用django.core.mail.send_mail函數,需要使用sae的
sae.mail.send_mail。詳情可以參看http://appstack.sinaapp.com/static/doc/release/testing/service.html#mail
本文出自 “突破中的IT結構師” 部落格,請務必保留此出處http://virusswb.blog.51cto.com/115214/788482