2013-08-20 8 views
9

Ich versuche, E-Mail von meiner django-basierten Website zu senden, aber ich habe ein Problem - SMTPServerDisconnected Verbindung unerwartet Meinen setting.py geschlossen:E-Mail über Zoho SMTP

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

ich verwende django 1.5. 1, Python 2.7.3. Jeder kann dieses Problem lösen?

Danke für Ihre Hilfe

Antwort

25

ich das gleiche Problem mit Verbindungs-Timeouts aufweist. Es scheint mir, dass es Probleme mit SSL-Sockets in der Standard-Django-SMTP-Bibliothek gibt. In der Entwicklungsversion von Django gibt es eine Option EMAIL_USE_SSL = True zu setzen, die die Verwendung einer impliziten TLS-Verbindung ermöglicht (im Gegensatz zu explizite, die von EMAIL_USE_TLS = True angegeben wird). Im Allgemeinen verwendet der erste (implizite) Port 465, während der zweite (explizit) Port 587 verwendet. Siehe Django docs - vergleichen Sie die Entwicklungsversion mit Version 1.5. Beachten Sie, dass die Option EMAIL_USE_SSL NICHT in 1.5 vorhanden ist.

So ist das Problem, dass Zoho's default SMTP server uses port 465 and requires SSL, aber die EMAIL_USE_TLS Option diese Anforderung nicht erfüllt. (Randbemerkung: Versuchen Sie vielleicht, diese Option auf False zu setzen? Ich habe das nicht versucht.) Wie auch immer, meine beste Vermutung ist, dass es sich um ein Django-spezifisches Problem handelt, das möglicherweise erst am 1.7. Behoben wird.

Wie für eine Lösung für Ihr Problem: Sie können definitiv auf Zoho SMTP-Server mit Python (2.7.1) smtplib zugreifen (siehe Skript unten). Also, wenn Sie eine leicht unelegante Reparatur wünschen, könnten Sie diesen Weg gehen. Ich habe das in Django 1.5.1 getestet und es funktioniert wie ein Zauber.

Hier ist der Stand-alone-Python-Skript (die für die Verwendung in einem Django-Projekt angepasst werden können):

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() 

Versuchen Sie prüfen, ob das obige Skript läuft mit Zoho Anmeldeinformationen, bevor sie in Ihr Webprojekt anschließen. Viel Glück!

+1

Diese Methode funktioniert für mich :) Wie sende ich HTML-Inhalt in Nachricht – ZenOut

+0

Funktioniert wie ein Charme. Zusatz: Wenn Sie E-Mails an mehr als eine Person senden möchten, ändern Sie zwei Zeilen: 'msg ['To'] = '[email protected]; u2 @ ex.com'' und' server.sendmail (sender, [' [email protected] ',' [email protected] '], msg.as_string()) ' –

+0

@ZenOut müssen Sie Multipart E-Mail verwenden .. see https://docs.python.org/2/library/ email-examples.html # id5 – Coderaemon

0

Try 1 anstelle von True:

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

alternativ einen alternativen Port versuchen:

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

Möglicherweise ist Ihre Back-End-E-Mail-Back-Mail-Klasse alt. Goto

Python/site-packages/django/core/mail/stmp.py

Datei und stellen Sie sicher, dass Sie USE_SSL als Option haben. Wenn nicht, ersetze einfach die ganze Datei durch eine solche. Bitte schön. Arbeitete für mich mit ZOHO.

stmp.py file

Excuse die schlechte Formatierung dieser Antwort, es ist mein erster Beitrag SO ...

4

Antwort B.Welsh ist das Problem nicht lösen, wenn Sie Fehlermeldungen per E-Mail erhalten möchten.

Also für alle, die es braucht:

Der Port für TLS Zoho des 587 als in ihrer SMTP Server Configuration Page definiert. Diese Seite weist auch darauf hin, dass Sie ein "Von" nicht anders als die E-Mail verwenden können, die Sie verwenden, andernfalls wird es nicht durchlaufen.

Es ist der Code, den Sie in settings.py müssen den Fehlerbericht per E-Mail Funktion zu erhalten:

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

ich einen Weg haben 1.6.8 mit django zu senden. Zuerst müssen Sie den im GitHub verfügbaren django-smtp-ssl installieren. Führen Sie den Code:

pip install django-smtp-ssl 

und fügen Sie folgendes zu Ihrem settings.py:

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

Siehe den Link https://github.com/bancek/django-smtp-ssl

11

In meinem Fall wurde ich empfangen, dass:

SMTPServerDisconnected: Connection unexpectedly closed 

mit diesen Einstellungen:

Nach server.set_debuglevel Einstellung (1), entdeckte ich, dass meine DEFAULT_FROM_EMAIL von EMAIL_HOST_USER anders war

DEFAULT_FROM_EMAIL = "[email protected]" 

Hinzufügen, dass das Problem behoben.

+1

Das hat mein Problem gelöst! –

+1

Das hat mein Problem auch gelöst – Godfrey

+1

@diofeher danke Mann! Das hat mein Problem auch gelöst!Du verdienst eine Umarmung, einen Kaffee, ein Bier oder sowas! – jfunez

0

SMTP-Konfigurationseinstellungen für Zoho Mail-- TLS verwenden Port 587 und für ssl 465. so Verwendung EMAIL_PORT = 587, wenn Sie verwenden EMAIL_USE_TLS = True

0

fand ich, dass Zoho kein Standard django.core.mail.send_mail mag Ansatz. Das Problem scheint mit dem Inhaltstyp zusammenzuhängen. Es gibt mehrere Möglichkeiten, wie Sie dies umgehen könnten. Mein Ansatz war, zu EmailMessage zu wechseln, das eine reichere Oberfläche hat und Ihnen erlaubt, den Inhaltstyp in einer Kopfzeile zu übergeben.

von diesem Wechsel:

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

dazu:

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() 

Andere Zoho Mail-Einstellungen:

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 

Dies löste meine Probleme mit Zoho Mail-Versand und ist kompatibel mit anderen Warteschlangen Plugins wie Django-Yubin.