13
votes

The app configuration used in a Flask Mail application (following Miguel Grinberg Flask developlemt book) :

app.config['MAIL_SERVER'] = 'smtp.googlemail.com'
app.config['MAIL_PORT'] = 587
app.config['MAIL_USE_TLS'] = True
app.config['MAIL_USERNAME'] = os.environ.get('MAIL_USERNAME')
app.config['MAIL_PASSWORD'] = os.environ.get('MAIL_PASSWORD')

The Mail Username and Password variables have been set correctly and rechecked. While trying to send a message using the following code,

from flask.ext.mail import Message
from hello import mail
msg = Message('test subject', sender='same as MAIL_USERNAME', recipients=['[email protected]'])
msg.body = 'text body'
msg.html = '<b>HTML</b> body'
with app.app_context():
    mail.send(msg)

While sending, the application is again and again resulting in the following error:

SMTPSenderRefused: (530, '5.5.1 Authentication Required. Learn more at\n5.5.1 http://support.google.com/mail/bin/answer.py?answer=14257 qb10sm6828974pbb.9 - gsmtp', u'configured MAIL_USERNAME')

Any workaround for the error?

4

4 Answers

8
votes

While digging into the issues faced, I rechecked the SMTP settings for Google,

Google SMTP settings

Changing the

app.config['MAIL_SERVER'] = 'smtp.googlemail.com'

to

app.config['MAIL_SERVER'] = 'smtp.gmail.com'

did the trick.

Also make sure that the full username is used as Gmail SMTP username, i.e., [email protected] as shown in the image above.

Hope this helps!!!

2
votes

You need to change your Google account settings. On this page, turn on the option to "Allow less secure apps".

As that page says:

Some apps and devices use less secure sign-in technology, which makes your account more vulnerable. You can turn off access for these apps, which we recommend, or turn on access if you want to use them despite the risks. Learn more

1
votes

I also followed this book and get the same problem, after some digging here and there, I found out the root cause of the problem. However, I am not sure whether it will be the same case for you or not.

app.config['MAIL_USERNAME'] = os.environ.get('MAIL_USERNAME')
app.config['MAIL_PASSWORD'] = os.environ.get('MAIL_PASSWORD')

As you can see your flask app gets the your email credentials through os.environ.get(), and if you set this environment variables temporarily in your system, in my case Mac OSX, after your terminal session they will be gone, so you need to set them again for the next time you enter the terminal, like below:

export MAIL_USERNAME=**YOUR EMAIL**
export PASSWORD=**YOUR PASSWORD**

I got this error because of this scenario, in order to set them permanently you need to include these variables into .bash_profile file in your home directory.

1
votes

Do these 2 things to resolve:

  1. Use this link and turn on 'Allow less secure apps'- https://myaccount.google.com/lesssecureapps

  2. Use hard-coded value for email and password and it worked fine. Simply in the file 'init.py', edit the following section:

Don't use os.environ.get

app.config['MAIL_USERNAME'] = '[email protected]'
app.config['MAIL_PASSWORD'] = 'yourpassword'