Не работает кнопка назад в настройках профиля

если что токен у меня введен это я сюда написал без токена не работает кнопка назад в настройках > настройки профиля не понимаю почему объясните пожалуйста

import os
import json
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import Application, CommandHandler, CallbackQueryHandler, MessageHandler, filters, ContextTypes

# Путь к файлам с настройками
SETTINGS_FILE = 'settings.json'

# Путь к директории для сохранения файлов
TEMPLATES_DIR = 'templates'

# Создание директории, если её нет
if not os.path.exists(TEMPLATES_DIR):
    os.makedirs(TEMPLATES_DIR)

# Загрузка настроек из файла
def load_settings():
    if os.path.exists(SETTINGS_FILE):
        with open(SETTINGS_FILE, 'r') as file:
            data = json.load(file)
            if "emails" not in data:
                data["emails"] = []
            if "templates" not in data:
                data["templates"] = []
            if "themes" not in data:
                data["themes"] = []
            return data
    else:
        return {"emails": [], "templates": [], "themes": []}

# Сохранение настроек в файл
def save_settings(settings):
    with open(SETTINGS_FILE, 'w') as file:
        json.dump(settings, file, indent=4)

# Настройки по умолчанию
settings = load_settings()

# Начало работы бота
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    """Обработчик команды /start"""
    if update.message:
        keyboard = [
            [InlineKeyboardButton("Отправить письмо", callback_data='send_email')],
            [InlineKeyboardButton("Настройки", callback_data='settings')],
        ]
        reply_markup = InlineKeyboardMarkup(keyboard)
        await update.message.reply_text('Добро пожаловать в почтовый бот. Выберите опцию:', reply_markup=reply_markup)

