28👍
I’m having the same problem with connection timeouts. It seems to me that there are issues around SSL sockets in the default Django SMTP library. In the development version of Django there is an option to set EMAIL_USE_SSL = True
which allows for the use of an implicit TLS connection (as opposed to explicit, which is specified by EMAIL_USE_TLS = True
). Generally the former (implicit) uses port 465, while the latter (explicit) uses port 587. See the Django docs — compare the development version with version 1.5. Note that the option EMAIL_USE_SSL
is NOT present in 1.5.
Thus, the problem is that Zoho’s default SMTP server uses port 465 and requires SSL, but the EMAIL_USE_TLS
option doesn’t fulfill this requirement. (Side note: maybe try setting this option to False
? I didn’t try that.) Anyway, my best guess is that this is a Django-specific issue and may not be solved until 1.7.
As for a solution to your problem: you can definitely access Zoho’s SMTP server with Python (2.7.1)’s smtplib
(see script below). So, if you want a slightly inelegant fix, you could go that route. I’ve tested this in Django 1.5.1 and it works like a charm.
Here’s the stand-alone Python script (which can be adapted for use in a Django project):
import smtplib
from email.mime.text import MIMEText
# Define to/from
sender = 'sender@example.com'
recipient = 'recipient@example.com'
# 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('sender@example.com', 'password')
server.sendmail(sender, [recipient], msg.as_string())
server.quit()
Try checking that the above script runs with your Zoho credentials before plugging it into your web project. Good luck!
14👍
In my case I was receiving that:
SMTPServerDisconnected: Connection unexpectedly closed
with these settings:
EMAIL_PORT = 465
EMAIL_BACKEND = 'django_smtp_ssl.SSLEmailBackend'
EMAIL_USE_SSL = True
EMAIL_HOST = 'smtp.zoho.com'
EMAIL_HOST_USER = 'dio@streetbarz.com'
EMAIL_HOST_PASSWORD = 'password'
After setting server.set_debuglevel(1), I discovered that my DEFAULT_FROM_EMAIL was different from EMAIL_HOST_USER
DEFAULT_FROM_EMAIL = "dio@streetbarz.com"
Adding that fixed the problem.
4👍
B.Welsh’s answer doesn’t solve the problem if you want to get error reports by email.
So for anyone who needs it:
The port for Zoho’s TLS is 587 as defined in their SMTP Server Configuration Page .
That page also points out that you can’t use a “from” different than the email you’re using, otherwise it won’t go through.
There’s the code you need in settings.py
to get the error report by email working:
DEBUG = False
TEMPLATE_DEBUG = DEBUG
ADMINS = (('Yourname', 'youremail@yourdomain.com'),)
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
- Unable to encode/decode pprint output
- SAML with Django authentication
- Verbose name for @property
- Add help_text for search field in admin.py
1👍
I’ve got a way to send using django 1.6.8. First, you have to install the django-smtp-ssl available in the GitHub. Run the code:
pip install django-smtp-ssl
and add following to your settings.py:
EMAIL_BACKEND = 'django_smtp_ssl.SSLEmailBackend'
EMAIL_HOST = 'mail.example.com'
EMAIL_PORT = 465
See the link https://github.com/bancek/django-smtp-ssl
1👍
SMTP Configuration settings for Zoho Mail – TLS use port 587 and for ssl 465. so
useEMAIL_PORT = 587
if you use EMAIL_USE_TLS = True
1👍
I found that Zoho does not like a standard django.core.mail.send_mail approach. The issue appears to be related to the Content-type. There are multiple ways you could work around this, my approach was to switch to EmailMessage which has a richer interface and allows you to pass the Content-type in a header.
Switching from this:
from django.core import mail
mail.send_mail(subject='Hello',
message='Body goes here',
from_email='user@example.com',
recipient_list=['user@example.com'])
to this:
from django.core.mail import EmailMessage
email = EmailMessage(
subject='Hello',
body='Body goes here',
from_email='user@example.com',
to=['user@example.com'],
reply_to=['user@example.com'],
headers={'Content-Type': 'text/plain'},
)
email.send()
Other Zoho mail settings:
EMAIL_HOST = 'smtp.zoho.com'
EMAIL_HOST_USER = 'user@example.com'
EMAIL_HOST_PASSWORD = 'password'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_USE_SSL = False
This solved my issues with Zoho mail sending and is compatible with other queuing plugins like django-yubin.
1👍
A little bit unrelated to the question, but please note that Zoho Mail does not offer IMAP/POP support anymore with their free plan. Hopefully, I can save some of you debugging time with this post.
```
FREE PLAN
Up to 25 Users
5GB* /User, 25MB Attachment Limit
Webmail access only+. Single domain hosting.
```
+IMAP/POP Support Available exclusively with the paid plans.
https://www.zoho.com/workplace/pricing.html?src=zmail
Old free plans (registered before 2018???) seem to still have IMAP/POP Support Available
Source: https://help.zoho.com/portal/community/topic/zoho-free-tier-pop-imap-activesync-no-longer-free
- Uwsgi segmentation fault when serving a django application
- Django template for loop
- Docker Django 404 for web static files, but fine for admin static files
- Django – Is storing objects in session a good practice?
1👍
According to the discussion on this link, we also need to check the correct smtp url.
In my case i was using smtp.zoho.com, however the correct choice was smtp.zoho.in. Hope that helps. You can find that after logging in to zoho and checking the domain url.
- Iphone push notifications passphrase issue (pyAPns)
- CheckBox Input Validation in Django
- Google oAuth 2.0 API Authentication Error: Error 400 – redirect_uri_mismatch (does not comply with policy) DJANGO APP
- Good tool for automatic setup and deployment of Django projects
- Extending User object in Django: User model inheritance or use UserProfile?
0👍
Try 1 instead of True:
EMAIL_USE_TLS = 1
EMAIL_PORT = 465
EMAIL_HOST = 'smtp.zoho.com'
EMAIL_HOST_USER = 'me@mydomain.com'
EMAIL_HOST_PASSWORD = 'XXXXXX'
alternatively try an alternate port:
EMAIL_USE_TLS = 1
EMAIL_PORT = 587
EMAIL_HOST = 'smtp.zoho.com'
EMAIL_HOST_USER = 'me@mydomain.com'
EMAIL_HOST_PASSWORD = 'XXXXXX'
- How do I write a single-file Django application?
- How do I get django runserver to show me DeprecationWarnings and other useful messages?
- Django-allauth retrieve avatar profile pictures
- Django – Loading Many-To-Many relationship admin page is so slow
- Use javascript variable in django template
0👍
Your stmp email backend class might be old. Goto
python/site-packages/django/core/mail/stmp.py
file and make sure you have USE_SSL as an option. If not, simply replace the whole file with one that does. Here you go. Worked for me with ZOHO.
Excuse the poor formatting of this response, it’s my first contribution to SO…
- How to delete nested session data in Django?
- What's the best way to use CoffeeScript with Django if you're developing on Windows?
- Django test runner fails in virtualenv on Ubuntu
- Django queryset for many-to-many field
- Regular expression in URL for Django slug