Найти - Пользователи
Полная версия: Отправка сообщений на почту через ТГ бота на aiogram
Начало » Python для новичков » Отправка сообщений на почту через ТГ бота на aiogram
1
PotatoFish96
Здравствуйте! У меня возникла проблема, а именно:
При завершении машины состояний, введенные данные пользователя, должны отправляться по определённому EMAIL адресу, я вписал в конец машины состояний функцию отправки сообщений, и при завершении, когда данные должны отправляться на почту, у меня вылезает ошибка. Прошу вас помочь разобраться в проблеме!
PotatoFish96
 #----Импорт библиотек--------
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'
ZerG
Ошибку разумеется мы должны угдадать?
PotatoFish96
ZerG
Ошибку разумеется мы должны угадать?
Обновил
FishHook
PotatoFish96
addr_from = email

email у вас это функция, объявленная выше. А нужна то строка
PotatoFish96
FishHook
PotatoFish96addr_from = email у вас это функция, объявленная выше. А нужна то строка
Здравствуйте! Извините что так поздно отвечаю. У меня всё заработало, спасибо вам большое!
lilalik
Здравствуйте! как вы решили данную ситуацию?
lilalik
Как вы решили данную ошибку?
amorapotter
FishHook
PotatoFish96addr_from = emailemail у вас это функция, объявленная выше. А нужна то строка
Проверьте, что ваше приложение имеет доступ к SMTP-серверу (smtp.mail.ru) и что ваш аккаунт на почтовом сервере настроен для использования сторонних приложений
mapquest directions
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB