Помогите пожалуйста с ботом

Сразу скажу, я ни разу не программист. В этом коде возникает ошибка: '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
→ Ссылка