In this post I want to talk about how can we send emails using Django and Gmail, I read a lot of articles about this but none of them is working for me, this is my way of doing this
Setup Django π
first let's install django
pip install django
start a django project
django-admin startproject send_gmail
start a django app
cd send_gmail
python manage.py startapp send
add the app to settings.py installed app
# send_gmail/settings.py
INSTALLED_APPS = [
...
send,
]
migrate and create a super user
python manage.py migrate
python manage.py createsuperuser
check this post if you want to know more about how to create a virtual environment , or how to install Django and start your project
The Gmail part β
now you need to create a Gmail account and then click on Manage your google account
now click on the Security tab
make sure to enable two steps verification
now click on App passwords
you have to type your password again
click on select app choose *** other (Custome Name) *** and give a name to you app
the last step click on generate and Gmail will generate a key or an app password make sure to copy this key or save it in a text file
Edit your settings.py file
#gmail_send/settings.py
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'yoorusername@gmail.com'
EMAIL_HOST_PASSWORD = 'key' #past the key or password app here
EMAIL_PORT = 587
EMAIL_USE_TLS = True
DEFAULT_FROM_EMAIL = 'default from email'
ππ now you are ready to send emails with Django and Gmail in productionππ
For further exploration
you can use SendGrid, Mailgun, Sendinblue... for your apps too
don't forget to put your key in a .env file
Top comments (25)
I do it a bit differently: I run PostFix on my servers, which is configured to use an external SMTP server as forwarder (can be GMail, SES, ...). Then I let my app deliver to my local SMTP server.
This has a few advantages:
If you do it within the Django app, I would suggest to add some message queue stuff (Celery) so SMTP calls don't block your app, or retry in case of failure.
that's great thank you will try to implement this
Great post! Adding on to your note RE further exploration. For projects that outgrow sending email via a single Gmail account, check out github.com/anymail/django-anymail. After playing with a few packages to interact with Mandrill/Sendgrid/SES, I've found Anymail to be the most flexible.
thank you I didn't know about django-anymail i think that I will use it with my next project
Hello,
I want to send email contact with django,
But after all config in settings.py, I am facing this issue:
SMTPSenderRefused at /contacts
(530, b'5.7.0 Must issue a STARTTLS command first. m42-20020a05600c3b2a00b003cf47556f21sm7462655wms.2 - gsmtp', 'webmaster@localhost')
Can anyone help me?
Here is my settings.py
And my sending email view.py
why it doesn't work for me?
can you tell me what is the problem that your facing exactly so maybe I can help you
Much appreciated, thank you.
thank you ? π€
thanks, bro
Should this work properly and don't cause any problems if I send 30 emails per day?
yes, you can send up to 2000 mails per day
Thank you for your reply.
I used it to send emails from the website to users, but it stopped working, (it works if I try to send from my PC, but doesn't work from the server)
Hello, thanks for sharing your knowledge, I have a question, I have a contact form, I am using a gmail account to send, but I want the email of the person who writes to appear as the sender and not my gmail account, it is can you do this?
why it doesnt work for me?
I did all the steps however when using send_mail() it returns 1 but I get no email in my inbox.
Some comments may only be visible to logged-in visitors. Sign in to view all comments.