2017-09-26 69 views
1

我想通過gmail使用django發送郵件。通過gmail在django發送郵件時出錯

以下是我的settings.py代碼:

EMAIL_HOST = 'smtp.gmail.com' 
EMAIL_PORT = 587 
EMAIL_HOST_USER = '[email protected]' 
EMAIL_HOST_PASSWORD = 'mypassword' 
EMAIL_USE_TLS = True 

view.py我使用的方法send_mail():

send_mail(subject, contact_message, emailfrom, emailto) 

當我在我的接觸形式&執行代碼&輸入詳細點擊提交。 我得到以下錯誤:

smtplib.SMTPNotSupportedError: STARTTLS extension not supported by server.  

請建議!

+0

的[Django的1.8發送電子郵件使用Gmail SMTP(https://stackoverflow.com/questions/31324005/django-1-8-sending-mail-using-gmail-smtp) – Sraw

+0

在可能的複製上述線程問題與SMTPAuthenticationError有關,並且我有SMTPNotSupportedError:服務器不支持STARTTLS擴展。兩者都不同。 –

+0

如果您閱讀第一個答案,則解決方案可能相同。是啊,所以應該提供一個像「答案已經存在」的標誌。 – Sraw

回答

0

我不知道Gmail,也不知道Django,但我希望下面的解釋能幫助你。

一個快速分析表明你的情況有點奇怪。有一種簡單的方法來測試SMTP服務器提供的功能/擴展:獲取命令行telnet客戶端,連接到有問題的服務器並查詢其功能。下面顯示了這是如何在Linux下完成,但它基本上是相同的Windows:

[email protected]:~# telnet smtp.gmail.com 587    <-- Type this on the command line 
Trying 74.125.71.109...        <-- This is output 
Connected to gmail-smtp-msa.l.google.com.   <-- This is output 
Escape character is '^]'.       <-- This is output 
220 smtp.gmail.com ESMTP s196sm2489285wmb.6 - gsmtp <-- This is output 
EHLO localhost.com         <-- **YOU** must type this 
250-smtp.gmail.com at your service, [46.83.27.246] <-- The following lines are output 
250-SIZE 35882577 
250-8BITMIME 
250-STARTTLS           <-- NOTE THIS LINE 
250-ENHANCEDSTATUSCODES 
250-PIPELINING 
250-CHUNKING 
250 SMTPUTF8 

這裏的關鍵點是第二個命令行參數的telnet命令中指定要使用的端口,EHLO命令你輸入(確保你確實鍵入了EHLO而不是HELO這是另一個命令)。

從示例中可以看出,smtp.gmail.com明確支持STARTTLS命令/擴展。我已經在正常的環境中測試過了;我的Linux機器在NAT路由器後面,這是私人家庭和小公司的常用設置。沒有端口轉發或其他特殊配置。

所以我建議的第一件事就是你在你的地方重複這個簡單的測試。然後,

  • 如果你得到了相同的結果,我,尤其是如果你得到的輸出也包含行250-STARTTLS,也絕對沒有解釋這裏發生了什麼,除了在Django本身的錯誤。你使用的是最新版本嗎?我在這裏幫不了你,因爲我從來沒有用過它,而且我也不知道它。

  • 如果行250-STARTTLS而不是在你得到的輸出中,一些完全不可思議的事情必須繼續。正如我的示例所示,STARTTLS至少對於我的地方的客戶端是受支持的,並且沒有理由不支持您所在地的客戶端。

  • 例外情況可能是中國或其他政府試圖阻止使用加密的國家。所以我可以想象,當來自這樣的國家的客戶連接時,Google會根據地理封鎖關閉STARTTLS擴展程序。但我真的不知道!鼓勵人們發表評論...

  • 也許您正在使用代理來干擾您的客戶端(Django)和SMTP服務器之間的通信。

我你還沒有發現這個問題,你可以做到以下幾點:

  • 你可以嘗試,而不是端口587端口25。我已驗證smtp.gmail.com支持STARTTLS端口25以及。對於大多數電子郵件客戶端,使用端口25或端口587並不重要。你應該能夠通過在你的配置文件中使用EMAIL_PORT = 25來使Django使用端口25

  • 您可以嘗試使用隱式TLS(通常稱爲SSL)而不是顯式STARTTLS。通常用於此的端口是465。要實現這一點,請在配置文件中說明EMAIL_PORT = 465,EMAIL_USE_TLS = FalseEMAIL_USE_SSL = True

+0

謝謝Binarus。您的建議使用 EMAIL_PORT = 465, EMAIL_USE_TLS = False和 EMAIL_USE_SSL = True已經工作。 –