Flask-Mail не аутентифицируется с помощью пароля Gmail и приложения - PullRequest
0 голосов
/ 21 января 2019

Итак, я получаю сообщение об ошибке SMTPSenderRefused, когда пытаюсь использовать созданное мной колбу для отправки по электронной почте.Позвольте мне начать покупать, сказав, что это работало ранее, но теперь это прекратилось.Я в растерянности и потратил много часов на тестирование, настройку и чтение в Интернете, и НИЧЕГО не дало мне ответа.

Я продолжаю получать следующую ошибку.

[2019-01-21 03:07:51,954] ERROR in app: Exception on /register/ [POST]
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "MyFlaskApp.py", line 131, in register
    mail.send(msg)
  File "/usr/local/lib/python2.7/site-packages/flask_mail.py", line 492, in send
    message.send(connection)
  File "/usr/local/lib/python2.7/site-packages/flask_mail.py", line 427, in send
    connection.send(self)
  File "/usr/local/lib/python2.7/site-packages/flask_mail.py", line 192, in send
    message.rcpt_options)
  File "/usr/lib64/python2.7/smtplib.py", line 737, in sendmail
    raise SMTPSenderRefused(code, resp, from_addr)
SMTPSenderRefused: (530, '5.5.1 Authentication Required. Learn more at\n5.5.1  https://support.google.com/mail/?p=WantAuthError u186sm20332024pfu.51 - gsmtp', u'myemail@gmail.com')
IP.XX.XXX.XXX - - [21/Jan/2019 03:07:51] "POST /register/ HTTP/1.1" 500 -

Мой аккаунт Gmailнастраивается с помощью двухэтапной проверки, а затем пароля приложения, которое использует это приложение Flask.Я перепробовал каждую комбинацию, и она все равно не сработает.Это мой код, который я использую.

app = Flask(__name__, static_url_path='/static')
app.config.update(
  DEBUG = False,
  MAIL_SERVER = 'smtp.gmail.com',
  MAIL_PORT = 465,
  MAIL_USE_SSL = True,
  MAIL_USERNAME = 'myemail@gmail.com',
  MAIL_DEFAULT_SENDER = 'myemail@gmail.com',
  MAIL_PASSWORD = 'GmailApplicationPassword',
  )
mail = Mail(app)

Строки для фактической отправки сообщения (внутри POST):

    msg = Message("Welcome",
      sender = 'myemail@gmail.com',
      recipients = [request.form["email"]])
    msg.body = "Welcome! \n\n Congratulations on your successful registration. \n\n Cheers!"
    mail.send(msg)

Некоторая дополнительная информация, которая может оказаться полезной.Этот точный код работал, когда я запускал свое приложение локально.Затем я развернул свой код на своем экземпляре AWS EC2 и заставил его работать там.Это работало, пока я не сделал следующее.

Я связал Elastic IP-адрес с сайтом, а затем направил свой DNS на этот IPv4.Я также добавил общедоступный сертификат AWS.

Может кто-нибудь помочь мне понять, почему я не могу отправлять электронные письма.Я перепробовал все, что я могу найти в качестве решения в Интернете.

Дополнительные сведения:

$ pip freeze
Flask-Mail==0.9.1

Заранее спасибо, и я помогу предоставить любые ответы, если понадобятся дополнительные разъяснения, поэтому, пожалуйста, спросите.

1 Ответ

0 голосов
/ 18 июня 2019

Это решение, которое я нашел, работает лучше всего. (я не говорю, что это лучший метод, но он работает) Он предполагает использование нескольких различных ключевых концепций, которые я бы настоятельно рекомендовал использовать.Он включает в себя использование секретов, за которыми вы можете следовать этому руководству здесь для получения дополнительной информации по этому вопросу (поскольку это не суть этого вопроса, я оставлю здесь только ссылку).Также требовалось использовать Boto3, чтобы иметь возможность читать переменные.Здесь будет полезна документация AWS, поэтому я опять не включаю ее.

Мой метод состоял в том, чтобы настроить AWS Simple Email Service (SES).Это делает его таким, что приложение, использующее Flask-Mail, получает доступ к AWS SES для отправки электронной почты, которая затем обращается к gmail для фактической отправки электронной почты.Несколько важных замечаний здесь о том, что SES есть не в каждом регионе, но в настоящее время (июнь 2019 года) не требуется, чтобы ваш экземпляр EC2 размещался в том же регионе, в котором вы используете SES. Кроме того, есливы хотите иметь возможность отправлять электронные письма на внешние адреса, которые вы ДОЛЖНЫ гарантировать, что у вас настроен почтовый ящик в соответствии с условиями использования AWS, а не их нарушение.И, наконец, если вы находитесь на бесплатном уровне, вы должны отправить заявку в службу поддержки, чтобы получить повышение ставки, и это также позволит вам отправлять электронные письма извне.Теперь вот фрагмент кода, который я использую:

app = Flask(__name__, static_url_path='/static')
app.config.update(
  DEBUG = False,
  MAIL_SERVER = params.getParameter("SES_SERVER"),
  MAIL_PORT = 587,
  MAIL_USE_TLS = True,
  MAIL_USERNAME = params.getParameter("SES_USERNAME"),
  MAIL_PASSWORD = params.getParameter("SES_PASSWORD"),
  )
mail = Mail(app)

Код отправки остается неизменным.Мне нужно было добавить импорт для Boto3, и я создал новый файл с именем params.py, где я создал свой метод getParameter для доступа к переменным.Если вы хотите, вы можете жестко запрограммировать приведенные выше значения, но я бы не рекомендовал это делать, особенно если вы храните свой код в облачном хранилище.

Я не уверен на 100%, но подозреваю, что gmail запрещает IP-адресу или домену доступ AWS к своим серверам, и поэтому вы не можете отправлять электронную почту.Это мое подозрение, но я не смог найти способ доказать это.

...