# Обработка нажатий кнопок
async def handle_settings(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    """Обработчик нажатий на кнопки меню"""
    query = update.callback_query

    # Проверка на корректность вызова
    if query is None:
        return

    try:
        await query.answer()
    except Exception as e:
        print(f"Ошибка при ответе на запрос: {e}")
        return

    # Восстановление предыдущего меню из chat_data
    previous_menu = context.chat_data.get('previous_menu', 'start')

    if query.data == 'send_email':
        if settings["templates"]:
            keyboard = [
                [InlineKeyboardButton(f"Выбрать шаблон '{template['subject']}'", callback_data=f"select_template_{i}")]
                for i, template in enumerate(settings["templates"])
            ]
            reply_markup = InlineKeyboardMarkup(keyboard)
            try:
                await query.edit_message_text(text=" Выберите шаблон для отправки письма:", reply_markup=reply_markup)
            except Exception as e:
                print(f"Ошибка при редактировании сообщения: {e}")
        else:
            try:
                await query.edit_message_text(text="Список шаблонов пуст. Добавьте шаблон через настройки.")
            except Exception as e:
                print(f"Ошибка при редактировании сообщения: {e}")
    elif query.data == 'settings':
        keyboard = [
            [InlineKeyboardButton("Настройки почт", callback_data='list_emails')],
            [InlineKeyboardButton("Настройки шаблонов", callback_data='manage_templates')],
            [InlineKeyboardButton("Настройки тем", callback_data='manage_themes')],
            [InlineKeyboardButton("Назад", callback_data='start')],
        ]
        reply_markup = InlineKeyboardMarkup(keyboard)
        try:
            await query.edit_message_text(text="Настройки пользователя:", reply_markup=reply_markup)
        except Exception as e:
            print(f"Ошибка при редактировании сообщения: {e}")
        context.chat_data['previous_menu'] = 'start'
    elif query.data.startswith('select_template_'):
        index = int(query.data.split('_')[-1])
        if 0 <= index < len(settings["templates"]):
            context.chat_data['selected_template'] = settings["templates"][index]
            if settings["themes"]:
                keyboard = [
                    [InlineKeyboardButton(f"Выбрать тему '{theme}'", callback_data=f"select_theme_{i}")]
                    for i, theme in enumerate(settings["themes"])
                ]
                reply_markup = InlineKeyboardMarkup(keyboard)
                try:
                    await query.edit_message_text(
                        text=f"Выбран шаблон '{settings['templates'][index]['subject']}'.\nВыберите тему для письма:",
                        reply_markup=reply_markup
                    )
                except Exception as e:
                    print(f"Ошибка при редактировании сообщения: {e}")
            else:
                try:
                    await query.edit_message_text(
                        text=f"Выбран шаблон '{settings['templates'][index]['subject']}'.\nВведите почту получателя:"
                    )
                except Exception as e:
                    print(f"Ошибка при редактировании сообщения: {e}")
                context.chat_data['step'] = 'recipient'
        else:
            try:
                await query.edit_message_text(text="Ошибка: некорректный индекс.")
            except Exception as e:
                print(f"Ошибка при редактировании сообщения: {e}")
    elif query.data.startswith('select_theme_'):
        index = int(query.data.split('_')[-1])
        if 0 <= index < len(settings["themes"]):
            context.chat_data['selected_theme'] = settings["themes"][index]
            try:
                await query.edit_message_text(
                    text=f"Выбрана тема '{settings['themes'][index]}'.\nВведите почту получателя:"
                )
            except Exception as e:
                print(f"Ошибка при редактировании сообщения: {e}")
            context.chat_data['step'] = 'recipient'
        else:
            try:
                await query.edit_message_text(text="Ошибка: некорректный индекс.")
            except Exception as e:
                print(f"Ошибка при редактировании сообщения: {e}")
    elif query.data == 'list_emails':
        if settings["emails"]:
            keyboard = [
                [InlineKeyboardButton(f"Удалить почту '{email['email']}'", callback_data=f"delete_email_{i}")]
                for i, email in enumerate(settings["emails"])
            ]
            keyboard.append([InlineKeyboardButton("Добавить почту", callback_data='add_email')])
            keyboard.append([InlineKeyboardButton("Назад", callback_data='settings')])
            reply_markup = InlineKeyboardMarkup(keyboard)
            emails_list = "\n".join(f"{i + 1}. {email['email']}" for i, email in enumerate(settings["emails"]))
            try:
                await query.edit_message_text(text=f"Список почт:\n{emails_list}", reply_markup=reply_markup)
            except Exception as e:
                print(f"Ошибка при редактировании сообщения: {e}")
        else:
            keyboard = [
                [InlineKeyboardButton("Добавить почту", callback_data='add_email')],
                [InlineKeyboardButton("Назад", callback_data='settings')]
            ]
            reply_markup = InlineKeyboardMarkup(keyboard)
            try:
                await query.edit_message_text(text="Список почт пуст. Добавьте новую почту:", reply_markup=reply_markup)
            except Exception as e:
                print(f"Ошибка при редактировании сообщения: {e}")
    elif query.data == 'manage_templates':
        if settings["templates"]:
            keyboard = [
                [InlineKeyboardButton(f"Удалить шаблон '{template['subject']}'", callback_data=f"delete_template_{i}")]
                for i, template in enumerate(settings["templates"])
            ]
            keyboard.append([InlineKeyboardButton("Добавить шаблон", callback_data='add_template')])
            keyboard.append([InlineKeyboardButton("Назад", callback_data='settings')])
            reply_markup = InlineKeyboardMarkup(keyboard)
            templates_list = "\n".join(
                f"{i + 1}. {template['subject']}" for i, template in enumerate(settings["templates"]))
            try:
                await query.edit_message_text(text=f"Список шаблонов:\n{templates_list}", reply_markup=reply_markup)
            except Exception as e:
                print(f"Ошибка при редактировании сообщения: {e}")
        else:
            keyboard = [
                [InlineKeyboardButton("Добавить шаблон", callback_data='add_template')],
                [InlineKeyboardButton("Назад", callback_data='settings')]
            ]
            reply_markup = InlineKeyboardMarkup(keyboard)
            try:
                await query.edit_message_text(text="Список шаблонов пуст. Добавьте новый шаблон:", reply_markup=reply_markup)
            except Exception as e:
                print(f"Ошибка при редактировании сообщения: {e}")
    elif query.data == 'manage_themes':
        if settings["themes"]:
            keyboard = [
                [InlineKeyboardButton(f"Удалить тему '{theme}'", callback_data=f"delete_theme_{i}")]
                for i, theme in enumerate(settings["themes"])
            ]
            keyboard.append([InlineKeyboardButton("Добавить тему", callback_data='add_theme')])
            keyboard.append([InlineKeyboardButton("Назад", callback_data='settings')])
            reply_markup = InlineKeyboardMarkup(keyboard)
            themes_list = "\n".join(f"{i + 1}. {theme}" for i, theme in enumerate(settings["themes"]))
            try:
                await query.edit_message_text(text=f"Список тем:\n{themes_list}", reply_markup=reply_markup)
            except Exception as e:
                print(f"Ошибка при редактировании сообщения: {e}")
        else:
            keyboard = [
                [InlineKeyboardButton("Добавить тему", callback_data='add_theme')],
                [InlineKeyboardButton("Назад", callback_data='settings')]
            ]
            reply_markup = InlineKeyboardMarkup(keyboard)
            try:
                await query.edit_message_text(text="Список тем пуст. Добавьте новую тему:", reply_markup=reply_markup)
            except Exception as e:
                print(f"Ошибка при редактировании сообщения: {e}")
    elif query.data.startswith('delete_email_'):
        index = int(query.data.split('_')[-1])
        if 0 <= index < len(settings["emails"]):
            removed_email = settings["emails"].pop(index)
            save_settings(settings)
            try:
                await query.edit_message_text(text=f"Почта '{removed_email['email']}' удалена.")
            except Exception as e:
                print(f"Ошибка при редактировании сообщения: {e}")
            await handle_settings(update, context)
        else:
            try:
                await query.edit_message_text(text="Ошибка: некорректный индекс.")
            except Exception as e:
                print(f"Ошибка при редактировании сообщения: {e}")
    elif query.data.startswith('delete_template_'):
        index = int(query.data.split('_')[-1])
        if 0 <= index < len(settings["templates"]):
            removed_template = settings["templates"].pop(index)
            os.remove(removed_template['file_path'])
            save_settings(settings)
            try:
                await query.edit_message_text(text=f"Шаблон '{removed_template['subject']}' удален.")
            except Exception as e:
                print(f"Ошибка при редактировании сообщения: {e}")
            await handle_settings(update, context)
        else:
            try:
                await query.edit_message_text(text="Ошибка: некорректный индекс.")
            except Exception as e:
                print(f"Ошибка при редактировании сообщения: {e}")
    elif query.data.startswith('delete_theme_'):
        index = int(query.data.split('_')[-1])
        if 0 <= index < len(settings["themes"]):
            removed_theme = settings["themes"].pop(index)
            save_settings(settings)
            try:
                await query.edit_message_text(text=f"Тема '{removed_theme}' удалена.")
            except Exception as e:
                print(f"Ошибка при редактировании сообщения: {e}")
            await handle_settings(update, context)
        else:
            try:
                await query.edit_message_text(text="Ошибка: некорректный индекс.")
            except Exception as e:
                print(f"Ошибка при редактировании сообщения: {e}")
    elif query.data == 'add_email':
        context.chat_data['step'] = 'email'
        try:
            await query.edit_message_text("Введите адрес электронной почты:")
        except Exception as e:
            print(f"Ошибка при редактировании сообщения: {e}")
    elif query.data == 'add_template':
        context.chat_data['step'] = 'template_name'
        try:
            await query.edit_message_text("Введите название для шаблона:")
        except Exception as e:
            print(f"Ошибка при редактировании сообщения: {e}")
    elif query.data == 'add_theme':
        context.chat_data['step'] = 'theme_name'
        try:
            await query.edit_message_text("Введите название для темы:")
        except Exception as e:
            print(f"Ошибка при редактировании сообщения: {e}")
    elif query.data == 'start':
        await start(update, context)
    elif query.data == 'settings':
        await handle_settings(update, context)  # Вернуться к настройкам

# Обработка сообщений от пользователя
async def receive_message(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    """Обработка сообщений от пользователя"""
    if context.chat_data.get('step') == 'recipient':
        recipient = update.message.text
        template = context.chat_data.get('selected_template')
        theme = context.chat_data.get('selected_theme', "Тема по умолчанию")
        try:
            send_email(recipient, template['file_path'], theme)
            await update.message.reply_text("Сообщение отправлено!")
        except smtplib.SMTPConnectError:
            await update.message.reply_text("Ошибка подключения к SMTP серверу. Проверьте настройки.")
        except smtplib.SMTPAuthenticationError:
            await update.message.reply_text("Ошибка аутентификации. Проверьте логин и пароль.")
        except smtplib.SMTPException as e:
            await update.message.reply_text(f"Ошибка при отправке сообщения: {str(e)}")
        except Exception as e:
            await update.message.reply_text(f"Неизвестная ошибка: {str(e)}")
        finally:
            context.chat_data.pop('selected_template', None)
            context.chat_data.pop('selected_theme', None)
            context.chat_data.pop('step', None)
    elif 'step' in context.chat_data:
        if context.chat_data['step'] == 'email':
            email_address = update.message.text
            if "@" in email_address and "." in email_address:
                context.chat_data['email_address'] = email_address
                context.chat_data['step'] = 'smtp_host'
                await update.message.reply_text("Введите хост SMTP:")
            else:
                await update.message.reply_text("Некорректный адрес электронной почты. Попробуйте снова.")
        elif context.chat_data['step'] == 'smtp_host':
            context.chat_data['smtp_host'] = update.message.text
            context.chat_data['step'] = 'smtp_port'
            await update.message.reply_text("Введите порт SMTP:")
        elif context.chat_data['step'] == 'smtp_port':
            try:
                context.chat_data['smtp_port'] = int(update.message.text)
                context.chat_data['step'] = 'password'
                await update.message.reply_text("Введите пароль:")
            except ValueError:
                await update.message.reply_text("Некорректный порт. Попробуйте снова.")
        elif context.chat_data['step'] == 'password':
            password = update.message.text
            settings["emails"].append({
                "email": context.chat_data['email_address'],
                "password": password,
                "smtp_host": context.chat_data['smtp_host'],
                "smtp_port": context.chat_data['smtp_port']
            })
            save_settings(settings)
            await update.message.reply_text(f"Почта '{context.chat_data['email_address']}' добавлена.")
            context.chat_data.pop('step', None)
            await handle_settings(update, context)  # Обновляем список почт
        elif context.chat_data['step'] == 'template_name':
            template_name = update.message.text
            context.chat_data['template_name'] = template_name
            context.chat_data['step'] = 'template_file'
            await update.message.reply_text("Прикрепите файл шаблона (html):")
        elif context.chat_data['step'] == 'template_file':
            if update.message.document:
                file = update.message.document.get_file()
                file_path = os.path.join(TEMPLATES_DIR, update.message.document.file_name)
                file.download(file_path)
                settings["templates"].append({"subject": context.chat_data.get('template_name'), "file_path": file_path})
                save_settings(settings)
                await update.message.reply_text(f"Шаблон '{context.chat_data.get('template_name')}' добавлен.")
                context.chat_data.pop('step', None)
                await handle_settings(update, context)  # Обновляем список шаблонов
            else:
                await update.message.reply_text("Пожалуйста, прикрепите файл шаблона.")
        elif context.chat_data['step'] == 'theme_name':
            theme_name = update.message.text
            if theme_name not in settings["themes"]:
                settings["themes"].append(theme_name)
                save_settings(settings)
                await update.message.reply_text(f"Тема '{theme_name}' добавлена.")
            else:
                await update.message.reply_text(f"Тема '{theme_name}' уже существует.")
            context.chat_data.pop('step', None)
            await handle_settings(update, context)  # Обновляем список тем
    else:
        if update.message:
            await update.message.reply_text("Команда не распознана. Используйте /start для начала.")

def send_email(recipient, template_path, theme):
    """Отправка сообщения по электронной почте"""
    for email in settings["emails"]:
        try:
            msg = MIMEMultipart()
            msg['From'] = email['email']
            msg['To'] = recipient
            msg['Subject'] = theme
            with open(template_path, 'r') as file:
                msg.attach(MIMEText(file.read(), 'html'))
            with smtplib.SMTP(email['smtp_host'], email['smtp_port']) as server:
                server.starttls()
                server.login(email['email'], email['password'])
                server.send_message(msg)
        except Exception as e:
            print(f"Ошибка при отправке сообщения: {e}")

def main() -> None:
    """Запуск бота"""
    application = Application.builder().token("токен").build()

    # Обработчики команд и сообщений
    application.add_handler(CommandHandler("start", start))
    application.add_handler(CallbackQueryHandler(handle_settings))
    application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, receive_message))

    # Запуск бота
    application.run_polling()

if __name__ == '__main__':
    main()


Ответы (0 шт):