#----Импорт библиотек--------
import logging
from aiogram import Bot, types, Dispatcher, executor
from aiogram.dispatcher.filters.state import StatesGroup, State
from aiogram.dispatcher import FSMContext
from config import token, email, password
from states import Email
from aiogram.contrib.fsm_storage.memory import MemoryStorage
import smtplib
import os
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
#-----Токен бота + HTML разметка и Диспетчер-----
bot = Bot(token=token, parse_mode=types.ParseMode.HTML)
dp = Dispatcher(bot, storage=storage)
#-----Запоминание состояния в опер.памяти------
storage = MemoryStorage()
#------Логи-----------
logging.basicConfig(level=logging.INFO)
#------Команда /start----------
@dp.message_handler(commands=('start'))
async def start_command(message: types.Message):
await message.reply("Привет, я бот Гоша!\nЧто бы отправить от меня Email, напиши /email")
#-------Команда /email которая вызывает машину состояний-------
@dp.message_handler(commands=('email'))
async def email(message: types.message):
await message.answer('Привет! Ты начал(а) заполнять форму на заявку! \nВведите своё полное ФИО: ')
await Email.Test1.set()
#---------Состояние 1------------------------
@dp.message_handler(state=Email.Test1)
async def state1(message: types.message, state: FSMContext):
answer = message.text
await state.update_data(Test1=answer)
await message.answer('Введите свои контактные данные для обратной связи (Email или Номер телефoна)')
await Email.Test2.set()
#---------Состояние 2------------------------
@dp.message_handler(state=Email.Test2)
async def state2(message: types.message, state: FSMContext):
answer = message.text
await state.update_data(Test2=answer)
await message.answer('Введите Сообщение, которое хотите отправить')
await Email.Test3.set()
#---------Состояние 3------------------------
@dp.message_handler(state=Email.Test3)
async def state3(message: types.message, state: FSMContext):
answer = message.text
await state.update_data(Test3=answer)
#-----Берёт значения из data---------
data = await state.get_data()
name = data.get('Test1')
contact = data.get('Test2')
msg = data.get('Test3')
await message.answer(f'{message.from_user.full_name}, вот письмо составленное вами:\n'
f'Ваше ФИО: <b>{name}</b>\n'
f'Ваша почта/номер телефона: <b>{contact}</b>\n'
f'Ваше сообщение: <b>{msg}</b>')
#------Та самая функция, которая отправляет результаты на Email address-------
addr_from = email
addr_to = 'EMAIL@mail.ru'
mgs = MIMEMultipart()
mgs['From'] = addr_from
mgs['To'] = addr_to
mgs['Subject'] = 'Новая заявка!'
body = (f'''
Автор заявки {name}
Контакты для обратной связи {contact}
Текст заявки: {msg}
''')
mgs.attach(MIMEText(body, 'plain'))
smtpObj = smtplib.SMTP('smtp.mail.ru', 587)
smtpObj.starttls()
smtpObj.login(addr_from, password)
smtpObj.send_message(mgs)
smtpObj.quit()
#---------Выход из машины состояний-----------
await state.finish()
#---------Команда /help ----------------------
@dp.message_handler(commands=('help'))
async def process_help_command(message: types.Message):
await message.reply('Я создан для отправки писем через себя! Напиши /start чтоб начать!')
if __name__ == '__main__':
executor.start_polling(dp)
Ошибка:
ERROR:asyncio:Task exception was never retrieved
future: <Task finished name='Task-20' coro=<Dispatcher._process_polling_updates() done, defined at C:\Users\Dima\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\aiogram\dispatcher\dispatcher.py:407> exception=AttributeError("'function' object has no attribute 'encode'")>
Traceback (most recent call last):
File "C:\Users\Dima\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\aiogram\dispatcher\dispatcher.py", line 415, in _process_polling_updates
for responses in itertools.chain.from_iterable(await self.process_updates(updates, fast)):
File "C:\Users\Dima\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\aiogram\dispatcher\dispatcher.py", line 235, in process_updates
return await asyncio.gather(*tasks)
File "C:\Users\Dima\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\aiogram\dispatcher\handler.py", line 116, in notify
response = await handler_obj.handler(*args, **partial_data)
File "C:\Users\Dima\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\aiogram\dispatcher\dispatcher.py", line 256, in process_update
return await self.message_handlers.notify(update.message)
File "C:\Users\Dima\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\aiogram\dispatcher\handler.py", line 116, in notify
response = await handler_obj.handler(*args, **partial_data)
File "main.py", line 73, in state3
smtpObj.login(addr_from, password)
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.2800.0_x64__qbz5n2kfra8p0\lib\smtplib.py", line 732, in login
(code, resp) = self.auth(
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.2800.0_x64__qbz5n2kfra8p0\lib\smtplib.py", line 634, in auth
response = encode_base64(initial_response.encode('ascii'), eol='')
AttributeError: 'function' object has no attribute 'encode'