Django Email sending SMTP Error, cant send a mail - python

I am trying to send email within my Django project:
# settings.py
EMAIL_HOST_USER = os.getenv('EMAIL_HOST_USER')
EMAIL_HOST_PASSWORD = os.getenv('EMAIL_HOST_PASSWORD')
EMAIL_PORT = 587
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_USE_TLS = True
def notify_user(email_address, subject='Subject', message='Some message!') -> None:
send_mail(
subject,
message,
settings.EMAIL_HOST_USER,
[email_address],
fail_silently=False
)
As I know I need to disable this option (Gmail Security), but Gmail don't let me do it.
As a result I got this error:
raise SMTPAuthenticationError(code, resp)
smtplib.SMTPAuthenticationError: (535, b'5.7.8 Username and Password not accepted. Learn more at\n5.7.8 https://support.google.com/mail/?p=BadCredentials f14-20020a056512360e00b00492bbf7db8asm320697lfs.85 - gsmtp')
What can I do? How to disable that option?

Google disabled/discontinued the Less Secure App feature as of May 30th, 2022.
As recommended by #MeL, you could use an alternative but you can still use Gmail to send emails using Django. You can read this blog Mail setup on django using Gmail to help with guiding the setup if you're unfamiliar with setting up Google App Passwords.
In addition to that, you'll need to do one last thing to activate the app password to be used by Django. You should visit the site https://accounts.google.com/DisplayUnlockCaptcha, select continue and you're all set.

Related

"Relay access denied" in django app using namecheap private email

So I have a Django app that sends confirmation emails to users who want to register their account. It looks something like this
views.py
def send_activation_email(user, request):
current_site = get_current_site(request)
email_subject = "Activation Email"
context = {"user": user,
"domain": current_site,
'uid': urlsafe_base64_encode(force_bytes(user.pk)),
'token': generate_token.make_token(user)
}
email_body = render_to_string('email/activate.html',context)
email = EmailMessage(subject=email_subject, body=email_body, from_email=settings.EMAIL_FROM_USER, to=[user.email])
email.send()
and with settings.py looking like this
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'mail.privateemail.com'
EMAIL_FROM_USER = 'verification#ianisdo.xyz'
EMAIL_HOST_PASSWORD = '[redacted]'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_USE_SSL = False
The problem is that, when I try to send a email when the user creates an account, I get this error
SMTPRecipientsRefused at /register/
{'ianis.donica#gmail.com': (554, b'5.7.1 <ianis.donica#gmail.com>: Relay access denied')}
What I know for sure is:
that it's not a problem with the private namecheap email, from which
I can still send emails just not from my website.
I also know the problem is not due to gmail not liking my email, as
the same error when the email is sent to a yahoo.com domain.
I also know that the issue is not with the settings.py not connecting
to the views.py
I also know that all the details are entered correctly
From my knowledge and talking to namecheap support, the issue is most likely caused by the header of the email but to my knowledge I can't seem to find anything wrong with it.
If someone is able to help me out, I would really appreciate it. I have had issues sending emails for about 9 days now
I think you need to add a value for EMAIL_HOST_USER in your settings.py. Without it, Django won't attempt to authenticate. Here's the relevant bit from the docs:
EMAIL_HOST_USER
Default: '' (Empty string)
Username to use for the SMTP server defined in EMAIL_HOST. If empty, Django won’t attempt authentication.
The username should match the password setting you're already providing (i.e., a valid namecheap private email account).

Sending Emails through Django is not working in Nov 2022

