{"id":344387,"date":"2023-01-24T09:03:22","date_gmt":"2023-01-24T09:03:22","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=344387"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=344387","title":{"rendered":"<span>\u041a\u0430\u043a \u044f \u0443\u0447\u0438\u043b \u0410\u043b\u0438\u0441\u0443 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u043e\u0447\u0442\u0443<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0418\u0432\u0430\u043d \u0427\u0435\u0447\u0438\u043a\u043e\u0432, \u044f <a href=\"https:\/\/career.habr.com\/companies\/mts\/vacancies\">QA-lead \u0432 \u041c\u0422\u0421 Digital<\/a>, \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u043d\u0430\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u043e\u0432\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u00a0<a href=\"http:\/\/wasd.tv\/\"><u>WASD.TV<\/u><\/a>. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0441\u0432\u043e\u0435\u043c \u043f\u0435\u0442-\u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u043d\u0430\u0432\u044b\u043a\u0430 \u00ab\u0423\u043c\u043d\u044b\u0439 \u043f\u043e\u0447\u0442\u0430\u043b\u044c\u043e\u043d\u00bb \u0434\u043b\u044f \u0410\u043b\u0438\u0441\u044b, \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u0430 \u042f\u043d\u0434\u0435\u043a\u0441\u0430.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/0e7\/a35\/3d6\/0e7a353d6e2cd1a7236871a1405cee8c.jpg\" width=\"1920\" height=\"1080\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0e7\/a35\/3d6\/0e7a353d6e2cd1a7236871a1405cee8c.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<p><strong>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u0441\u0442\u043e\u0440\u0438\u0438:<\/strong><\/p>\n<p>\u0412 \u0434\u0435\u043a\u0430\u0431\u0440\u0435 \u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e \u0433\u043e\u0434\u0430 \u044f \u043f\u0440\u0438\u043e\u0431\u0440\u0435\u043b <a href=\"https:\/\/yandex.ru\/alice\/station-mini-new\">\u0443\u043c\u043d\u0443\u044e \u043a\u043e\u043b\u043e\u043d\u043a\u0443 \u042f\u043d\u0434\u0435\u043a\u0441\u0430<\/a>, \u0421\u0442\u0430\u043d\u0446\u0438\u044e \u041b\u0430\u0439\u0442. \u0415\u0449\u0435 \u043d\u0435 \u0443\u0441\u043f\u0435\u043b \u043d\u0430\u0441\u043b\u0430\u0434\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0438\u043e\u0431\u0440\u0435\u0442\u0435\u043d\u0438\u0435\u043c, \u0430 \u0443\u0436\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u043b, \u0447\u0442\u043e, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u0410\u043b\u0438\u0441\u0435 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442. \u041f\u043e\u0433\u0443\u0433\u043b\u0438\u043b \u0438 \u0443\u0437\u043d\u0430\u043b, \u0447\u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 <a href=\"https:\/\/dialogs.yandex.ru\/store\">\u0432\u0438\u0442\u0440\u0438\u043d\u0430 \u043d\u0430\u0432\u044b\u043a\u043e\u0432<\/a>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u2013 \u043d\u0430\u0432\u044b\u043a\u0438 \u0434\u043b\u044f \u0410\u043b\u0438\u0441\u044b, \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u044e\u0449\u0438\u0435 \u0435\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438. \u0418\u0434\u0435\u044f \u044d\u0442\u043e\u0439 \u0432\u0438\u0442\u0440\u0438\u043d\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043c\u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u0438 \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u043b\u044f \u043d\u0435\u0435 \u043d\u043e\u0432\u044b\u0439 \u043d\u0430\u0432\u044b\u043a. \u041c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043d\u0430\u0443\u0447\u0438\u0442\u044c \u0410\u043b\u0438\u0441\u0443 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u043e\u0447\u0442\u0443 \u043f\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0441 \u043a\u043e\u043b\u043e\u043d\u043a\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u043e \u0434\u0435\u0444\u043e\u043b\u0442\u0443 \u043e\u043d\u0430 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0443\u043c\u0435\u0435\u0442.<\/p>\n<blockquote>\n<p><em>\u041d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u044f \u043d\u0435 \u043d\u0430\u0448\u0435\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0430\u043d\u0430\u043b\u043e\u0433\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0447\u0430\u043b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441\u0432\u043e\u0435\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f.<\/em><\/p>\n<\/blockquote>\n<p>\u0418\u0442\u0430\u043a, \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0437\u0430\u0434\u0443\u043c\u043a\u0443, \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e: <\/p>\n<ul>\n<li>\n<p>\u043f\u043e\u0434\u043d\u044f\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430 Python \u0441 \u043f\u0440\u043e\u0431\u0440\u043e\u0441\u043e\u043c \u0445\u043e\u0441\u0442\u0430 \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443 \u0441 https;<\/p>\n<\/li>\n<li>\n<p>\u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u0432 <a href=\"https:\/\/mail.yandex.ru\/\">\u042f\u043d\u0434\u0435\u043a\u0441.\u041f\u043e\u0447\u0442\u0430<\/a> \u043f\u043e imap \u0438 smtp;<\/p>\n<\/li>\n<li>\n<p>\u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 <a href=\"https:\/\/oauth.yandex.ru\/\">\u042f\u043d\u0434\u0435\u043a\u0441 OAuth<\/a> \u0438 \u043d\u0430\u0432\u044b\u043a \u0432 <a href=\"https:\/\/dialogs.yandex.ru\/developer\/\">\u042f\u043d\u0434\u0435\u043a\u0441.\u0414\u0438\u0430\u043b\u043e\u0433\u0430\u0445<\/a>;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0434\u043b\u044f \u0410\u043b\u0438\u0441\u044b: \u043b\u043e\u0433\u0438\u043a\u0443 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u043e\u0432, \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0435\u043c\u044b \u0438 \u0442\u0435\u043a\u0441\u0442\u0430 \u043f\u0438\u0441\u044c\u043c\u0430, \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043f\u0438\u0441\u044c\u043c\u0430;<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b;<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 <a href=\"https:\/\/beget.com\/ru\">\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433<\/a>.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u0439\u0434\u0435\u043c \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443.<\/p>\n<p>\u042f \u0440\u0435\u0448\u0438\u043b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 <strong>python3.8<\/strong> \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0432\u0435\u0431 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 <strong>Bottle<\/strong>. \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u044f \u043f\u043e\u0434\u043d\u044f\u043b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043c\u0435\u0442\u043e\u0434 run.<\/p>\n<pre><code class=\"python\">from bottle import route, run  @route('\/') def index():     print(\"\u0422\u0435\u0441\u0442\")  run(host='127.0.0.1', port=8080)<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0431\u0440\u043e\u0441\u0438\u043b \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0445\u043e\u0441\u0442 \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/ngrok.com\/\">ngrok<\/a>. \u042d\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u0435\u0440\u0432\u0438\u0441. \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f, c\u043a\u0430\u0447\u0430\u0442\u044c zip-\u0430\u0440\u0445\u0438\u0432 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u044f\u0434 \u043a\u043e\u043c\u0430\u043d\u0434 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435:<\/p>\n<pre><code class=\"bash\">$ unzip \/path\/to\/ngrok.zip $ ngrok config add-authtoken {authtoken} $ ngrok http 8080<\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<figure class=\"bordered full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e1a\/582\/16c\/e1a58216ce8ee4fbb3cff011eda4ee2b.png\" width=\"1910\" height=\"538\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e1a\/582\/16c\/e1a58216ce8ee4fbb3cff011eda4ee2b.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0440\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 GET \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430 <a href=\"https:\/\/1cc0-213-24-134-136.eu.ngrok.io\">https:\/\/1cc0-213-24-134-136.eu.ngrok.io<\/a> \u0432\u0435\u0440\u043d\u0435\u0442\u0441\u044f 200 \u043a\u043e\u0434 \u043e\u0442\u0432\u0435\u0442\u0430 http.<\/p>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 \u042f\u043d\u0434\u0435\u043a\u0441.\u041f\u043e\u0447\u0442\u0430 \u043f\u043e imap \u0438 smtp. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0443\u0436\u043d\u043e \u0434\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u0432 \u0441\u0432\u043e\u0435\u0439 \u0443\u0447\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u043d\u0430 \u043a\u043e\u043d\u043d\u0435\u043a\u0442 \u043f\u043e imap \u0438 smtp.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/452\/51c\/65a\/45251c65a59ca4687be78f8ff5b156fa.png\" width=\"2750\" height=\"1546\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/452\/51c\/65a\/45251c65a59ca4687be78f8ff5b156fa.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0417\u0430\u0445\u043e\u0434\u0438\u043c \u0432 \u0441\u0432\u043e\u0439 \u0430\u043a\u043a\u0430\u0443\u043d\u0442 \u042f\u043d\u0434\u0435\u043a\u0441.\u041f\u043e\u0447\u0442\u0430. \u041f\u043e\u0447\u0442\u0430->\u0412\u0441\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/871\/75a\/0f1\/87175a0f164505a2742456e332cb4a52.png\" width=\"2252\" height=\"470\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/871\/75a\/0f1\/87175a0f164505a2742456e332cb4a52.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0421\u0442\u0430\u0432\u0438\u043c \u0433\u0430\u043b\u043e\u0447\u043a\u0443 \u043d\u0430\u043f\u0440\u043e\u0442\u0438\u0432 \u041f\u0430\u0440\u043e\u043b\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438 OAuth-\u0442\u043e\u043a\u0435\u043d\u044b. \u0413\u043e\u0442\u043e\u0432\u043e, \u0438\u0434\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<p>\u0423 \u042f\u043d\u0434\u0435\u043a\u0441\u0430 \u0435\u0441\u0442\u044c<a href=\"https:\/\/yandex.ru\/dev\/\"> API \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432<\/a>, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0435\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u043c\u0435\u0447\u0442\u044b \u0438 \u0438\u0434\u0435\u0438 \u0432 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u0414\u043b\u044f OAuth2-\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e imap \u0438 smtp \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0439 <a href=\"https:\/\/yandex.ru\/dev\/oauth\/doc\/imap\/index.html\">\u043c\u0430\u043d\u0443\u0430\u043b<\/a>. <a href=\"https:\/\/oauth.yandex.ru\/client\/new\/id\">\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435<\/a> \u0438 \u0438\u0437\u0443\u0447\u0430\u0435\u043c \u043c\u0430\u043d\u0443\u0430\u043b.<\/p>\n<p>\u0417\u0430\u0445\u043e\u0434\u0438\u043c \u0432 \u043d\u0430\u0448\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u042f\u043d\u0434\u0435\u043a\u0441.OAuth. \u0412 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c Callback URL \u2013<strong> <\/strong>\u0442\u0430\u043a\u0438\u0435, \u043a\u0430\u043a \u043d\u0430 \u0441\u043a\u0440\u0438\u043d\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/84c\/136\/269\/84c1362699740304494fd78de1d3061b.png\" alt=\"\" title=\"\" width=\"1482\" height=\"1218\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/84c\/136\/269\/84c1362699740304494fd78de1d3061b.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u043d\u0430\u0432\u044b\u043a\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u042f\u043d\u0434\u0435\u043a\u0441\u0430, \u043b\u0438\u0431\u043e \u0447\u0435\u0440\u0435\u0437 \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f: \u0432\u0435\u0440\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 -> access_token. \u041c\u043d\u0435 \u043d\u0435 \u0437\u0430\u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043f\u0438\u0441\u0430\u0442\u044c OAuth-\u0441\u0435\u0440\u0432\u0435\u0440, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0432\u044b\u0431\u0440\u0430\u043b \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u043f\u043e \u0441\u0443\u0442\u0438 \u0433\u043e\u0442\u043e\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u0442 \u0441\u0430\u043c\u043e\u0433\u043e \u042f\u043d\u0434\u0435\u043a\u0441\u0430. \u0415\u0441\u043b\u0438 \u043a\u0442\u043e-\u0442\u043e \u0432\u044b\u0431\u0435\u0440\u0435\u0442 \u0432\u0442\u043e\u0440\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u0442\u043e \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/yandex.ru\/dev\/direct\/doc\/examples-v5\/python3-requests-token.html\">\u0442\u0443\u0442<\/a> \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f OAuth-\u0442\u043e\u043a\u0435\u043da \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u043c \u043d\u0430 python.<\/p>\n<p>\u0414\u0430\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c API \u042f\u043d\u0434\u0435\u043a\u0441 ID \u0438 \u042f\u043d\u0434\u0435\u043a\u0441.\u041f\u043e\u0447\u0442\u0430:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a8d\/341\/259\/a8d341259d4df10bc152d34fedea330a.png\" width=\"1498\" height=\"674\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a8d\/341\/259\/a8d341259d4df10bc152d34fedea330a.png\"\/><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/eda\/563\/bec\/eda563bec8f11aca26e8075314a69a31.png\" alt=\"\" title=\"\" width=\"1510\" height=\"436\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/eda\/563\/bec\/eda563bec8f11aca26e8075314a69a31.png\"\/><figcaption><\/figcaption><\/figure>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043f\u043e imap<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">def get_email_address_list(access_token: str, sender_email: str) -> list:     try:         xoauth2_token = f\"user={sender_email}\\x01auth=Bearer {access_token}\\x01\\x01\"         imap = imaplib.IMAP4_SSL(host='imap.yandex.com')         imap.authenticate(\"XOAUTH2\", lambda x: xoauth2_token)         status, messages = imap.select(\"INBOX\")         messages = int(messages[0])         messages_count = 0         if messages >= 30:             messages_count = 30         elif messages &lt; 30:             messages_count = messages         while messages_count:             messages_count -= 1             res, msg = imap.fetch(str(messages - messages_count), \"(RFC822)\")             for response in msg:                 if isinstance(response, tuple):                     msg = email.message_from_bytes(response[1])                     sender_data = decode_header(msg.get(\"From\"))                     if len(sender_data) == 2:                         sender_name, encoding = sender_data[0]                         sender_email, type_email = sender_data[1]                         if isinstance(sender_name, bytes) and isinstance(sender_email, bytes):                             sender_name = sender_name.decode(encoding)                             sender_name = ''.join(sender_name.split()).lower()                             sender_email = sender_email.decode(encoding).replace(\"&lt;\", \"\") \\                                 .replace(\">\", \"\").replace(\" \", \"\")                             sender_email = sender_email.lower()                             email_address_list.append(sender_name + \":\" + sender_email)                                          imap.close()         imap.logout()              except Exception:         return []          return email_address_list<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u043f\u043e imap, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u043f\u0438\u0441\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 30, \u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043a\u043b\u0430\u0434\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u00ab\u0438\u043c\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f: \u0430\u0434\u0440\u0435\u0441 \u043f\u043e\u0447\u0442\u044b\u00bb. \u042f \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e \u043b\u0438\u043c\u0438\u0442 \u0432 30 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u0442\u0430\u043a \u043a\u0430\u043a \u0432\u0435\u0431\u0445\u0443\u043a \u0434\u043e\u043b\u0436\u0435\u043d \u0434\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u042f\u043d\u0434\u0435\u043a\u0441\u0430 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0438 3 \u0441\u0435\u043a\u0443\u043d\u0434, \u0438\u043d\u0430\u0447\u0435 \u0410\u043b\u0438\u0441\u0430 \u0432\u0435\u0440\u043d\u0435\u0442 \u043e\u0442\u0432\u0435\u0442, \u0447\u0442\u043e \u0432\u0435\u0431\u0445\u0443\u043a \u043d\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442. \u041a\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439, \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0435 \u0443\u0441\u043f\u0435\u0432\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u0431\u0440\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 30 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043e\u0442\u0432\u0435\u0442 \u0437\u0430 3 \u0441\u0435\u043a.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043f\u043e smtp<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">def get_email_data_list(email_data_str: str) -> list:     email_data_list = email_data_str.split(\"@\")     return email_data_list    def send_email(access_token: str, sender_email_name: str, sender_email: str, recipient_email_name: str,                recipient_email: str, subject: str, message: str) -> bool:     try:         just_a_str = f\"user={sender_email}\\x01auth=Bearer {access_token}\\x01\\x01\"         xoauth2_token = base64.b64encode(bytes(just_a_str, 'utf-8')).decode('utf-8')          sender_email_login = get_email_data_list(sender_email)[0]         sender_email_domain = get_email_data_list(sender_email)[1]         recipient_email_login = get_email_data_list(recipient_email)[0]         recipient_email_domain = get_email_data_list(recipient_email)[1]          msg = EmailMessage()         msg['Subject'] = subject         msg['From'] = Address(sender_email_name, sender_email_login, sender_email_domain)         msg['To'] = Address(recipient_email_name, recipient_email_login, recipient_email_domain)         msg.set_content(message)          smtp = smtplib.SMTP_SSL(host='smtp.yandex.ru', port=465)         smtp.connect(host='smtp.yandex.ru', port=465)         smtp.docmd(\"auth\", f\"XOAUTH2 {xoauth2_token}\")         smtp.sendmail(sender_email, recipient_email, msg.as_string())         smtp.quit()     except Exception:         return False          return True<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u043e smtp, \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0442\u0435\u043c\u0443 \u043f\u0438\u0441\u044c\u043c\u0430, email \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f, email \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f \u0438 \u0442\u0435\u043a\u0441\u0442. \u0424\u0443\u043d\u043a\u0446\u0438\u044f send_email \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0438\u0441\u044c\u043c\u043e \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 True, \u0435\u0441\u043b\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u043d\u0430, \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u043d\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 False.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u0430\u0432\u044b\u043a \u0432 \u042f\u043d\u0434\u0435\u043a\u0441.\u0414\u0438\u0430\u043b\u043e\u0433\u0430\u0445.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b29\/df9\/17d\/b29df917dfbfa9911288ecf48505268d.png\" width=\"1796\" height=\"1252\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b29\/df9\/17d\/b29df917dfbfa9911288ecf48505268d.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u0438\u0430\u043b\u043e\u0433.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/877\/098\/b68\/877098b6807cc9abfc95676d75dc4de3.png\" width=\"1776\" height=\"710\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/877\/098\/b68\/877098b6807cc9abfc95676d75dc4de3.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u041d\u0430\u0432\u044b\u043a \u0432 \u0410\u043b\u0438\u0441\u0435<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/be9\/fb6\/80c\/be9fb680cdf38a37a39405afa306f4f0.png\" width=\"1486\" height=\"1736\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/be9\/fb6\/80c\/be9fb680cdf38a37a39405afa306f4f0.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043f\u043e\u043b\u044f. \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0418\u043c\u044f \u043d\u0430\u0432\u044b\u043a\u0430, Webhook URL, \u0422\u0438\u043f \u0434\u043e\u0441\u0442\u0443\u043f\u0430.<\/p>\n<p>Webhook URL \u2013 \u044d\u0442\u043e \u043d\u0430\u0448 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440, \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043d\u0430 ngrok. \u0421 \u043d\u0435\u0433\u043e \u0431\u0443\u0434\u0443\u0442 \u0441\u043b\u0430\u0442\u044c\u0441\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a \u0410\u043b\u0438\u0441\u0435. \u0422\u0438\u043f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u044f \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u043c.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cbc\/73a\/ab7\/cbc73aab7f98119e30711b14f08a3ceb.png\" width=\"1720\" height=\"1100\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/cbc\/73a\/ab7\/cbc73aab7f98119e30711b14f08a3ceb.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0412 \u0441\u0432\u044f\u0437\u043a\u0435 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u043e\u0432 \u043d\u0430\u0434\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0441\u0435\u043a\u0440\u0435\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u2013 \u044d\u0442\u043e ClientID \u0438 Client secret \u0432 \u042f\u043d\u0434\u0435\u043a\u0441.OAuth.<\/p>\n<p>URL \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438, URL \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u043e\u043a\u0435\u043d\u0430 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0442\u0430\u043a\u0436\u0435, \u043a\u0430\u043a \u043d\u0430 \u0441\u043a\u0440\u0438\u043d\u0435. \u042d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0443\u0436\u043d\u044b, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u043c\u043e\u0433 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u0440\u0432\u0438\u0441 \u042f\u043d\u0434\u0435\u043a\u0441\u0430 \u0432 \u043d\u0430\u0432\u044b\u043a\u0435 \u0438 \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u043c\u043e\u0433\u043b\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c access_token \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0435\u0439 \u043b\u043e\u0433\u0438\u043a\u0438.<\/p>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0434\u043b\u044f \u0410\u043b\u0438\u0441\u044b.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434 \u0444\u0430\u0439\u043b\u0430 app.py<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">from bottle import request, post, default_app from mail_tools import get_sender_email_data, send_email, get_recipient_email_text, get_email_obj_text, \\     get_email_address_list import json import re  response_texts  = [] response_ttss = []   @post('\/') def work():     try:         response = {             \"version\": request.json[\"version\"],             \"session\": request.json[\"session\"],             \"response\": {                 \"end_session\": False             }         }         req = request.json          if req[\"session\"][\"new\"] or req[\"request\"][\"original_utterance\"].lower().strip() in [\"\u043f\u0440\u0438\u0432\u0435\u0442\", \"\u0445\u0430\u0439\", \"\u0434\u0430\u0440\u043e\u0432\u0430\",                                                                                              \"\u043a\u0443\",                                                                                              \"\u0434\u0430\u0440\u043e\u0432\", \"\u0437\u0434\u0430\u0440\u043e\u0432\u0430\",                                                                                              \"hello\", \"hi\"]:             response[\"response\"][\"text\"] = \"\u041f\u0440\u0438\u0432\u0435\u0442, \u043d\u0430\u0432\u044b\u043a \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u043e\u0447\u0442\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0443\u043c\u043d\u043e\u0433\u043e \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u0430.\" \\                                            \"\u0427\u0442\u043e\u0431\u044b \u043d\u0430\u0447\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u044c\u0442\u0435 '\u0441\u0442\u0430\u0440\u0442'. \u0414\u043b\u044f \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u043d\u0430\u0432\u044b\u043a\u0430 \" \\                                            \"\u043e\u0442\u0432\u0435\u0442\u044c\u0442\u0435 '\u043f\u043e\u043a\u0430' \u0438\u043b\u0438 '\u0441\u0442\u043e\u043f'.\"             response[\"response\"][\"tts\"] = \"\u041f\u0440\u0438\u0432+\u0435\u0442, \u043d+\u0430\u0432\u044b\u043a \u043f\u043e\u0437\u0432\u043e\u043b+\u044f\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b+\u044f\u0442\u044c \u043f+\u043e\u0447\u0442\u0443 \u0441 \u043f+\u043e\u043c\u043e\u0449\u044c\u044e \u0443\u043c\u043d\u043e\u0433\u043e \u0430\u0441\u0441\u0438\u0441\u0442+\u0435\u043d\u0442\u0430. \" \\                                           \"\u0427\u0442+\u043e\u0431\u044b \u043d\u0430\u0447+\u0430\u0442\u044c \u043e\u0442\u0432+\u0435\u0442\u044c\u0442\u0435 \u0441\u0442\u0430\u0440\u0442. \u0414\u043b\u044f \u0432+\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u043d+\u0430\u0432\u044b\u043a\u0430 \" \\                                           \"\u043e\u0442\u0432+\u0435\u0442\u044c\u0442\u0435 \u043f\u043e\u043a+\u0430 \u0438\u043b\u0438 \u0441\u0442\u043e\u043f. \"             response_texts.append(response[\"response\"][\"text\"])             response_ttss.append(response[\"response\"][\"tts\"])         else:             try:                 if req[\"request\"][\"original_utterance\"].lower().strip() in [\"\u0441\u0442\u043e\u043f\", \"\u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0438\",                                                                             \"\u043d\u0435 \u043d\u0430\u0434\u043e\", \"\u0432\u0441\u0435\", \"\u0445\u0432\u0430\u0442\u0438\u0442\",                                                                             \"\u043f\u043e\u043a\u0430\", \"\u0434\u043e \u0441\u0432\u0438\u0434\u0430\u043d\u0438\u044f\", \"\u043a\u043e\u043d\u0435\u0446\",                                                                             \"\u043d\u0435\u0442\", \"\u043e\u0442\u0431\u043e\u0439\", \"\u0445\u0432\u0430\u0442\u0438\u0442\"]:                      response[\"response\"][\"text\"] = \"\u0412\u0441\u0435\u0433\u043e \u0445\u043e\u0440\u043e\u0448\u0435\u0433\u043e, \u0434\u043e \u0441\u0432\u0438\u0434\u0430\u043d\u0438\u044f!\"                     response[\"response\"][\"tts\"] = \"\u0412\u0441\u0435\u0433+\u043e \u0445\u043e\u0440+\u043e\u0448\u0435\u0433\u043e, \u0434\u043e \u0441\u0432\u0438\u0434+\u0430\u043d\u0438\u044f!\"                     response_texts.append(response[\"response\"][\"text\"])                     response_ttss.append(response[\"response\"][\"tts\"])                     response[\"response\"][\"end_session\"] = True                 elif req[\"session\"][\"user\"][\"access_token\"]:                     response[\"response\"][\"text\"] = response_texts[len(response_texts) - 1]                     response[\"response\"][\"tts\"] = response_ttss[len(response_ttss) - 1]                     if req[\"request\"][\"original_utterance\"].lower().strip() == \"\u043f\u043e\u043c\u043e\u0449\u044c\":                         response[\"response\"][\"text\"] = \"\u041f\u0440\u0438\u0432\u0435\u0442, \u043d\u0430\u0432\u044b\u043a \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u043e\u0447\u0442\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0443\u043c\u043d\u043e\u0433\u043e \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u0430. \" \\                                                        \"\u0427\u0442\u043e\u0431\u044b \u043d\u0430\u0447\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u044c\u0442\u0435 '\u0441\u0442\u0430\u0440\u0442'. \u0414\u043b\u044f \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u043d\u0430\u0432\u044b\u043a\u0430 \" \\                                                        \"\u043e\u0442\u0432\u0435\u0442\u044c\u0442\u0435 '\u043f\u043e\u043a\u0430' \u0438\u043b\u0438 '\u0441\u0442\u043e\u043f'.\"                         response[\"response\"][\"tts\"] = \"\u041f\u0440\u0438\u0432+\u0435\u0442, \u043d+\u0430\u0432\u044b\u043a \u043f\u043e\u0437\u0432\u043e\u043b+\u044f\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b+\u044f\u0442\u044c \u043f+\u043e\u0447\u0442\u0443 \" \\                                                       \"\u0441 \u043f+\u043e\u043c\u043e\u0449\u044c\u044e \u0443\u043c\u043d\u043e\u0433\u043e \u0430\u0441\u0441\u0438\u0441\u0442+\u0435\u043d\u0442\u0430. \u0427\u0442+\u043e\u0431\u044b \u043d\u0430\u0447+\u0430\u0442\u044c \u043e\u0442\u0432+\u0435\u0442\u044c\u0442\u0435 \u0441\u0442\u0430\u0440\u0442. \" \\                                                       \"\u0414\u043b\u044f \u0432+\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u043d+\u0430\u0432\u044b\u043a\u0430 \u043e\u0442\u0432+\u0435\u0442\u044c\u0442\u0435 \u043f\u043e\u043a+\u0430 \u0438\u043b\u0438 \u0441\u0442\u043e\u043f.\"                         response_texts.append(response[\"response\"][\"text\"])                         response_ttss.append(response[\"response\"][\"tts\"])                     else:                          if req[\"request\"][\"original_utterance\"].lower().strip().strip() == \"\u0441\u0442\u0430\u0440\u0442\":                             global access_token                             access_token = req[\"session\"][\"user\"][\"access_token\"]                             if get_sender_email_data(access_token):                                 global sender_email_name                                 sender_email_name = get_sender_email_data(access_token)[0]                                 global sender_email                                 sender_email = get_sender_email_data(access_token)[1]                                 response[\"response\"][\"text\"] = f\"{sender_email_name}, \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0432\u0430\u0448\u0435\u0433\u043e email \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430. \" \\                                                               f\"\u0427\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c, \u043e\u0442\u0432\u0435\u0442\u044c\u0442\u0435, '\u0441\u043f\u0438\u0441\u043e\u043a \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u043e\u0432'.\"                                  response[\"response\"][\"tts\"] = f\"{sender_email_name}, \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a+\u0430\u0446\u0438\u044f \u0432+\u0430\u0448\u0435\u0433\u043e email \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d+\u0430. \" \\                                                               f\"\u0427\u0442+\u043e\u0431\u044b \u043f\u0440\u043e\u0434+\u043e\u043b\u0436\u0438\u0442\u044c \u043e\u0442\u0432+\u0435\u0442\u044c\u0442\u0435 \u0441\u043f+\u0438\u0441\u043e\u043a \u043a\u043e\u043d\u0442+\u0430\u043a\u0442\u043e\u0432.\"                                 response_texts.append(response[\"response\"][\"text\"])                                 response_ttss.append(response[\"response\"][\"tts\"])                             else:                                 response[\"response\"][\"text\"] = \"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0432\u0430\u0448\u0438 \u043f\u043e\u0447\u0442\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435. \u0415\u0441\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \" \\                                                                \"\u043d\u0430\u0447\u043d\u0438\u0442\u0435 \u0441\u043d\u0430\u0447\u0430\u043b\u0430. \u041e\u0442\u0432\u0435\u0442\u044c\u0442\u0435 '\u0441\u0442\u0430\u0440\u0442' \u0438\u043b\u0438 '\u043f\u043e\u043c\u043e\u0449\u044c'.\"                                  response[\"response\"][\"tts\"] = \"\u041d\u0435 \u0443\u0434\u0430\u043b+\u043e\u0441\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b+\u0438\u0442\u044c \u0432+\u0430\u0448\u0438 \u043f\u043e\u0447\u0442+\u043e\u0432\u044b\u0435 \u0434+\u0430\u043d\u043d\u044b\u0435. \" \\                                                               \"\u0415\u0441\u0442\u044c \u043f\u0440\u043e\u0431\u043b+\u0435\u043c\u0430, \u043d\u0430\u0447\u043d+\u0438\u0442\u0435 \u0441\u043d\u0430\u0447+\u0430\u043b\u0430. \" \\                                                               \"\u041e\u0442\u0432+\u0435\u0442\u044c\u0442\u0435 \u0441\u0442\u0430\u0440\u0442 \u0438\u043b\u0438 \u043f+\u043e\u043c\u043e\u0449\u044c.\"                                 response_texts.append(response[\"response\"][\"text\"])                                 response_ttss.append(response[\"response\"][\"tts\"])                          elif req[\"request\"][\"original_utterance\"].lower().strip() == \"\u0441\u043f\u0438\u0441\u043e\u043a \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u043e\u0432\":                             global email_address_list                             email_address_list = get_email_address_list(access_token, sender_email)                             if email_address_list:                                 response[\"response\"][\"text\"] = \"\u0421\u043f\u0438\u0441\u043e\u043a \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u043e\u0432 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d. \" \\                                                                \"\u042f \u043c\u043e\u0433\u0443 \u043d\u0430\u0447\u0430\u0442\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0438\u0441\u044c\u043c\u043e. \u041a\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c? \" \\                                                                \"\u041d\u0430\u0437\u043e\u0432\u0438\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f, \u043e\u0442\u0432\u0435\u0442\u0438\u0432 '\u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c', \" \\                                                                \"\u0430 \u0434\u0430\u043b\u044c\u0448\u0435 \u043d\u0430\u0437\u043e\u0432\u0438\u0442\u0435 \u0435\u0433\u043e \u0438\u043c\u044f \u0438 \u0444\u0430\u043c\u0438\u043b\u0438\u044e, \" \\                                                                \"\u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0444\u0438\u0437. \u043b\u0438\u0446\u043e, \" \\                                                                \"\u0438\u043b\u0438 \u0436\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u044e\u0440. \u043b\u0438\u0446\u043e.\"                                  response[\"response\"][\"tts\"] = \"\u0421\u043f+\u0438\u0441\u043e\u043a \u043a\u043e\u043d\u0442+\u0430\u043a\u0442\u043e\u0432 \u0441\u0444\u043e\u0440\u043c\u0438\u0440+\u043e\u0432\u0430\u043d. \u042f \u043c\u043e\u0433+\u0443 \u043d\u0430\u0447+\u0430\u0442\u044c \u043f\u0438\u0441+\u0430\u0442\u044c \u043f\u0438\u0441\u044c\u043c+\u043e. \" \\                                                               \"\u041a\u043e\u043c+\u0443 \u0431+\u0443\u0434\u0435\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043b+\u044f\u0442\u044c? \u041d\u0430\u0437\u043e\u0432+\u0438\u0442\u0435 \u043f\u043e\u043b\u0443\u0447+\u0430\u0442\u0435\u043b\u044f, \" \\                                                               \"\u043e\u0442\u0432+\u0435\u0442\u0438\u0432 \u043f\u043e\u043b\u0443\u0447+\u0430\u0442\u0435\u043b\u044c, \u0430 \u0434+\u0430\u043b\u044c\u0448\u0435 \u043d\u0430\u0437\u043e\u0432+\u0438\u0442\u0435 \u0435\u0433+\u043e \u0438\u043c\u044f \" \\                                                               \"\u0438 \u0444\u0430\u043c+\u0438\u043b\u0438\u044e, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0444\u0438\u0437 \u043b\u0438\u0446+\u043e \u0438\u043b\u0438 \u0436\u0435 \u043d\u0430\u0437\u0432+\u0430\u043d\u0438\u0435\" \\                                                               \"\u043a\u043e\u043c\u043f+\u0430\u043d\u0438\u0438, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u044e\u0440 \u043b\u0438\u0446+\u043e.\"                                 response_texts.append(response[\"response\"][\"text\"])                                 response_ttss.append(response[\"response\"][\"tts\"])                              else:                                 response[\"response\"][\"text\"] = \"\u0421\u043f\u0438\u0441\u043e\u043a \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u043e\u0432 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043b\u0438 \u0436\u0435 \u043e\u043d \u043f\u0443\u0441\u0442.\"                                  response[\"response\"][\"tts\"] = \" \u0421\u043f+\u0438\u0441\u043e\u043a \u043a\u043e\u043d\u0442+\u0430\u043a\u0442\u043e\u0432 \u043d\u0435 \u0443\u0434\u0430\u043b+\u043e\u0441\u044c \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432+\u0430\u0442\u044c \u0438\u043b\u0438 \u0436\u0435 \u043e\u043d \u043f\u0443\u0441\u0442.\"                                 response_texts.append(response[\"response\"][\"text\"])                                 response_ttss.append(response[\"response\"][\"tts\"])                          elif re.match(r\"^\u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c [\\S\\sa-zA-Z\u0430-\u044f\u0410-\u042f0-9_.+-]+$\",                                       req[\"request\"][\"original_utterance\"].lower().strip()):                             if get_recipient_email_text(req[\"request\"][\"original_utterance\"]):                                 global recipient_email_name                                 recipient_email_name = get_recipient_email_text(req[\"request\"][\"original_utterance\"])[0]                                 global recipient_email                                 recipient_email = get_recipient_email_text(req[\"request\"][\"original_utterance\"])[1]                                 response[\"response\"][\"text\"] = f\"Email \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f {recipient_email}. \u0427\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c, \" \\                                                                f\"\u043e\u0442\u0432\u0435\u0442\u044c\u0442\u0435, '\u0442\u0435\u043c\u0430 \u043f\u0438\u0441\u044c\u043c\u0430'. \" \\                                                                f\"\u0415\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c email \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f, \" \\                                                                f\"\u043e\u0442\u0432\u0435\u0442\u044c\u0442\u0435 \u043f\u0440\u043e\u0448\u043b\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0435\u0449\u0435 \u0440\u0430\u0437.\"                                 response[\"response\"][\"tts\"] = f\"Email \u043f\u043e\u043b\u0443\u0447+\u0430\u0442\u0435\u043b\u044f {recipient_email}. \" \\                                                               f\"\u0427\u0442+\u043e\u0431\u044b \u043f\u0440\u043e\u0434+\u043e\u043b\u0436\u0438\u0442\u044c, \u043e\u0442\u0432+\u0435\u0442\u044c\u0442\u0435, \u0442+\u0435\u043c\u0430 \u043f\u0438\u0441\u044c\u043c+\u0430. \" \\                                                               f\"\u0415\u0441\u043b\u0438 \u0445\u043e\u0442+\u0438\u0442\u0435 \u0438\u0437\u043c\u0435\u043d+\u0438\u0442\u044c email \u043f\u043e\u043b\u0443\u0447+\u0430\u0442\u0435\u043b\u044f, \" \\                                                               f\"\u043e\u0442\u0432+\u0435\u0442\u044c\u0442\u0435 \u043f\u0440+\u043e\u0448\u043b\u0443\u044e \u043a\u043e\u043c+\u0430\u043d\u0434\u0443 \u0435\u0449+\u0435 \u0440\u0430\u0437.\"                                 response_texts.append(response[\"response\"][\"text\"])                                 response_ttss.append(response[\"response\"][\"tts\"])                             else:                                 response[\"response\"][\"text\"] = \"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c email \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f. \" \\                                                                \"\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0435\u0433\u043e \u043d\u0435\u0442 \u0432 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u043e\u0432. \" \\                                                                \"\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0441\u043d\u043e\u0432\u0430, \u043e\u0442\u0432\u0435\u0442\u044c\u0442\u0435 \u043f\u0440\u043e\u0448\u043b\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0435\u0449\u0435 \u0440\u0430\u0437.\"                                 response[\"response\"][\"tts\"] = \"\u041d\u0435 \u0443\u0434\u0430\u043b+\u043e\u0441\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b+\u0438\u0442\u044c email \u043f\u043e\u043b\u0443\u0447+\u0430 \" \\                                                               \"\u0442\u0435\u043b\u044f. \u0412\u043e\u0437\u043c+\u043e\u0436\u043d\u043e \u0435\u0433\u043e \u043d\u0435\u0442 \u0432 \u0441\u0444\u043e\u0440\u043c\u0438\u0440+\u043e\u0432\u0430\u043d\u043d\u043e\u043c \" \\                                                               \"\u0441\u043f+\u0438\u0441\u043a\u0435 \u043a\u043e\u043d\u0442+\u0430\u043a\u0442\u043e\u0432. \u041f\u043e\u043f\u0440+\u043e\u0431\u0443\u0439\u0442\u0435 \u0441\u043d+\u043e\u0432\u0430, \" \\                                                               \"\u043e\u0442\u0432+\u0435\u0442\u044c\u0442\u0435 \u043f\u0440+\u043e\u0448\u043b\u0443\u044e \u043a\u043e\u043c+\u0430\u043d\u0434\u0443 \u0435\u0449\u0435 \u0440\u0430\u0437.\"                                 response_texts.append(response[\"response\"][\"text\"])                                 response_ttss.append(response[\"response\"][\"tts\"])                          elif req[\"request\"][\"original_utterance\"].lower().strip() == \"\u0442\u0435\u043c\u0430 \u043f\u0438\u0441\u044c\u043c\u0430\":                             response[\"response\"][\"text\"] = \"\u041f\u0440\u0438\u0434\u0443\u043c\u0430\u0439\u0442\u0435 \u0442\u0435\u043c\u0443 \u043f\u0438\u0441\u044c\u043c\u0430, \u043e\u0442\u0432\u0435\u0442\u0438\u0432, '\u0442\u0435\u043c\u0430'..., \" \\                                                            \"\u0430 \u0434\u0430\u043b\u044c\u0448\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u0451\u0442 \u0432\u0430\u0448\u0435\u0439 \u043c\u044b\u0441\u043b\u0438.\"                             response[\"response\"][\"tts\"] = \"\u041f\u0440\u0438\u0434+\u0443\u043c\u0430\u0439\u0442\u0435 \u0442+\u0435\u043c\u0443 \u043f\u0438\u0441\u044c\u043c+\u0430, \u043e\u0442\u0432+\u0435\u0442\u0438\u0432, \u0442+\u0435\u043c\u0430..., \" \\                                                           \"\u0430 \u0434+\u0430\u043b\u044c\u0448\u0435 \u0442+\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b+\u0451\u0442 \u0432+\u0430\u0448\u0435\u0439 \u043c+\u044b\u0441\u043b\u0438.\"                             response_texts.append(response[\"response\"][\"text\"])                             response_ttss.append(response[\"response\"][\"tts\"])                          elif re.match(r\"^\u0442\u0435\u043c\u0430 (?!.*\\b\u043f\u0438\u0441\u044c\u043c\u0430\\b)[\\S\\sa-zA-Z\u0430-\u044f\u0410-\u042f0-9_.+-]+$\",                                       req[\"request\"][\"original_utterance\"].lower().strip()):                             global subject                             subject = get_email_obj_text(req[\"request\"][\"original_utterance\"].strip(), \"\u0442\u0435\u043c\u0430\")                             subject = subject if re.match(r'[+.!?]', subject[len(subject) - 1]) else subject + '.'                             response[\"response\"][\"text\"] = f\"\u0422\u0435\u043c\u0430 \u043f\u0438\u0441\u044c\u043c\u0430 - {subject} \u0427\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c, \" \\                                                            f\"\u043e\u0442\u0432\u0435\u0442\u044c\u0442\u0435, '\u0442\u0435\u043a\u0441\u0442 \u043f\u0438\u0441\u044c\u043c\u0430'. \" \\                                                            f\"\u0415\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0442\u0435\u043c\u0443 \u043f\u0438\u0441\u044c\u043c\u0430, \" \\                                                            f\"\u043e\u0442\u0432\u0435\u0442\u044c\u0442\u0435 \u043f\u0440\u043e\u0448\u043b\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0435\u0449\u0435 \u0440\u0430\u0437.\"                             response[\"response\"][\"tts\"] = f\"\u0422+\u0435\u043c\u0430 \u043f\u0438\u0441\u044c\u043c+\u0430 - {subject} \u0427\u0442+\u043e\u0431\u044b \u043f\u0440\u043e\u0434+\u043e\u043b\u0436\u0438\u0442\u044c, \" \\                                                           f\"\u043e\u0442\u0432+\u0435\u0442\u044c\u0442\u0435, \u0442\u0435\u043a\u0441\u0442 \u043f\u0438\u0441\u044c\u043c+\u0430. \" \\                                                           f\"\u0415\u0441\u043b\u0438 \u0445\u043e\u0442+\u0438\u0442\u0435 \u0438\u0437\u043c\u0435\u043d+\u0438\u0442\u044c \u0442+\u0435\u043c\u0443 \u043f\u0438\u0441\u044c\u043c+\u0430, \" \\                                                           f\"\u043e\u0442\u0432+\u0435\u0442\u044c\u0442\u0435 \u043f\u0440+\u043e\u0448\u043b\u0443\u044e \u043a\u043e\u043c+\u0430\u043d\u0434\u0443 \u0435\u0449\u0435 \u0440\u0430\u0437.\"                             response_texts.append(response[\"response\"][\"text\"])                             response_ttss.append(response[\"response\"][\"tts\"])                          elif req[\"request\"][\"original_utterance\"].lower().strip() == \"\u0442\u0435\u043a\u0441\u0442 \u043f\u0438\u0441\u044c\u043c\u0430\":                             response[\"response\"][\"text\"] = \"\u041f\u0440\u0438\u0434\u0443\u043c\u0430\u0439\u0442\u0435 \u0442\u0435\u043a\u0441\u0442 \u043f\u0438\u0441\u044c\u043c\u0430, \u043e\u0442\u0432\u0435\u0442\u0438\u0432, '\u0442\u0435\u043a\u0441\u0442'..., \" \\                                                            \"\u0430 \u0434\u0430\u043b\u044c\u0448\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u0451\u0442 \u0432\u0430\u0448\u0435\u0439 \u043c\u044b\u0441\u043b\u0438.\"                             response[\"response\"][\"tts\"] = \"\u041f\u0440\u0438\u0434+\u0443\u043c\u0430\u0439\u0442\u0435 \u0442\u0435\u043a\u0441\u0442 \u043f\u0438\u0441\u044c\u043c+\u0430, \u043e\u0442\u0432+\u0435\u0442\u0438\u0432, \u0442\u0435\u043a\u0441\u0442... \" \\                                                           \"\u0430 \u0434+\u0430\u043b\u044c\u0448\u0435 \u0442+\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b+\u0451\u0442 \u0432+\u0430\u0448\u0435\u0439 \u043c+\u044b\u0441\u043b\u0438. \"                             response_texts.append(response[\"response\"][\"text\"])                             response_ttss.append(response[\"response\"][\"tts\"])                          elif re.match(r\"^\u0442\u0435\u043a\u0441\u0442 (?!.*\\b\u043f\u0438\u0441\u044c\u043c\u0430\\b)[\\S\\sa-zA-Z\u0430-\u044f\u0410-\u042f0-9_.+-]+$\",                                       req[\"request\"][\"original_utterance\"].lower().strip()):                             global message                             message = get_email_obj_text(req[\"request\"][\"original_utterance\"].strip(), \"\u0442\u0435\u043a\u0441\u0442\")                             message = message if re.match(r'[+.!?]', message[len(message) - 1]) else message + '.'                             response[\"response\"][\"text\"] = f\"\u0422\u0435\u043a\u0441\u0442 \u043f\u0438\u0441\u044c\u043c\u0430 - {message} \u0427\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c, \" \\                                                            f\"\u043e\u0442\u0432\u0435\u0442\u044c\u0442\u0435, '\u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043f\u0438\u0441\u044c\u043c\u0430'. \" \\                                                            f\"\u0415\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u043f\u0438\u0441\u044c\u043c\u0430, \" \\                                                            f\"\u043e\u0442\u0432\u0435\u0442\u044c\u0442\u0435 \u043f\u0440\u043e\u0448\u043b\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0435\u0449\u0435 \u0440\u0430\u0437.\"                             response[\"response\"][\"tts\"] = f\"\u0422\u0435\u043a\u0441\u0442 \u043f\u0438\u0441\u044c\u043c+\u0430 - {message} \u0427\u0442+\u043e\u0431\u044b \u043f\u0440\u043e\u0434+\u043e\u043b\u0436\u0438\u0442\u044c, \" \\                                                           f\"\u043e\u0442\u0432+\u0435\u0442\u044c\u0442\u0435, \u043e\u0442\u043f\u0440+\u0430\u0432\u043a\u0430 \u043f\u0438\u0441\u044c\u043c+\u0430. \" \\                                                           f\"\u0415\u0441\u043b\u0438 \u0445\u043e\u0442+\u0438\u0442\u0435 \u0438\u0437\u043c\u0435\u043d+\u0438\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u043f\u0438\u0441\u044c\u043c+\u0430, \" \\                                                           f\"\u043e\u0442\u0432+\u0435\u0442\u044c\u0442\u0435 \u043f\u0440+\u043e\u0448\u043b\u0443\u044e \u043a\u043e\u043c+\u0430\u043d\u0434\u0443 \u0435\u0449\u0435 \u0440\u0430\u0437.\"                             response_texts.append(response[\"response\"][\"text\"])                             response_ttss.append(response[\"response\"][\"tts\"])                          elif req[\"request\"][\"original_utterance\"].lower().strip() == \"\u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043f\u0438\u0441\u044c\u043c\u0430\":                             response[\"response\"][\"text\"] = \"\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e \u043f\u0438\u0441\u044c\u043c\u043e, \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \" \\                                                            \"\u043e\u0442\u0432\u0435\u0442\u0438\u0432, '\u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u044e', \u043b\u0438\u0431\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \" \\                                                            \"\u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043d\u0430\u0437\u0430\u0434 \u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0442\u0435\u043a\u0441\u0442, \" \\                                                            \"\u0442\u0435\u043c\u0443 \u0438\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f \u043f\u0438\u0441\u044c\u043c\u0430.\"                             response[\"response\"][\"tts\"] = \"\u041e\u0442\u043f\u0440\u0430\u0432\u043b+\u044f\u044e \u043f\u0438\u0441\u044c\u043c+\u043e, \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434+\u0438\u0442\u0435, \" \\                                                           \"\u043e\u0442\u0432+\u0435\u0442\u0438\u0432, \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434+\u0430\u044e, \u043b+\u0438\u0431\u043e \u0432\u044b \u043c+\u043e\u0436\u0435\u0442\u0435 \" \\                                                           \"\u0432\u0435\u0440\u043d+\u0443\u0442\u044c\u0441\u044f \u043d\u0430\u0437+\u0430\u0434 \u0438 \u0438\u0437\u043c\u0435\u043d+\u0438\u0442\u044c \u0442\u0435\u043a\u0441\u0442,\u0442+\u0435\u043c\u0443 \u0438\u043b\u0438 \" \\                                                           \"\u043f\u043e\u043b\u0443\u0447+\u0430\u0442\u0435\u043b\u044f \u043f\u0438\u0441\u044c\u043c+\u0430.\"                             response_texts.append(response[\"response\"][\"text\"])                             response_ttss.append(response[\"response\"][\"tts\"])                          elif req[\"request\"][\"original_utterance\"].lower().strip() == \"\u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u044e\":                             if send_email(access_token=access_token, sender_email_name=sender_email_name,                                           sender_email=sender_email, recipient_email_name=recipient_email_name,                                           recipient_email=recipient_email, subject=subject, message=message):                                 response[\"response\"][\"text\"] = \"\u041f\u0438\u0441\u044c\u043c\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e.\"                                 response[\"response\"][\"tts\"] = \"\u041f\u0438\u0441\u044c\u043c+\u043e \u043e\u0442\u043f\u0440+\u0430\u0432\u043b\u0435\u043d\u043e.\"                                 response_texts.append(response[\"response\"][\"text\"])                                 response_ttss.append(response[\"response\"][\"tts\"])                             else:                                 response[\"response\"][\"text\"] = \"\u041f\u0438\u0441\u044c\u043c\u043e \u0443\u0436\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e, \u043b\u0438\u0431\u043e \u043d\u0430 \" \\                                                                \"\u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u043a\u0430\u043a\u0438\u0435 \u0442\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b.\"                                 response[\"response\"][\"tts\"] = \"\u041f\u0438\u0441\u044c\u043c+\u043e \u0443\u0436+\u0435 \u043e\u0442\u043f\u0440+\u0430\u0432\u043b\u0435\u043d\u043e, \u043b+\u0438\u0431\u043e \u043d\u0430 \" \\                                                               \"\u0441+\u0435\u0440\u0432\u0435\u0440\u0435 \u043a\u0430\u043a+\u0438\u0435 \u0442\u043e \u043f\u0440\u043e\u0431\u043b+\u0435\u043c\u044b.\"                                 response_texts.append(response[\"response\"][\"text\"])                                 response_ttss.append(response[\"response\"][\"tts\"])                             sender_email_name = sender_email = recipient_email_name = \\                                 recipient_email = subject = message = \"\"                         elif req[\"request\"][\"command\"].lower().strip() in [\"\u0441\u043f\u0430\u0441\u0438\u0431\u043e\", \"\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0441\u043f\u0430\u0441\u0438\u0431\u043e\"]:                             response[\"response\"][\"text\"] = \"\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0432\u0441\u0435\u0433\u0434\u0430 \u043a \u0432\u0430\u0448\u0438\u043c \u0443\u0441\u043b\u0443\u0433\u0430\u043c!\"                             response[\"response\"][\"tts\"] = \"\u041f\u043e\u0436+\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0432\u0441\u0435\u0433\u0434+\u0430 \u043a \u0432+\u0430\u0448\u0438\u043c \u0443\u0441\u043b+\u0443\u0433\u0430\u043c!\"              except KeyError:                 response[\"start_account_linking\"] = {}                 response[\"response\"][                     \"text\"] = \"\u041f\u0440\u0438\u0432\u0435\u0442, \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043c \u043f\u043e\u0447\u0442\u0443 \u043a\u043e\u043c\u0443-\u043d\u0438\u0431\u0443\u0434\u044c? \u0422\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0434\u043e \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f. \" \\                               \"\u0427\u0442\u043e\u0431\u044b \u043d\u0430\u0447\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u044c\u0442\u0435 '\u0441\u0442\u0430\u0440\u0442'. \" \\                               \"\u0414\u043b\u044f \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u043d\u0430\u0432\u044b\u043a\u0430 \u043e\u0442\u0432\u0435\u0442\u044c\u0442\u0435 '\u043f\u043e\u043a\u0430' \u0438\u043b\u0438 '\u0441\u0442\u043e\u043f'.\"                  response[\"response\"][                     \"tts\"] = \"\u041f\u0440\u0438\u0432+\u0435\u0442, \u043e\u0442\u043f\u0440+\u0430\u0432\u0438\u043c \u043f+\u043e\u0447\u0442\u0443 \u043a\u043e\u043c+\u0443 \u043d\u0438\u0431+\u0443\u0434\u044c? \u0422\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0434\u043e \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f. \" \\                              \"\u0427\u0442+\u043e\u0431\u044b \u043d\u0430\u0447+\u0430\u0442\u044c \u043e\u0442\u0432+\u0435\u0442\u044c\u0442\u0435 \u0441\u0442\u0430\u0440\u0442. \u0414\u043b\u044f \u0432+\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u043d+\u0430\u0432\u044b\u043a\u0430 \u043e\u0442\u0432+\u0435\u0442\u044c\u0442\u0435 \u043f\u043e\u043a+\u0430 \" \\                              \"\u0438\u043b\u0438 \u0441\u0442\u043e\u043f.\"     except Exception :         response[\"response\"][\"text\"] = \"\u041f\u043e\u0442\u0435\u0440\u044f\u043d\u0430 \u0441\u0432\u044f\u0437\u044c \u0441 \u043a\u043e\u0441\u043c\u043e\u0441\u043e\u043c, \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0438\u043b\u0438 \u043d\u0430\u0447\u043d\u0438\u0442\u0435 \u0441\u043d\u0430\u0447\u0430\u043b\u0430.\"         response[\"response\"][\"tts\"] = \"\u041f\u043e\u0442+\u0435\u0440\u044f\u043d\u0430 \u0441\u0432\u044f\u0437\u044c \u0441 \u043a\u043e\u0441\u043c\u043e\u0441\u043e\u043c, \u043f\u043e\u0432\u0442\u043e\u0440+\u0438\u0442\u0435 \u043f\u0440\u0435\u0434\u044b\u0434+\u0443\u0449\u0443\u044e \u043a\u043e\u043c+\u0430\u043d\u0434\u0443 \u0438\u043b\u0438 \u043d\u0430\u0447\u043d+\u0438\u0442\u0435 \u0441\u043d\u0430\u0447+\u0430\u043b\u0430.\"     return json.dumps(response)  run(host='127.0.0.1', port=8080)<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0412 \u0432\u0435\u0442\u0432\u044f\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0432\u044b\u043a\u0430. \u041b\u043e\u0433\u0438\u043a\u0430 \u043f\u0440\u043e\u0441\u0442\u0430: \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043d\u0430\u0432\u044b\u043a\u043e\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 &#8216;\u0441\u0442\u0430\u0440\u0442&#8217;, \u0435\u0441\u043b\u0438 \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 access_token, \u0410\u043b\u0438\u0441\u0430 \u043f\u0440\u043e\u0441\u0438\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043d\u0430\u0432\u044b\u043a\u0435. \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043b\u0441\u044f, \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0438\u043c\u044f \u0438 email \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u043e\u0432, \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0435\u043c\u0443 \u0438 \u0442\u0435\u043a\u0441\u0442 \u043f\u0438\u0441\u044c\u043c\u0430, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0435\u0433\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443. \u0412 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u043e\u043c \u043d\u0435\u043b\u044c\u0437\u044f.<\/p>\n<p>\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1d7\/23f\/b1f\/1d723fb1f87f8fa5658ede25d3c51bd4.png\" width=\"1010\" height=\"408\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1d7\/23f\/b1f\/1d723fb1f87f8fa5658ede25d3c51bd4.png\"\/><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a18\/086\/535\/a180865354b2dea82192c5cabf28a059.png\" width=\"1120\" height=\"706\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a18\/086\/535\/a180865354b2dea82192c5cabf28a059.png\"\/><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ceb\/11a\/645\/ceb11a6452c150e0e0407e69e595c046.png\" width=\"1296\" height=\"426\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ceb\/11a\/645\/ceb11a6452c150e0e0407e69e595c046.png\"\/><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/465\/2d4\/5fa\/4652d45fa580cd165a2ee2ee97215b70.png\" width=\"1108\" height=\"462\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/465\/2d4\/5fa\/4652d45fa580cd165a2ee2ee97215b70.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0412\u0435\u0440\u0445\u043d\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043f\u043e\u043a\u0440\u044b\u0442 \u0431\u043b\u043e\u043a\u043e\u043c try->except. \u041f\u0440\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0438 \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u043b\u044e\u0431\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u043a\u043e\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0443\u0432\u0438\u0434\u0438\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435: \u00ab\u041f\u043e\u0442\u0435\u0440\u044f\u043d\u0430 \u0441\u0432\u044f\u0437\u044c \u0441 \u043a\u043e\u0441\u043c\u043e\u0441\u043e\u043c, \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0438\u043b\u0438 \u043d\u0430\u0447\u043d\u0438\u0442\u0435 \u0441\u043d\u0430\u0447\u0430\u043b\u0430\u00bb. \u041f\u043e-\u0445\u043e\u0440\u043e\u0448\u0435\u043c\u0443 \u043d\u0430\u0434\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u0432 \u0444\u0430\u0439\u043b, \u043d\u043e \u044f \u043e\u0431\u043e\u0448\u0435\u043b\u0441\u044f \u0431\u0435\u0437 \u044d\u0442\u043e\u0433\u043e, <s>it is bad practi\u0441e<\/s>.<\/p>\n<p>\u0412 \u043a\u0430\u0436\u0434\u043e\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u0438 \u044f \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e response \u0410\u043b\u0438\u0441\u044b \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043d\u0435\u0437\u043d\u0430\u043a\u043e\u043c\u043e\u0439 \u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u043e\u043d\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u043b\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442.<\/p>\n<pre><code class=\"python\"> ... response_texts.append(response[\"response\"][\"text\"]) response_ttss.append(response[\"response\"][\"tts\"]) ...  <\/code><\/pre>\n<pre><code class=\"python\">elif req[\"session\"][\"user\"][\"access_token\"]:   response[\"response\"][\"text\"] = response_texts[len(response_texts) - 1]   response[\"response\"][\"tts\"] = response_ttss[len(response_ttss) - 1]<\/code><\/pre>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u044e \u043a\u043e\u0434 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 mail_tools.py. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c bottle-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0444\u0430\u0439\u043b\u043e\u0432.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434 \u0444\u0430\u0439\u043b\u0430 mail_tools.py<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">import base64 import imaplib import re import smtplib import email import email.header from email.header import decode_header from email.headerregistry import Address from email.message import EmailMessage  import requests  login_info_url = \"https:\/\/login.yandex.ru\/info?oauth_token={}\" email_address_list = []   def get_sender_email_data(access_token: str) -> list:   try:     response = requests.get(login_info_url.format(access_token))     user_data = response.json()     sender_name = user_data[\"display_name\"]     sender_email = user_data[\"default_email\"]   except Exception:     return []   return [sender_name, sender_email]   def send_email(access_token: str, sender_email_name: str, sender_email: str, recipient_email_name: str,                recipient_email: str, subject: str, message: str) -> bool:     try:         just_a_str = f\"user={sender_email}\\x01auth=Bearer {access_token}\\x01\\x01\"         xoauth2_token = base64.b64encode(bytes(just_a_str, 'utf-8')).decode('utf-8')          sender_email_login = get_email_data_list(sender_email)[0]         sender_email_domain = get_email_data_list(sender_email)[1]         recipient_email_login = get_email_data_list(recipient_email)[0]         recipient_email_domain = get_email_data_list(recipient_email)[1]          msg = EmailMessage()         msg['Subject'] = subject         msg['From'] = Address(sender_email_name, sender_email_login, sender_email_domain)         msg['To'] = Address(recipient_email_name, recipient_email_login, recipient_email_domain)         msg.set_content(message)          smtp = smtplib.SMTP_SSL(host='smtp.yandex.ru', port=465)         smtp.connect(host='smtp.yandex.ru', port=465)         smtp.docmd(\"auth\", f\"XOAUTH2 {xoauth2_token}\")         smtp.sendmail(sender_email, recipient_email, msg.as_string())         smtp.quit()     except Exception:         return False          return True   def get_email_data_list(email_data_str: str) -> list:     email_data_list = email_data_str.split(\"@\")     return email_data_list   def get_email_address_list(access_token: str, sender_email: str) -> list:     try:         xoauth2_token = f\"user={sender_email}\\x01auth=Bearer {access_token}\\x01\\x01\"              imap = imaplib.IMAP4_SSL(host='imap.yandex.com')         imap.debug = 4         imap.authenticate(\"XOAUTH2\", lambda x: xoauth2_token)         status, messages = imap.select(\"INBOX\")         messages = int(messages[0])         messages_count = 0         if messages >= 30:             messages_count = 30         elif messages &lt; 30:             messages_count = messages         while messages_count:             messages_count -= 1             res, msg = imap.fetch(str(messages - messages_count), \"(RFC822)\")             for response in msg:                 if isinstance(response, tuple):                     msg = email.message_from_bytes(response[1])                      sender_data = decode_header(msg.get(\"From\"))                      if len(sender_data) == 2:                         sender_name, encoding = sender_data[0]                         sender_email, type_email = sender_data[1]                         if isinstance(sender_name, bytes) and isinstance(sender_email, bytes):                             sender_name = sender_name.decode(encoding)                             sender_name = ''.join(sender_name.split()).lower()                             sender_email = sender_email.decode(encoding).replace(\"&lt;\", \"\") \\                                 .replace(\">\", \"\").replace(\" \", \"\")                             sender_email = sender_email.lower()                             email_address_list.append(sender_name + \":\" + sender_email)                      imap.close()         imap.logout()              except Exception:         return []          return email_address_list   def get_recipient_email_text(text: str) -> list:     try:         email_text = ''.join(text.split()).lower()         email_text = email_text.split(\"\u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c\")[1]         for email_recipient in email_address_list:             if email_text in email_recipient:                 recipient_name = email_recipient.split(\":\")[0]                 recipient_email = email_recipient.split(\":\")[1]                 return [recipient_name, recipient_email]      except Exception:         return []     return []   def get_email_obj_text(email_obj_text: str, email_obj_type: str) -> str:     email_obj_text_list = email_obj_text.split(email_obj_type + \" \") \\         if len(email_obj_text.split(email_obj_type + \" \")) > 1 \\         else email_obj_text.split(email_obj_type.title() + \" \")     email_obj_text = email_obj_text_list[1]     email_obj_text = email_obj_text.replace(\" \u0442\u043e\u0447\u043a\u0430 \u0441 \u0437\u0430\u043f\u044f\u0442\u043e\u0439\", \";\")     email_obj_text = email_obj_text.replace(\" \u0442\u043e\u0447\u043a\u0430\", \".\")     email_obj_text = email_obj_text.replace(\" \u0437\u043d\u0430\u043a \u0432\u043e\u0441\u043a\u043b\u0438\u0446\u0430\u043d\u0438\u044f\", \"!\")     email_obj_text = email_obj_text.replace(\" \u0432\u043e\u0441\u043a\u043b\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0437\u043d\u0430\u043a\", \"!\")     email_obj_text = email_obj_text.replace(\" \u0437\u043d\u0430\u043a \u0432\u043e\u043f\u0440\u043e\u0441\u0430\", \"?\")     email_obj_text = email_obj_text.replace(\" \u0432\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0437\u043d\u0430\u043a\", \"?\")     email_obj_text = email_obj_text.replace(\"\u0442\u0438\u0440\u0435\", \"-\")     email_obj_text = email_obj_text.replace(\" \u0434\u0432\u043e\u0435\u0442\u043e\u0447\u0438\u0435\", \":\")     email_obj_text = email_obj_text.replace(\" \u0437\u0430\u043f\u044f\u0442\u0430\u044f\", \",\")      email_obj_text_list = re.findall(r\"[\\s\u0410-\u042f\u0430-\u044f-,;:_-]*!?.\", email_obj_text)     text_list = []     for phrase in email_obj_text_list:         phrase = phrase.strip()         phrase = phrase.capitalize()         text_list.append(phrase)     email_obj_text = \" \".join(text_list)     return email_obj_text<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0410\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u043c\u044f \u0438 email \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 get_sender_email_data \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044f GET \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 <a href=\"https:\/\/login.yandex.ru\/info?oauth_token=%7B%7D\">https:\/\/login.yandex.ru\/info<\/a> \u0441 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435\u0439 access_token.<\/p>\n<pre><code class=\"python\">login_info_url = \"https:\/\/login.yandex.ru\/info?oauth_token={}\" email_address_list = []   def get_sender_email_data(access_token: str) -> list:   try:     response = requests.get(login_info_url.format(access_token))     user_data = response.json()     sender_name = user_data[\"display_name\"]     sender_email = user_data[\"default_email\"]   except Exception:     return []   return [sender_name, sender_email]<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0442\u0435\u043c\u044b \u0438 \u0442\u0435\u043a\u0441\u0442\u0430 \u043f\u0438\u0441\u044c\u043c\u0430 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435. \u042d\u0442\u0438 \u043f\u043e\u0447\u0442\u043e\u0432\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0437\u043d\u0430\u043a\u043e\u0432 \u043f\u0440\u0435\u043f\u0438\u043d\u0430\u043d\u0438\u044f \u0438 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u042f \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u043b \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432.<\/p>\n<pre><code class=\"python\">def get_email_obj_text(email_obj_text: str, email_obj_type: str) -> str:     email_obj_text_list = email_obj_text.split(email_obj_type + \" \") \\         if len(email_obj_text.split(email_obj_type + \" \")) > 1 \\         else email_obj_text.split(email_obj_type.title() + \" \")     email_obj_text = email_obj_text_list[1]     email_obj_text = email_obj_text.replace(\" \u0442\u043e\u0447\u043a\u0430 \u0441 \u0437\u0430\u043f\u044f\u0442\u043e\u0439\", \";\")     email_obj_text = email_obj_text.replace(\" \u0442\u043e\u0447\u043a\u0430\", \".\")     email_obj_text = email_obj_text.replace(\" \u0437\u043d\u0430\u043a \u0432\u043e\u0441\u043a\u043b\u0438\u0446\u0430\u043d\u0438\u044f\", \"!\")     email_obj_text = email_obj_text.replace(\" \u0432\u043e\u0441\u043a\u043b\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0437\u043d\u0430\u043a\", \"!\")     email_obj_text = email_obj_text.replace(\" \u0437\u043d\u0430\u043a \u0432\u043e\u043f\u0440\u043e\u0441\u0430\", \"?\")     email_obj_text = email_obj_text.replace(\" \u0432\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0437\u043d\u0430\u043a\", \"?\")     email_obj_text = email_obj_text.replace(\"\u0442\u0438\u0440\u0435\", \"-\")     email_obj_text = email_obj_text.replace(\" \u0434\u0432\u043e\u0435\u0442\u043e\u0447\u0438\u0435\", \":\")     email_obj_text = email_obj_text.replace(\" \u0437\u0430\u043f\u044f\u0442\u0430\u044f\", \",\")      email_obj_text_list = re.findall(r\"[\\s\u0410-\u042f\u0430-\u044f-,;:_-]*!?.\", email_obj_text)     text_list = []     for phrase in email_obj_text_list:         phrase = phrase.strip()         phrase = phrase.capitalize()         text_list.append(phrase)     email_obj_text = \" \".join(text_list)     return email_obj_text<\/code><\/pre>\n<p>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0442\u0435\u043c\u0443\/\u0442\u0435\u043a\u0441\u0442 \u043f\u0438\u0441\u044c\u043c\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0443 \u0434\u043b\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0430 \u043d\u0430 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0441\u043e \u0437\u043d\u0430\u043a\u0430\u043c\u0438 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f. \u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043a\u043b\u0435\u0438\u0432\u0430\u0435\u0442 \u0432 \u0441\u0442\u0440\u043e\u043a\u0443. \u041a\u043e\u0434 \u043d\u0435 \u0438\u0434\u0435\u0430\u043b\u0435\u043d, \u043d\u043e \u0441\u0432\u043e\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043e\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442.<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0432\u044b\u043a\u0435, \u0432\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u043b\u0438\u0431\u043e \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0410\u043b\u0438\u0441\u0430 \u043d\u0430 Windows\/iOS\/Android \u0438\u043b\u0438 \u043d\u0430 \u0443\u043c\u043d\u043e\u0439 \u043a\u043e\u043b\u043e\u043d\u043a\u0435. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0434\u043e  \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u043d\u0430\u0432\u044b\u043a \u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u043e\u0440\u0430\u0437\u043e\u0432\u0443\u044e \u0441\u0441\u044b\u043b\u043a\u0443.<\/p>\n<p>\u041a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443 \u043c\u0435\u043d\u044f \u043d\u0430 \u043a\u043e\u043b\u043e\u043d\u043a\u0435:<\/p>\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/63c4fe6761f0ac6fb24f9fa3\" data-style=\"\" id=\"63c4fe6761f0ac6fb24f9fa3\" width=\"\"><\/div>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/265\/2b2\/40f\/2652b240fa75aea9e786875d2b299841.png\" width=\"1276\" height=\"502\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/265\/2b2\/40f\/2652b240fa75aea9e786875d2b299841.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041f\u043e\u0434 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0441\u0435\u0440\u0432\u0435\u0440 Beget. \u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u043d\u0430 Python \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u0439. <a href=\"https:\/\/beget.com\/ru\/kb\/how-to\/web-apps\/python?_ga=2.221424859.2129016251.1673530600-70655174.1673202851#pervonachalnaya-ustanovka-mikrofreymvorka-bottle\">\u041c\u0430\u043d\u0443\u0430\u043b<\/a> \u043f\u043e \u0434\u0435\u043f\u043b\u043e\u044e bottle \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0439: \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438, \u0437\u0430\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u0442\u0435 \u0444\u0430\u0439\u043b\u044b, \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043c\u0430\u0433\u0438\u0438 \u0438 \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u042f \u0440\u0435\u0448\u0438\u043b \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0430\u0432\u044b\u043a \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u043c. \u041e\u043d \u043d\u0435 \u0438\u0434\u0435\u0430\u043b\u0435\u043d \u0438 \u043f\u043e\u0440\u043e\u0439 \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u0432\u0430\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u044e \u0438 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u044e \u043a\u043e\u0434, \u043f\u0440\u0438\u043a\u0440\u0443\u0447\u0443 \u0411\u0414, \u043d\u043e \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u0436\u0435 \u0434\u0440\u0443\u0433\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f. <\/p>\n<p><strong>\u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0443\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u2013 \u0431\u0443\u0434\u0443 \u0440\u0430\u0434 \u043d\u0430 \u043d\u0438\u0445 \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.<\/strong><\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p> <!----> <!----><\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/ru_mts\/blog\/710366\/\"> https:\/\/habr.com\/ru\/company\/ru_mts\/blog\/710366\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0418\u0432\u0430\u043d \u0427\u0435\u0447\u0438\u043a\u043e\u0432, \u044f <a href=\"https:\/\/career.habr.com\/companies\/mts\/vacancies\">QA-lead \u0432 \u041c\u0422\u0421 Digital<\/a>, \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u043d\u0430\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u043e\u0432\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u00a0<a href=\"http:\/\/wasd.tv\/\"><u>WASD.TV<\/u><\/a>. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0441\u0432\u043e\u0435\u043c \u043f\u0435\u0442-\u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u043d\u0430\u0432\u044b\u043a\u0430 \u00ab\u0423\u043c\u043d\u044b\u0439 \u043f\u043e\u0447\u0442\u0430\u043b\u044c\u043e\u043d\u00bb \u0434\u043b\u044f \u0410\u043b\u0438\u0441\u044b, \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u0430 \u042f\u043d\u0434\u0435\u043a\u0441\u0430.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p><strong>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u0441\u0442\u043e\u0440\u0438\u0438:<\/strong><\/p>\n<p>\u0412 \u0434\u0435\u043a\u0430\u0431\u0440\u0435 \u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e \u0433\u043e\u0434\u0430 \u044f \u043f\u0440\u0438\u043e\u0431\u0440\u0435\u043b <a href=\"https:\/\/yandex.ru\/alice\/station-mini-new\">\u0443\u043c\u043d\u0443\u044e \u043a\u043e\u043b\u043e\u043d\u043a\u0443 \u042f\u043d\u0434\u0435\u043a\u0441\u0430<\/a>, \u0421\u0442\u0430\u043d\u0446\u0438\u044e \u041b\u0430\u0439\u0442. \u0415\u0449\u0435 \u043d\u0435 \u0443\u0441\u043f\u0435\u043b \u043d\u0430\u0441\u043b\u0430\u0434\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0438\u043e\u0431\u0440\u0435\u0442\u0435\u043d\u0438\u0435\u043c, \u0430 \u0443\u0436\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u043b, \u0447\u0442\u043e, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u0410\u043b\u0438\u0441\u0435 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442. \u041f\u043e\u0433\u0443\u0433\u043b\u0438\u043b \u0438 \u0443\u0437\u043d\u0430\u043b, \u0447\u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 <a href=\"https:\/\/dialogs.yandex.ru\/store\">\u0432\u0438\u0442\u0440\u0438\u043d\u0430 \u043d\u0430\u0432\u044b\u043a\u043e\u0432<\/a>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u2013 \u043d\u0430\u0432\u044b\u043a\u0438 \u0434\u043b\u044f \u0410\u043b\u0438\u0441\u044b, \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u044e\u0449\u0438\u0435 \u0435\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438. \u0418\u0434\u0435\u044f \u044d\u0442\u043e\u0439 \u0432\u0438\u0442\u0440\u0438\u043d\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043c\u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u0438 \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u043b\u044f \u043d\u0435\u0435 \u043d\u043e\u0432\u044b\u0439 \u043d\u0430\u0432\u044b\u043a. \u041c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043d\u0430\u0443\u0447\u0438\u0442\u044c \u0410\u043b\u0438\u0441\u0443 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u043e\u0447\u0442\u0443 \u043f\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0441 \u043a\u043e\u043b\u043e\u043d\u043a\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u043e \u0434\u0435\u0444\u043e\u043b\u0442\u0443 \u043e\u043d\u0430 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0443\u043c\u0435\u0435\u0442.<\/p>\n<blockquote>\n<p><em>\u041d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u044f \u043d\u0435 \u043d\u0430\u0448\u0435\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0430\u043d\u0430\u043b\u043e\u0433\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0447\u0430\u043b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441\u0432\u043e\u0435\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f.<\/em><\/p>\n<\/blockquote>\n<p>\u0418\u0442\u0430\u043a, \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0437\u0430\u0434\u0443\u043c\u043a\u0443, \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e: <\/p>\n<ul>\n<li>\n<p>\u043f\u043e\u0434\u043d\u044f\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430 Python \u0441 \u043f\u0440\u043e\u0431\u0440\u043e\u0441\u043e\u043c \u0445\u043e\u0441\u0442\u0430 \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443 \u0441 https;<\/p>\n<\/li>\n<li>\n<p>\u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u0432 <a href=\"https:\/\/mail.yandex.ru\/\">\u042f\u043d\u0434\u0435\u043a\u0441.\u041f\u043e\u0447\u0442\u0430<\/a> \u043f\u043e imap \u0438 smtp;<\/p>\n<\/li>\n<li>\n<p>\u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 <a href=\"https:\/\/oauth.yandex.ru\/\">\u042f\u043d\u0434\u0435\u043a\u0441 OAuth<\/a> \u0438 \u043d\u0430\u0432\u044b\u043a \u0432 <a href=\"https:\/\/dialogs.yandex.ru\/developer\/\">\u042f\u043d\u0434\u0435\u043a\u0441.\u0414\u0438\u0430\u043b\u043e\u0433\u0430\u0445<\/a>;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0434\u043b\u044f \u0410\u043b\u0438\u0441\u044b: \u043b\u043e\u0433\u0438\u043a\u0443 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u043e\u0432, \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0435\u043c\u044b \u0438 \u0442\u0435\u043a\u0441\u0442\u0430 \u043f\u0438\u0441\u044c\u043c\u0430, \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043f\u0438\u0441\u044c\u043c\u0430;<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b;<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 <a href=\"https:\/\/beget.com\/ru\">\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433<\/a>.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u0439\u0434\u0435\u043c \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443.<\/p>\n<p>\u042f \u0440\u0435\u0448\u0438\u043b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 <strong>python3.8<\/strong> \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0432\u0435\u0431 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 <strong>Bottle<\/strong>. \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u044f \u043f\u043e\u0434\u043d\u044f\u043b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043c\u0435\u0442\u043e\u0434 run.<\/p>\n<pre><code class=\"python\">from bottle import route, run  @route('\/') def index():     print(\"\u0422\u0435\u0441\u0442\")  run(host='127.0.0.1', port=8080)<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0431\u0440\u043e\u0441\u0438\u043b \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0445\u043e\u0441\u0442 \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/ngrok.com\/\">ngrok<\/a>. \u042d\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u0435\u0440\u0432\u0438\u0441. \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f, c\u043a\u0430\u0447\u0430\u0442\u044c zip-\u0430\u0440\u0445\u0438\u0432 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u044f\u0434 \u043a\u043e\u043c\u0430\u043d\u0434 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435:<\/p>\n<pre><code class=\"bash\">$ unzip \/path\/to\/ngrok.zip $ ngrok config add-authtoken {authtoken} $ ngrok http 8080<\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<figure class=\"bordered full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0440\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 GET \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430 <a href=\"https:\/\/1cc0-213-24-134-136.eu.ngrok.io\">https:\/\/1cc0-213-24-134-136.eu.ngrok.io<\/a> \u0432\u0435\u0440\u043d\u0435\u0442\u0441\u044f 200 \u043a\u043e\u0434 \u043e\u0442\u0432\u0435\u0442\u0430 http.<\/p>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 \u042f\u043d\u0434\u0435\u043a\u0441.\u041f\u043e\u0447\u0442\u0430 \u043f\u043e imap \u0438 smtp. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0443\u0436\u043d\u043e \u0434\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u0432 \u0441\u0432\u043e\u0435\u0439 \u0443\u0447\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u043d\u0430 \u043a\u043e\u043d\u043d\u0435\u043a\u0442 \u043f\u043e imap \u0438 smtp.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0417\u0430\u0445\u043e\u0434\u0438\u043c \u0432 \u0441\u0432\u043e\u0439 \u0430\u043a\u043a\u0430\u0443\u043d\u0442 \u042f\u043d\u0434\u0435\u043a\u0441.\u041f\u043e\u0447\u0442\u0430. \u041f\u043e\u0447\u0442\u0430->\u0412\u0441\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0421\u0442\u0430\u0432\u0438\u043c \u0433\u0430\u043b\u043e\u0447\u043a\u0443 \u043d\u0430\u043f\u0440\u043e\u0442\u0438\u0432 \u041f\u0430\u0440\u043e\u043b\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438 OAuth-\u0442\u043e\u043a\u0435\u043d\u044b. \u0413\u043e\u0442\u043e\u0432\u043e, \u0438\u0434\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<p>\u0423 \u042f\u043d\u0434\u0435\u043a\u0441\u0430 \u0435\u0441\u0442\u044c<a href=\"https:\/\/yandex.ru\/dev\/\"> API \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432<\/a>, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0435\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u043c\u0435\u0447\u0442\u044b \u0438 \u0438\u0434\u0435\u0438 \u0432 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u0414\u043b\u044f OAuth2-\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e imap \u0438 smtp \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0439 <a href=\"https:\/\/yandex.ru\/dev\/oauth\/doc\/imap\/index.html\">\u043c\u0430\u043d\u0443\u0430\u043b<\/a>. <a href=\"https:\/\/oauth.yandex.ru\/client\/new\/id\">\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435<\/a> \u0438 \u0438\u0437\u0443\u0447\u0430\u0435\u043c \u043c\u0430\u043d\u0443\u0430\u043b.<\/p>\n<p>\u0417\u0430\u0445\u043e\u0434\u0438\u043c \u0432 \u043d\u0430\u0448\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u042f\u043d\u0434\u0435\u043a\u0441.OAuth. \u0412 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c Callback URL \u2013<strong> <\/strong>\u0442\u0430\u043a\u0438\u0435, \u043a\u0430\u043a \u043d\u0430 \u0441\u043a\u0440\u0438\u043d\u0435.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u043d\u0430\u0432\u044b\u043a\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u042f\u043d\u0434\u0435\u043a\u0441\u0430, \u043b\u0438\u0431\u043e \u0447\u0435\u0440\u0435\u0437 \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f: \u0432\u0435\u0440\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 -> access_token. \u041c\u043d\u0435 \u043d\u0435 \u0437\u0430\u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043f\u0438\u0441\u0430\u0442\u044c OAuth-\u0441\u0435\u0440\u0432\u0435\u0440, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0432\u044b\u0431\u0440\u0430\u043b \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u043f\u043e \u0441\u0443\u0442\u0438 \u0433\u043e\u0442\u043e\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u0442 \u0441\u0430\u043c\u043e\u0433\u043e \u042f\u043d\u0434\u0435\u043a\u0441\u0430. \u0415\u0441\u043b\u0438 \u043a\u0442\u043e-\u0442\u043e \u0432\u044b\u0431\u0435\u0440\u0435\u0442 \u0432\u0442\u043e\u0440\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u0442\u043e \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/yandex.ru\/dev\/direct\/doc\/examples-v5\/python3-requests-token.html\">\u0442\u0443\u0442<\/a> \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f OAuth-\u0442\u043e\u043a\u0435\u043da \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u043c \u043d\u0430 python.<\/p>\n<p>\u0414\u0430\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c API \u042f\u043d\u0434\u0435\u043a\u0441 ID \u0438 \u042f\u043d\u0434\u0435\u043a\u0441.\u041f\u043e\u0447\u0442\u0430:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043f\u043e imap<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">def get_email_address_list(access_token: str, sender_email: str) -> list:     try:         xoauth2_token = f\"user={sender_email}\\x01auth=Bearer {access_token}\\x01\\x01\"         imap = imaplib.IMAP4_SSL(host='imap.yandex.com')         imap.authenticate(\"XOAUTH2\", lambda x: xoauth2_token)         status, messages = imap.select(\"INBOX\")         messages = int(messages[0])         messages_count = 0         if messages >= 30:             messages_count = 30         elif messages &lt; 30:             messages_count = messages         while messages_count:             messages_count -= 1             res, msg = imap.fetch(str(messages - messages_count), \"(RFC822)\")             for response in msg:                 if isinstance(response, tuple):                     msg = email.message_from_bytes(response[1])                     sender_data = decode_header(msg.get(\"From\"))                     if len(sender_data) == 2:                         sender_name, encoding = sender_data[0]                         sender_email, type_email = sender_data[1]                         if isinstance(sender_name, bytes) and isinstance(sender_email, bytes):                             sender_name = sender_name.decode(encoding)                             sender_name = ''.join(sender_name.split()).lower()                             sender_email = sender_email.decode(encoding).replace(\"&lt;\", \"\") \\                                 .replace(\">\", \"\").replace(\" \", \"\")                             sender_email = sender_email.lower()                             email_address_list.append(sender_name + \":\" + sender_email)                                          imap.close()         imap.logout()              except Exception:         return []          return email_address_list<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u043f\u043e imap, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u043f\u0438\u0441\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 30, \u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043a\u043b\u0430\u0434\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u00ab\u0438\u043c\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f: \u0430\u0434\u0440\u0435\u0441 \u043f\u043e\u0447\u0442\u044b\u00bb. \u042f \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e \u043b\u0438\u043c\u0438\u0442 \u0432 30 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u0442\u0430\u043a \u043a\u0430\u043a \u0432\u0435\u0431\u0445\u0443\u043a \u0434\u043e\u043b\u0436\u0435\u043d \u0434\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u042f\u043d\u0434\u0435\u043a\u0441\u0430 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0438 3 \u0441\u0435\u043a\u0443\u043d\u0434, \u0438\u043d\u0430\u0447\u0435 \u0410\u043b\u0438\u0441\u0430 \u0432\u0435\u0440\u043d\u0435\u0442 \u043e\u0442\u0432\u0435\u0442, \u0447\u0442\u043e \u0432\u0435\u0431\u0445\u0443\u043a \u043d\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442. \u041a\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439, \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0435 \u0443\u0441\u043f\u0435\u0432\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u0431\u0440\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 30 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043e\u0442\u0432\u0435\u0442 \u0437\u0430 3 \u0441\u0435\u043a.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043f\u043e smtp<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">def get_email_data_list(email_data_str: str) -> list:     email_data_list = email_data_str.split(\"@\")     return email_data_list    def send_email(access_token: str, sender_email_name: str, sender_email: str, recipient_email_name: str,                recipient_email: str, subject: str, message: str) -> bool:     try:         just_a_str = f\"user={sender_email}\\x01auth=Bearer {access_token}\\x01\\x01\"         xoauth2_token = base64.b64encode(bytes(just_a_str, 'utf-8')).decode('utf-8')          sender_email_login = get_email_data_list(sender_email)[0]         sender_email_domain = get_email_data_list(sender_email)[1]         recipient_email_login = get_email_data_list(recipient_email)[0]         recipient_email_domain = get_email_data_list(recipient_email)[1]          msg = EmailMessage()         msg['Subject'] = subject         msg['From'] = Address(sender_email_name, sender_email_login, sender_email_domain)         msg['To'] = Address(recipient_email_name, recipient_email_login, recipient_email_domain)         msg.set_content(message)          smtp = smtplib.SMTP_SSL(host='smtp.yandex.ru', port=465)         smtp.connect(host='smtp.yandex.ru', port=465)         smtp.docmd(\"auth\", f\"XOAUTH2 {xoauth2_token}\")         smtp.sendmail(sender_email, recipient_email, msg.as_string())         smtp.quit()     except Exception:         return False          return True<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u043e smtp, \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0442\u0435\u043c\u0443 \u043f\u0438\u0441\u044c\u043c\u0430, email \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f, email \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f \u0438 \u0442\u0435\u043a\u0441\u0442. \u0424\u0443\u043d\u043a\u0446\u0438\u044f send_email \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0438\u0441\u044c\u043c\u043e \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 True, \u0435\u0441\u043b\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u043d\u0430, \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u043d\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 False.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u0430\u0432\u044b\u043a \u0432 \u042f\u043d\u0434\u0435\u043a\u0441.\u0414\u0438\u0430\u043b\u043e\u0433\u0430\u0445.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u0438\u0430\u043b\u043e\u0433.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u041d\u0430\u0432\u044b\u043a \u0432 \u0410\u043b\u0438\u0441\u0435<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043f\u043e\u043b\u044f. \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0418\u043c\u044f \u043d\u0430\u0432\u044b\u043a\u0430, Webhook URL, \u0422\u0438\u043f \u0434\u043e\u0441\u0442\u0443\u043f\u0430.<\/p>\n<p>Webhook URL \u2013 \u044d\u0442\u043e \u043d\u0430\u0448 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440, \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043d\u0430 ngrok. \u0421 \u043d\u0435\u0433\u043e \u0431\u0443\u0434\u0443\u0442 \u0441\u043b\u0430\u0442\u044c\u0441\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a \u0410\u043b\u0438\u0441\u0435. \u0422\u0438\u043f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u044f \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u043c.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0412 \u0441\u0432\u044f\u0437\u043a\u0435 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u043e\u0432 \u043d\u0430\u0434\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0441\u0435\u043a\u0440\u0435\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u2013 \u044d\u0442\u043e ClientID \u0438 Client secret \u0432 \u042f\u043d\u0434\u0435\u043a\u0441.OAuth.<\/p>\n<p>URL \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438, URL \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u043e\u043a\u0435\u043d\u0430 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0442\u0430\u043a\u0436\u0435, \u043a\u0430\u043a \u043d\u0430 \u0441\u043a\u0440\u0438\u043d\u0435. \u042d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0443\u0436\u043d\u044b, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u043c\u043e\u0433 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u0440\u0432\u0438\u0441 \u042f\u043d\u0434\u0435\u043a\u0441\u0430 \u0432 \u043d\u0430\u0432\u044b\u043a\u0435 \u0438 \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u043c\u043e\u0433\u043b\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c access_token \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0435\u0439 \u043b\u043e\u0433\u0438\u043a\u0438.<\/p>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0434\u043b\u044f \u0410\u043b\u0438\u0441\u044b.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434 \u0444\u0430\u0439\u043b\u0430 app.py<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">from bottle import request, post, default_app from mail_tools import get_sender_email_data, send_email, get_recipient_email_text, get_email_obj_text, \\     get_email_address_list import json import re  response_texts  = [] response_ttss = []   @post('\/') def work():     try:         response = {             \"version\": request.json[\"version\"],             \"session\": request.json[\"session\"],             \"response\": {                 \"end_session\": False             }         }         req = request.json          if req[\"session\"][\"new\"] or req[\"request\"][\"original_utterance\"].lower().strip() in [\"\u043f\u0440\u0438\u0432\u0435\u0442\", \"\u0445\u0430\u0439\", \"\u0434\u0430\u0440\u043e\u0432\u0430\",                                                                                              \"\u043a\u0443\",                                                                                              \"\u0434\u0430\u0440\u043e\u0432\", \"\u0437\u0434\u0430\u0440\u043e\u0432\u0430\",                                                                                              \"hello\", \"hi\"]:             response[\"response\"][\"text\"] = \"\u041f\u0440\u0438\u0432\u0435\u0442, \u043d\u0430\u0432\u044b\u043a \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u043e\u0447\u0442\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0443\u043c\u043d\u043e\u0433\u043e \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u0430.\" \\                                            \"\u0427\u0442\u043e\u0431\u044b \u043d\u0430\u0447\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u044c\u0442\u0435 '\u0441\u0442\u0430\u0440\u0442'. \u0414\u043b\u044f \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u043d\u0430\u0432\u044b\u043a\u0430 \" \\                                            \"\u043e\u0442\u0432\u0435\u0442\u044c\u0442\u0435 '\u043f\u043e\u043a\u0430' \u0438\u043b\u0438 '\u0441\u0442\u043e\u043f'.\"             response[\"response\"][\"tts\"] = \"\u041f\u0440\u0438\u0432+\u0435\u0442, \u043d+\u0430\u0432\u044b\u043a \u043f\u043e\u0437\u0432\u043e\u043b+\u044f\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b+\u044f\u0442\u044c \u043f+\u043e\u0447\u0442\u0443 \u0441 \u043f+\u043e\u043c\u043e\u0449\u044c\u044e \u0443\u043c\u043d\u043e\u0433\u043e \u0430\u0441\u0441\u0438\u0441\u0442+\u0435\u043d\u0442\u0430. \" \\                                           \"\u0427\u0442+\u043e\u0431\u044b \u043d\u0430\u0447+\u0430\u0442\u044c \u043e\u0442\u0432+\u0435\u0442\u044c\u0442\u0435 \u0441\u0442\u0430\u0440\u0442. \u0414\u043b\u044f \u0432+\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u043d+\u0430\u0432\u044b\u043a\u0430 \" \\                                           \"\u043e\u0442\u0432+\u0435\u0442\u044c\u0442\u0435 \u043f\u043e\u043a+\u0430 \u0438\u043b\u0438 \u0441\u0442\u043e\u043f. \"             response_texts.append(response[\"response\"][\"text\"])             response_ttss.append(response[\"response\"][\"tts\"])         else:             try:                 if req[\"request\"][\"original_utterance\"].lower().strip() in [\"\u0441\u0442\u043e\u043f\", \"\u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0438\",                                                                             \"\u043d\u0435 \u043d\u0430\u0434\u043e\", \"\u0432\u0441\u0435\", \"\u0445\u0432\u0430\u0442\u0438\u0442\",                                                                             \"\u043f\u043e\u043a\u0430\", \"\u0434\u043e \u0441\u0432\u0438\u0434\u0430\u043d\u0438\u044f\", \"\u043a\u043e\u043d\u0435\u0446\",                                <\/code><\/pre>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-344387","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/344387","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=344387"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/344387\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=344387"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=344387"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=344387"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}