Django sending email

58,549

Solution 1

Are you trying to use a gmail account? Maybe try this then:

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

Then try test (django < 1.4) by

python manage.py shell
>>> from django.core.mail import send_mail
>>> send_mail('test email', 'hello world', to=['[email protected]'])

And if you use django 1.4 use this:

python manage.py shell
>>> from django.core.mail import send_mail
>>> send_mail('test email', 'hello world', '[email protected]', ['[email protected]'])

If you're not using a gmail account and still getting problems then just try add the EMAIL_HOST_USER and EMAIL_HOST_PASSWORD to what you have. If you still have issues maybe your network is blocking you. Firewalls on your OS or router.

Thanks to knite for the updated syntax. Throw him a +1 and thanks to pranavk for letting me know about the syntax change in django 1.4

Solution 2

First Create an Application specific password

  1. Visit your Google Account security page. And Click 2-step verification: enter image description here

  1. Click App passwords at Google Account security page: enter image description here

  1. Create an App, select Mail and give a name: enter image description here

  1. Note down the App Password: enter image description here

Then add the appropriate values to settings.py:

EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = '[email protected]'
EMAIL_HOST_PASSWORD = 'Application spectific password(for eg: smbumqjiurmqrywn)'
EMAIL_PORT = 587
EMAIL_USE_TLS = True

You can use the shell to test it:

python manage.py shell
>>> from django.core.mail import send_mail
>>> send_mail('Test', 'This is a test', '[email protected]', ['[email protected]'],
     fail_silently=False)

Solution 3

@mongoose_za has a great answer, but the syntax is a bit different in Django 1.4+.

Instead of:

send_mail('test email', 'hello world', to=['[email protected]'])

use

send_mail('test email', 'hello world', '[email protected]', ['[email protected]'])

The first four arguments are required: subject, message, from_email, and recipient_list.

Solution 4

  1. Enable pop3 in gmail settings.
  2. create application specific password for this django application. (http://support.google.com/accounts/bin/answer.py?hl=en&answer=185833)

Solution 5

I would avoid using GMail. It will work for a few emails, but after that, you may find that all your emails are being rejected or spam-canned. I used Amazon's "SES" service with Django-SES to solve this.

Share:
58,549
Luke
Author by

Luke

I'm a Rails developer and love using coffeescript, angularjs, handlebars, etc. with my apps! I've also built a social network with Django.

Updated on January 28, 2022

Comments

  • Luke
    Luke about 2 years

    I know there are 20 questions similar to mine but I've tried for over a day now to get email to work with Django.

    I'm getting this error: [Errno 111] Connection refused when I attempt to send an email

    This is where I create the email and attempt to send it in my view:

    try:
        msg = EmailMessage(subject, message, from_email, [receiver])
        msg.content_subtype = "html"
        msg.send()
    

    My settings file is as follows:

    EMAIL_HOST = "localhost"
    DEFAULT_FROM_EMAIL = "[email protected]"
    EMAIL_PORT = 25
    EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
    

    I've tried doing test sending using python -m smtpd -n -c DebuggingServer localhost:1025 and had success, but when it comes down to doing it for real, no success.

    When I try doing a send_mail from the shell I get this traceback:

    >>> from django.core.mail import send_mail
    >>> send_mail('Test', 'Test', '[email protected]', ['[email protected]'])
    Traceback (most recent call last):
      File "<console>", line 1, in <module>
      File "/usr/local/lib/python2.6/dist-packages/django/core/mail/__init__.py", line 61, in send_mail
        connection=connection).send()
      File "/usr/local/lib/python2.6/dist-packages/django/core/mail/message.py", line 251, in send
        return self.get_connection(fail_silently).send_messages([self])
      File "/usr/local/lib/python2.6/dist-packages/django/core/mail/backends/smtp.py", line 79, in send_messages
        new_conn_created = self.open()
      File "/usr/local/lib/python2.6/dist-packages/django/core/mail/backends/smtp.py", line 42, in open
        local_hostname=DNS_NAME.get_fqdn())
      File "/usr/lib/python2.6/smtplib.py", line 239, in __init__
        (code, msg) = self.connect(host, port)
      File "/usr/lib/python2.6/smtplib.py", line 295, in connect
        self.sock = self._get_socket(host, port, self.timeout)
      File "/usr/lib/python2.6/smtplib.py", line 273, in _get_socket
        return socket.create_connection((port, host), timeout)
      File "/usr/lib/python2.6/socket.py", line 561, in create_connection
        raise error, msg
    error: [Errno 111] Connection refused
    

    I just don't seem to be getting anywhere with this. Any help or advice would be much appreciated. Thanks

    Also, if there is something else you'd like to see, just comment about it.

  • Luke
    Luke over 12 years
    I've been trying to send email through my local server. But going through gmail works too I guess. Thanks
  • Sam Stoelinga
    Sam Stoelinga about 12 years
    Recently started using SendGrid which is also a great service.
  • pranavk
    pranavk almost 12 years
    are you sure that EMAIL_HOST_USER includes gmail also, shouldn't it be just the 'username' ?
  • pranavk
    pranavk almost 12 years
    moreover, it seems that send_mail syntax has slightly changed now in the latest django version, now four arguments are expected instead of 3.
  • Ryan Jenkins
    Ryan Jenkins over 11 years
    @pranavk Yes, Google specifies that using your full email address (including the @gmail.com) is required, most likely because they serve other domains through their Apps program.
  • mariowise
    mariowise over 9 years
    It works from the shell, but when I use this code from view, It doesn't. Any ideas ??
  • toothie
    toothie over 9 years
    I have used postfix instead of sendmail and same settings as above, but, the email is not sent.
  • e18r
    e18r about 8 years
    @toothie I had the same problem until I realized I had not really installed postfix on my production server...
  • Julio Marins
    Julio Marins about 8 years
    for Digital ocean users, they blocks STMP ports by default stackoverflow.com/questions/27106336/…
  • randalv
    randalv almost 8 years
    Sadly, app-specific passwords do not appear to be available for Google for Business gmail accounts. I get this error when I attempt to go directly to the App specific passwords page (security.google.com/settings/u/3/security/apppasswords) : The setting you are looking for is not available for your account.
  • suhailvs
    suhailvs about 5 years
    here is updated doc