Помогите пожалуйста с ботом
Сразу скажу, я ни разу не программист. В этом коде возникает ошибка: 'missing 1 required positional argument:'
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
from aiosmtplib import SMTP
import asyncio
import aiohttp
import io
EMAIL = '[email protected]'
PWD = 'password'
async def send_mail(subject, to, msg, url):
message = MIMEMultipart()
message["From"] = EMAIL
message["To"] = to
message["Subject"] = subject
message.attach(MIMEText(f"<html><body>{msg}</body></html>", "html", "utf-8"))
if url:
async with aiohttp.ClientSession() as session:
async with session.get(url) as responce:
buffer = io.BytesIO(await responce.read())
part = MIMEApplication(buffer.read(), Name=url.split('/')[-1])
part['Content-Disposition'] = f'attachment; filename={url.split("/")[-1]}'
message.attach(part)
smtp_client = SMTP(hostname="smtp.yandex.ru", port=465, use_tls=True)
async with smtp_client:
await smtp_client.login(EMAIL, PWD)
await smtp_client.send_message(message)
if __name__ == '__main__':
asyncio.run(send_mail('Тема письма', '[email protected]', '<h1>Привет</h1>'))```
Ответы (1 шт):
Автор решения: mrgervant
→ Ссылка
У Вас в функции async def send_mail(subject, to, msg, url)
обязательным аргументом является url
. При этом, при вызове функции в asyncio.run передается 3 аргумента, а не 4 аргумента.
Либо передайте в функцию корректный аргумент url, либо сделайте его необязательным, прописав значение по умолчанию (False или URL-адрес по умолчанию):
async def send_mail(subject, to, msg, url=False)
async def send_mail(subject, to, msg, url='https://ru.stackoverflow.com/')
Дополнительно:
Перенесите message.attach(part)
внутрь блока if, чтобы не возникало ошибки при попытке найти переменную part
, в случае, когда url=False
:
if url:
async with aiohttp.ClientSession() as session:
async with session.get(url) as responce:
buffer = io.BytesIO(await responce.read())
part = MIMEApplication(buffer.read(), Name=url.split('/')[-1])
part['Content-Disposition'] = f'attachment; filename={url.split("/")[-1]}'
message.attach(part)
Сверху допишите недостающий импорт MIMEMultipart, т.к. Вы его используете:
from email.mime.multipart import MIMEMultipart