2013-08-20 53 views
9

發送電子郵件我想從我的基於Django的網站發送電子郵件,但我得到了一些問題 - SMTPServerDisconnected連接意外關閉 我setting.py:通過Zoho的SMTP

EMAIL_USE_TLS = True 
EMAIL_HOST = 'smtp.zoho.com' 
EMAIL_PORT = 465 
EMAIL_HOST_USER = '[email protected]' 
EMAIL_HOST_PASSWORD = 'XXXXXX' 

我使用Django 1.5。 1,python 2.7.3。任何人都可以解決此問題?

感謝您的幫助

回答

25

我在與連接超時了同樣的問題。在我看來,默認的Django SMTP庫中的SSL套接字存在問題。在Django的開發版本中,有一個選項可以設置EMAIL_USE_SSL = True,它允許使用隱含的 TLS連接(與顯式相反,其由EMAIL_USE_TLS = True指定)。通常,前者(隱式)使用端口465,而後者(顯式)使用端口587.請參閱Django docs - 將開發版本與版本1.5進行比較。請注意,選項EMAIL_USE_SSL不在1.5中。

因此,問題是Zoho's default SMTP server uses port 465 and requires SSL,但EMAIL_USE_TLS選項不符合此要求。 (注意:也許嘗試將此選項設置爲False?我沒有嘗試過)。無論如何,我最好的猜測是這是一個Django特定的問題,直到1.7才能解決。

至於你的問題的解決方案:你可以肯定地訪問Zoho的SMTP服務器與Python(2.7.1)的smtplib(見下面的腳本)。所以,如果你想要一個稍微不雅的修復,你可以走這條路。我已經在Django 1.5.1中測試了它,它的功能就像一個魅力。

這裏的獨立Python腳本(這可以在Django項目進行調整使用):

import smtplib 
from email.mime.text import MIMEText 

# Define to/from 
sender = '[email protected]' 
recipient = '[email protected]' 

# Create message 
msg = MIMEText("Message text") 
msg['Subject'] = "Sent from python" 
msg['From'] = sender 
msg['To'] = recipient 

# Create server object with SSL option 
server = smtplib.SMTP_SSL('smtp.zoho.com', 465) 

# Perform operations via server 
server.login('[email protected]', 'password') 
server.sendmail(sender, [recipient], msg.as_string()) 
server.quit() 

嘗試檢查上面的腳本插入到您的Web項目之前,你的Zoho的憑據運行。祝你好運!

+1

這種方法對我有用:)如何發送郵件中的html內容 – ZenOut

+0

工程就像一個魅力。另外:如果你想發送電子郵件給不止一個人,改變兩行:'msg ['To'] ='[email protected]; u2 @ ex.com''和'server.sendmail(sender,[' [email protected]','[email protected]'],msg.as_string())' –

+0

@ZenOut你將不得不使用Multipart電子郵件..見https://docs.python.org/2/library/ email-examples.html#id5 – Coderaemon

0

嘗試1而不是真:

EMAIL_USE_TLS = 1 
EMAIL_PORT = 465 
EMAIL_HOST = 'smtp.zoho.com' 
EMAIL_HOST_USER = '[email protected]' 
EMAIL_HOST_PASSWORD = 'XXXXXX' 

或者嘗試一個備用端口:

EMAIL_USE_TLS = 1 
EMAIL_PORT = 587 
EMAIL_HOST = 'smtp.zoho.com' 
EMAIL_HOST_USER = '[email protected]' 
EMAIL_HOST_PASSWORD = 'XXXXXX' 
0

您的stmp電子郵件後端類可能已舊。轉到

蟒蛇/站點包/ Django的/核心/郵件/ stmp.py

文件,並確保你有USE_SSL作爲一個選項。如果沒有,只需用一個替換整個文件即可。幹得好。爲ZOHO工作。

stmp.py file

辯解的反應不佳格式,它以SO ...

4

B.Welsh的回答不一樣,如果你想獲得通過電子郵件的錯誤報告解決這個問題我的第一個貢獻。

所以的人誰需要它:

對百會的TLS的端口是587在他們的SMTP Server Configuration Page定義。 該頁面還指出,您不能使用與您使用的電子郵件不同的「發件人」,否則將不會通過。

有你在settings.py需要通過電子郵件獲得工作的錯誤報告的代碼:我有一個辦法使用Django 1.6.8送

DEBUG = False 
TEMPLATE_DEBUG = DEBUG 
ADMINS = (('Yourname', '[email protected]'),) 
SERVER_EMAIL = constants.SENDER_EMAIL 

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' 
EMAIL_HOST = 'smtp.zoho.com' 
EMAIL_PORT = 587 
EMAIL_USE_TLS = True 
EMAIL_HOST_USER = constants.SENDER_EMAIL 
EMAIL_HOST_PASSWORD = constants.EMAIL_PASSWORD 
1

。首先,您必須安裝GitHub中提供的django-smtp-ssl。運行代碼:

pip install django-smtp-ssl 

,並添加以下到您的settings.py:

EMAIL_BACKEND = 'django_smtp_ssl.SSLEmailBackend' 
EMAIL_HOST = 'mail.example.com' 
EMAIL_PORT = 465 

見鏈接https://github.com/bancek/django-smtp-ssl

11

在我來說,我是接收:

SMTPServerDisconnected: Connection unexpectedly closed 

與這些設置:

EMAIL_PORT = 465 
EMAIL_BACKEND = 'django_smtp_ssl.SSLEmailBackend' 
EMAIL_USE_SSL = True 
EMAIL_HOST = 'smtp.zoho.com' 
EMAIL_HOST_USER = '[email protected]' 
EMAIL_HOST_PASSWORD = 'password' 

設置server.set_debuglevel(1)後,我發現我的DEFAULT_FROM_EMAIL從EMAIL_HOST_USER

DEFAULT_FROM_EMAIL = "[email protected]" 

並稱,解決了這一問題是不同的。

+1

這解決了我的問題! –

+1

這也解決了我的問題 – Godfrey

+1

@diofeher謝謝你!這也解決了我的問題!你應該擁有一個擁抱,咖啡,啤酒或其他東西! – jfunez

0

對Zoho的郵件的SMTP配置設置 - TLS使用端口587和SSL 465所以 使用EMAIL_PORT = 587如果使用EMAIL_USE_TLS =真

0

我發現,百會不喜歡一個標準django.core.mail.send_mail做法。該問題似乎與內容類型有關。有很多方法可以解決這個問題,我的方法是切換到EmailMessage,它具有更豐富的接口,並允許您將Content-type傳遞到標題中。

從這個開關:

from django.core import mail 
mail.send_mail(subject='Hello', 
       message='Body goes here', 
       from_email='[email protected]', 
       recipient_list=['[email protected]']) 

這樣:

from django.core.mail import EmailMessage 
email = EmailMessage(
    subject='Hello', 
    body='Body goes here', 
    from_email='[email protected]', 
    to=['[email protected]'], 
    reply_to=['[email protected]'], 
    headers={'Content-Type': 'text/plain'}, 
) 
email.send() 

其他Zoho的郵件設置:

EMAIL_HOST = 'smtp.zoho.com' 
EMAIL_HOST_USER = '[email protected]' 
EMAIL_HOST_PASSWORD = 'password' 
EMAIL_PORT = 587 
EMAIL_USE_TLS = True 
EMAIL_USE_SSL = False 

這解決了我使用Zoho郵件發送的問題,並與其他兼容排隊像django-yubin這樣的插件。