I have tried all the advice and guides already available but it is not working at any cost. Please refer below to know more.
Activated the 2-factor authentification required.
2-factor authentication activated
I generated the App password and used it correctly in the Django settings.py file. You can see there is an app password in the above image.
EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
EMAIL_HOST = "smtp.gmail.com"
EMAIL_USE_TLS = True
EMAIL_PORT = 587
EMAIL_HOST_USER = "xyz"
EMAIL_HOST_PASSWORD = "abc"`
And use the following code to send the email.
subject = "Email verification"
text = "Hi, This is the link to verify you registration email with our site {0}. Please paste the link to verify your account {0}/auth/verify/{1}/"
message = text.format(self.request.get_host(), self.token)
email_from = settings.EMAIL_HOST_USER
recipient_list = [self.request.data['email'],]
send_mail(subject, message, email_from, recipient_list)`
But still, I am getting the below error.
Error form smtp: smtplib.SMTPAuthenticationError: (535, b'5.7.8 Username and Password not accepted. Learn more at\n5.7.8 https://support.google.com/mail/?p=BadCredentials l9-20020a17090a150900b0020d48bc6661sm10003685pja.31 - gsmtp')
I have tried enabling less secure apps but it shows like this:
No change possible for less secure apps
I have also tried this link: https://accounts.google.com/DisplayUnlockCaptcha
enter image description here

Using Outlook SMTP server to send email through a contact form but unable to send as I need the server to be able to accept multiple "From" addresses

