Всем доброго времени суток. Я новичок самоучка, пытаюсь написать телеграм бота с функцией отправки запросов пользователя на почту. Вот сам код:
aiogram 3.6
python 3.12
from aiogram import Bot, Dispatcher, F
from aiogram.filters import CommandStart
from aiogram.types import (KeyboardButton, Message, ReplyKeyboardMarkup,
ReplyKeyboardRemove, ForceReply)
import aiohttp
import smtplib
from email.message import EmailMessage
# Ваши настройки
BOT_TOKEN = 'Токен'
EMAIL_ADDRESS = 'почта'
bot = Bot(token=BOT_TOKEN)
dp = Dispatcher()
start_keyboard = ReplyKeyboardMarkup(keyboard=[
[KeyboardButton(text="Презентация")],
[KeyboardButton(text="Копирайтинг")],
[KeyboardButton(text="Верстка письма")],
[KeyboardButton(text="Контент-план")],
], resize_keyboard=True)
copywriting_keyboard = ReplyKeyboardMarkup(keyboard=[
[KeyboardButton(text="Статья"), KeyboardButton(text="Сценарий")],
[KeyboardButton(text="Рерайтинг"), KeyboardButton(text="Назад")]
], resize_keyboard=True)
article_form = ReplyKeyboardMarkup(keyboard=[
[KeyboardButton(text="Тема")],
[KeyboardButton(text="Объём")],
[KeyboardButton(text="Цель статьи")],
[KeyboardButton(text="Отправить заявку")],
], resize_keyboard=True)
SMTP_SERVER = 'smtp.yandex.ru'
SMTP_PORT = 587
EMAIL_USERNAME = 'почта'
EMAIL_PASSWORD = 'токен-пароль'
async def send_email(data):
msg = EmailMessage()
msg.set_content(f"Тема: {data['Тема']}\nОбъем: {data['Объём']}\nЦель статьи: {data['Цель статьи']}")
msg['Subject'] = 'Заказ статьи'
msg['From'] = EMAIL_USERNAME
msg['To'] = EMAIL_ADDRESS
with smtplib.SMTP(SMTP_SERVER, SMTP_PORT) as server:
server.starttls()
server.login(EMAIL_USERNAME, EMAIL_PASSWORD)
server.send_message(msg)
print("Данные заказа статьи отправлены на email.")
@dp.message(CommandStart())
async def process_start_command(message: Message):
await message.answer("Привет! Выберите услугу:", reply_markup=start_keyboard)
@dp.message(F.text == "Копирайтинг")
async def process_copywriting(message: Message):
await message.answer("Что вам нужно?", reply_markup=copywriting_keyboard)
data = {"Тема": "", "Объём": "", "Цель статьи": ""}
@dp.message(F.text == "Статья")
async def process_article(message: Message):
await message.answer("Пожалуйста, заполните форму:", reply_markup=article_form)
@dp.message(F.text == "Тема")
async def process_topic(message: Message):
global data
data["Тема"] = message.text
if data["Тема"]: # Проверка на наличие введенных данных
await message.answer("Тема статьи сохранена. Сколько слов должна содержать статья?")
else:
await message.answer("Пожалуйста, введите тему статьи.")
@dp.message(F.text == "Объём")
async def process_volume(message: Message):
global data
data["Объём"] = message.text
await message.answer("Объем статьи сохранен. Для какой цели вам нужна статья?")
@dp.message(F.text == "Цель статьи")
async def process_goal(message: Message):
global data
data["Цель статьи"] = message.text
await message.answer("Цель статьи сохранена. Вы можете отправить заявку.")
@dp.message(F.text == "Отправить заявку")
async def process_article_form(message: Message):
global data
# Отладочный вывод данных
print("Данные перед отправкой письма:")
print(data)
await send_email(data)
await message.answer("Ваша заявка принята! Мы свяжемся с вами в ближайшее время.")
@dp.message(F.text == "Назад")
async def process_back(message: Message):
await message.answer("Выберите услугу:", reply_markup=start_keyboard)
async def delete_webhook():
await bot.delete_webhook()
async def main():
await delete_webhook()
await dp.start_polling(bot)
if __name__ == '__main__':
import asyncio
asyncio.run(main())
aiogram 3.6
python 3.12
from aiogram import Bot, Dispatcher, F
from aiogram.filters import CommandStart
from aiogram.types import (KeyboardButton, Message, ReplyKeyboardMarkup,
ReplyKeyboardRemove, ForceReply)
import aiohttp
import smtplib
from email.message import EmailMessage
# Ваши настройки
BOT_TOKEN = 'Токен'
EMAIL_ADDRESS = 'почта'
bot = Bot(token=BOT_TOKEN)
dp = Dispatcher()
start_keyboard = ReplyKeyboardMarkup(keyboard=[
[KeyboardButton(text="Презентация")],
[KeyboardButton(text="Копирайтинг")],
[KeyboardButton(text="Верстка письма")],
[KeyboardButton(text="Контент-план")],
], resize_keyboard=True)
copywriting_keyboard = ReplyKeyboardMarkup(keyboard=[
[KeyboardButton(text="Статья"), KeyboardButton(text="Сценарий")],
[KeyboardButton(text="Рерайтинг"), KeyboardButton(text="Назад")]
], resize_keyboard=True)
article_form = ReplyKeyboardMarkup(keyboard=[
[KeyboardButton(text="Тема")],
[KeyboardButton(text="Объём")],
[KeyboardButton(text="Цель статьи")],
[KeyboardButton(text="Отправить заявку")],
], resize_keyboard=True)
SMTP_SERVER = 'smtp.yandex.ru'
SMTP_PORT = 587
EMAIL_USERNAME = 'почта'
EMAIL_PASSWORD = 'токен-пароль'
async def send_email(data):
msg = EmailMessage()
msg.set_content(f"Тема: {data['Тема']}\nОбъем: {data['Объём']}\nЦель статьи: {data['Цель статьи']}")
msg['Subject'] = 'Заказ статьи'
msg['From'] = EMAIL_USERNAME
msg['To'] = EMAIL_ADDRESS
with smtplib.SMTP(SMTP_SERVER, SMTP_PORT) as server:
server.starttls()
server.login(EMAIL_USERNAME, EMAIL_PASSWORD)
server.send_message(msg)
print("Данные заказа статьи отправлены на email.")
@dp.message(CommandStart())
async def process_start_command(message: Message):
await message.answer("Привет! Выберите услугу:", reply_markup=start_keyboard)
@dp.message(F.text == "Копирайтинг")
async def process_copywriting(message: Message):
await message.answer("Что вам нужно?", reply_markup=copywriting_keyboard)
data = {"Тема": "", "Объём": "", "Цель статьи": ""}
@dp.message(F.text == "Статья")
async def process_article(message: Message):
await message.answer("Пожалуйста, заполните форму:", reply_markup=article_form)
@dp.message(F.text == "Тема")
async def process_topic(message: Message):
global data
data["Тема"] = message.text
if data["Тема"]: # Проверка на наличие введенных данных
await message.answer("Тема статьи сохранена. Сколько слов должна содержать статья?")
else:
await message.answer("Пожалуйста, введите тему статьи.")
@dp.message(F.text == "Объём")
async def process_volume(message: Message):
global data
data["Объём"] = message.text
await message.answer("Объем статьи сохранен. Для какой цели вам нужна статья?")
@dp.message(F.text == "Цель статьи")
async def process_goal(message: Message):
global data
data["Цель статьи"] = message.text
await message.answer("Цель статьи сохранена. Вы можете отправить заявку.")
@dp.message(F.text == "Отправить заявку")
async def process_article_form(message: Message):
global data
# Отладочный вывод данных
print("Данные перед отправкой письма:")
print(data)
await send_email(data)
await message.answer("Ваша заявка принята! Мы свяжемся с вами в ближайшее время.")
@dp.message(F.text == "Назад")
async def process_back(message: Message):
await message.answer("Выберите услугу:", reply_markup=start_keyboard)
async def delete_webhook():
await bot.delete_webhook()
async def main():
await delete_webhook()
await dp.start_polling(bot)
if __name__ == '__main__':
import asyncio
asyncio.run(main())