Currently using Django as the chosen framework for my project and I have implemented a contact form and my main goal is for users to complete the contact form and the admin of the site (me) get an email, which shows me the details of their enquiry.
I am trying to use the Outlook SMTP server and these are my current settings in settings.py:
EMAIL_HOST = 'smtp.office365.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = '<my_emailAddress>'
EMAIL_HOST_PASSWORD = os.environ.get('OUTLOOK_PASSWORD')
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
DEFAULT_FROM_EMAIL = '<my_emailAddress>'
However, whenever I complete the form and send the request to the server I am receiving the following error code:
(554, b'5.2.252 SendAsDenied; <my_emailAddress> not allowed to send as <inputtedForm_emailAddress>; STOREDRV.Submission.Exception:
SendAsDeniedException.MapiExceptionSendAsDenied; Failed to process message due to a permanent exception with message Cannot submit message.
I am looking for some help surrounding this issue - it would be greatly appreciated.
Recently I had same issue with Outlook.
Looks like Outlook is not accepting anymore sending emails from unsecure apps.
Your next alternative is to use gmail but first enable unsecure apps in gmail setting.
Everything should be the same, change only smtp to
​EMAIL_HOST=smtp.gmail.com

Python 3.6 Django Registration Redux SMTPAuthenticationError at /accounts/register/ [duplicate]

I am new in django and developing a web application using django. I have successfully set the Signup functionality using Userena in my web application and can Register as a user with Verification Email.
I can show you my SMTP settings in my settings.py file
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'raihncse#gmail.com'
DEFAULT_FROM_EMAIL = 'raihncse#gmail.com'
SERVER_EMAIL = 'raihncse#gmail.com'
EMAIL_HOST_PASSWORD = '**************'
everything was fine before i have changed my EMAIL_HOST_PASSWORD
Infact, for some reason I have to change the previous password of that SERVER_EMAIL(raihncse#gmail.com). I have already edit the EMAIL_HOST_PASSWORD according to the new SERVER_EMAIL password.
but now, if I want to register as a new user, I am facing the following error
SMTPAuthenticationError at /accounts/signup/
(534, '5.7.14 <https://accounts.google.com/ContinueSignIn?sarp=1&scc=1&plt=AKgnsbvNq\n5.7.14 S3l1pFXENupDa_SdPphNHrnzeLPUOyf6O0l1s31w7h_UARx11P89AxPeeZ6xBi2KeQRjsw\n5.7.14 nvpxZhPVv771W9ljEDyeWnqpqv3_nakuPo36BEl3IlYj9qVujNB5cm0TYFf9LQAxRjFdda\n5.7.14 xh-y5spA9zIQONDsvRRgN3e0DXoIkgxTO3Mu75IaACi-XlvFtFfPBiQ81gUrBZ_PhZsBmh\n5.7.14 ajsSf-flNEmoSydyOTNdmwdB0__8> Please log in via your web browser and\n5.7.14 then try again.\n5.7.14 Learn more at\n5.7.14 https://support.google.com/mail/bin/answer.py?answer=78754 40sm12125121qgi.47 - gsmtp')
A relatively recent change in Google's authentication system means you're going to have to "allow less secure app access" to your Google account, in order for this to work.
In your error, you are recommended to visit this link: https://support.google.com/mail/answer/78754
On that page:
Step #2 asks you to try Displaying an Unlock Captcha
Step #3 explains how to allow less secure app access. In summary:
Go to Allow less secure apps and choose "Allow" to let less secure apps access your Google account. We don't recommend this option because it may make it easier for someone to gain access to your account.
Recent security protocol of Google will not allow you to send messages through less secure apps.
So the fix is:
Turn ON less secure apps.
But only enabling this doesn't seem to work now. Google does not allow apps to send messages using your default gmail password. So to send messages you have to follow these two simple steps:
Turn ON two factor authentication of your gmail account. Link to turn it on.
Then create app password for your gmail account from Google. It will be a 16 digit code. Put it in settings.py or _credentials.py by: EMAIL_HOST_PASSWORD = 'sixt eend igit code' Link to know how to set up your application password for email
And BINGO! Problem will be solved.
Note: App password can only be created if you have enabled 2 factor authentication for your account.
For me, I did turn on the less secure app option even then I was getting SMTP error.This is how I solved it.
Go to https://accounts.google.com/DisplayUnlockCaptcha and allow access to your Google account by clicking on continue and then try resetting password again in Django.
This works for me:
Turn ON two factors authentication of your Gmail account.
Then create an app password for your Gmail account from Google. It will be a 16 digit code. Put it in settings.py or env.py by EMAIL_HOST_PASSWORD = 'sixteen-digit code you get from your Gmail' and remember to add them in Django config vars also
You need turn on support for less secure devices:
https://www.google.com/settings/security/lesssecureapps
If you are integrating with AWS, my suggestion is to use SES(simple Email Service). You can add and verify your email address in SES which wouldn't raise SMTPAuthenticationError.
I have followed this - https://medium.com/hackernoon/the-easiest-way-to-send-emails-with-django-using-ses-from-aws-62f3d3d33efd.
This worked for me:
I first created email_info.py in the same folder as settings.py:
from .email_info import *
EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'youremail#gmail.com'
EMAIL_HOST_PASSWORD = 'your_pass'
EMAIL_PORT = 587
Then in settings.py I added:
from .email_info import *
EMAIL_USE_TLS = EMAIL_USE_TLS
EMAIL_HOST = EMAIL_HOST
EMAIL_HOST_USER = EMAIL_HOST_USER
EMAIL_HOST_PASSWORD = EMAIL_HOST_PASSWORD
EMAIL_PORT = EMAIL_PORT
And finally in views.py:
from django.conf import settings
from django.core.mail import send_mail
send_mail(subject, message, from_email, to_list, fail_silently=Tre)
Here's a YouTube video that explains this process: https://www.youtube.com/watch?v=51mmqf5a0Ss
You can also generate a dedicated email password for Django application.
1- Please check this link https://support.google.com/accounts/answer/185839?co=GENIE.Platform%3DDesktop&hl=en
2- Open the 2 Step verification setting from GOOGLE ACCOUNT--> MANAGE YOUR ACCOUNT --> SECURITY ---> 2 STEP VERIFICATION
3- Third, create a dedicated pass for Django, it will be 16 characters.
4- You can find the django email settings below
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'your_account#gmail.com'
EMAIL_HOST_PASSWORD = '16characters password'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
Make sure the password in EMAIL_HOST_PASSWORD is the password that you can use to login to the gmail account in EMAIL_HOST_USER. To confirm that, go to gmail.com and login to the gmail account in EMAIL_HOST_USER using the password in EMAIL_HOST_PASSWORD. If it works in one go without any form of 2-step authentication, then you're set. Otherwise, allow less secure apps and disable display unlock captcha using the tutorials found in other answers. For me, doing both and most importantly, using the correct password worked for me.
How to get emails from Django or any library:
Notes
Note: If your account is using two step authentication it won't work.
First open an Incognito window with the account you want to send emails with.
Open Less secure apps
Then enable it
After that navigate to Unlock Captcha
Then enable it
After that fill the account email and password in the library which you are using
In Django:
EMAIL_HOST_USER is the email address. Ex: email#example.com
EMAIL_HOST_PASSWORD is the email password. Ex: smtpmessages.manager#2012
Run the program
First it will not work, To make it work open Gmail on the incognito window.
Then there will be an email from google saying that an app needs access to your google account
Open the email and click the link and select yes it was me
Then retry and it should work
Thank You!
For more info visit: Check Gmail through other email platforms
Turn ON two factors authentication of your Gmail account.
Generate App Password(You will get this option after Two factor authentication) >> select app >> select device (In my case App is Gmail and device is Windows Machine)
Copy the 16 digit password
Paste this password at EMAIL_HOST_PASSWORD = "(Paste password here)"
This is not exactly an answer to your question. But considering privacy and security of your google account, use Environment Variables in Advanced system settings. And access using "os.environ.get('Host_Email') and ('Host_Pass)" instead of putting your email and password in your code.
https://www.youtube.com/watch?v=IolxqkL7cD8
You need to use an app password to allow your app to access your google account. *You can see my answer explaining how to generate an app password.
Sign in with App Passwords:
An App Password is a 16-digit passcode that gives a less secure app or
device permission to access your Google Account. App Passwords can
only be used with accounts that have 2-Step Verification turned on.
So, your code with an app password of 16-digit passcode is something like below:
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'raihncse#gmail.com'
DEFAULT_FROM_EMAIL = 'raihncse#gmail.com'
SERVER_EMAIL = 'raihncse#gmail.com'
EMAIL_HOST_PASSWORD = 'xylnudjdiwpojwzm' # Here
In addition, google hasn't allowed your app to access your google account with username(email address) and password since May 30, 2022. So now, you need username(email address) and an app password to access your google account.
Less secure apps & your Google Account:
To help keep your account secure, from May 30, 2022, ​​Google no
longer supports the use of third-party apps or devices which ask you
to sign in to your Google Account using only your username and
password.
I think you need to turn on google less secure apps. Login to your account and go to less secure apps to change your setting. It is not good but you can try your code.
If you already have allowed access to less secure apps and still having problems go to your account >> login and security >> notifications and activity in your devices, and see if there is a device that tried to access and google denied it, allow that access.
Make sure that you have selected "Turn On" option in Allow less secure apps page (https://www.google.com/settings/security/lesssecureapps).
I suggest you to refresh the page once after selecting "Turn On" radio button. The radio button selection should not move "Turn Off"
Some how it is getting "Turn Off" automatically.

Django Email settings without using From Address

Here is my settings.py
EMAIL_USE_TLS = True
EMAIL_HOST = "smtp.gmail.com"
EMAIL_HOST_USER = "mygmail#gmail.com"
EMAIL_HOST_PASSWORD = "mypassword"
EMAIL_PORT = 587
and view.py code
From='someemail#mail.com'
send_mail(Subject,Message, From, [To])
every time when a mail is sent it shows mygmail#gmail.com ,but i need it show someemail#mail.com ,how to fix this??
Did you add your "someemail#mail.com" to your gmail account?
Google have a procedure to allow their SMTP to send email as an other, they require you can find a code they send to this given email.
Otherwise it's normal.
(Security way to avoid malicious users tu use google's SMTP to send email as "barack.obama#whitehouse.gov")
Google only allows you to send email from addresses you have registered on your Gmail account. So someemail#mail.com will not work unless that's a registered gmail account. Though I suspect you are trying to use it as mask from some user in your app to send mail as themselves.
An alternate way to do it is to use something other than Gmail (such as Mailgun, Sendgrid, etc). For best practices, send the email from a legitimate registered email address, but utilize the reply-to field for custom emails.

Categories