User: сдела йн апитоне код который о задет почту и ждет письма и почту цдает пне в консоль и ссылки из письма тоде Mail.tm API DocumentationMail.tm API Documentation

Temp Mail API
API for creating temporary email accounts

Welcome to the Mail.tm API documentation.

This API allows you to automate the registration process at the various sites which do require email confirmation for testing purposes.

Usage of our API for illegal activity is strictly prohibited.
It is forbidden to sell programs and/or earn from it that exclusively uses our API (for example, creating a competing temp mail client and charging for it's usage is not allowed).
Creating a mirror proxy service that explicitly utilizes our API is not allowed (for example, creating a proxy service under another domain name and then returning the results of the API).
If you are developing an wrapper and/or application that utilizes our API, you are required to explicitly mention that you are using Mail.tm by including a link to our main site as this would appreacited and make our service more popular.
Access to the API
Available completely free of charge and without restriction.

The general quota limit is 8 queries per second (QPS) per IP address.
Keep in mind that no API keys are required to use our service.
How it works
Fetch our domain names.
Create a new account by using our domain names.
Sign up only on sites that you have acquired permission to.
The site sends an email message to the address you specify.
A message comes to our SMTP server, processed and added to the database.
You make a request to the API to fetch the message list.
That's it.
General information
The Mail.tm API specification documentation is written using the OpenAPI Specification v3.

You can download the file here and test it here.

Integrations
Language	Link
.NET	https://github.com/SmorcIRL/mail.tm
Dart	https://pub.dev/packages/mailtm_client
Golang	https://github.com/felixstrobel/mailtm, https://github.com/msuny-c/mailtm
Java	https://github.com/shivam1608/JMailTM
JavaScript	https://github.com/cemalgnlts/Mailjs
PHP	https://github.com/heithemmoumni/mail.tm
Python	https://github.com/CarloDePieri/pymailtm, https://github.com/prtolem/MailTM, https://github.com/RPwnage/MailTMClient
Rust	https://github.com/AwesomeIbex/mail-tm-rs
Swift	https://github.com/devwaseem/MailTMSwift
We would appreciate any legal integrations to make usage of our service, please let us know to be added to the list.

API Documentation
Base url: https://api.mail.tm

Error handling
Successful
Generally, the request is successful when the response code is 200, 201 or 204 (You could also check if the code is between 200 and 204)

Unsuccessful
Usually, when the request has an error the code is between 400 and 430.

Bad request 400: Something in your payload is missing! Or, the payload isn't there at all.

Unauthorized 401: Your token isn't correct (Or the headers hasn't a token at all!). Remember, every request (Except POST /accounts and POST /token) should be authenticated with a Bearer token!

Not found 404: You're trying to access an account that doesn't exist? Or maybe reading a non-existing message? Go check that!

Method not allowed 405: Maybe you're trying to GET a /token or POST a /messages. Check the path you're trying to make a request to and check if the method is the correct one.

I'm a teapot 418: Who knows? Maybe the server becomes a teapot!

Unprocessable entity 422: Some went wrong on your payload. Like, the username of the address while creating the account isn't long enough, or, the account's domain isn't correct. Things like that.

Too many requests 429: You exceeded the limit of 8 requests per second! Try delaying the request by one second!

Authentication
To make any request (Except for account creation and /domains requests) you need to authenticate the request with a bearer token.

How to get it?

You need to make a POST request to the /token path.

Body

Name	Type	Description
address	string	Account's address. Example: user@example.com
password	string	Account's password.
Params

None

Response

{
  "id": "string",
  "token":"string"
}
Use this token as

"Authorization":"Bearer TOKEN"
In every request!

Remember: You should first create the account and then get the token!***
Domain
GET /domains
You have to use this when creating an account, to retrieve the domain. Returns a list of domains

Body

None

Params

Name	Type	Description
page	int	The collection page number
Response

{
  "hydra:member": [
    {
      "@id": "string",
      "@type": "string",
      "@context": "string",
      "id": "string",
      "domain": "string",
      "isActive": true,
      "isPrivate": true,
      "createdAt": "2022-04-01T00:00:00.000Z",
      "updatedAt": "2022-04-01T00:00:00.000Z"
    }
  ],
  "hydra:totalItems": 0,
  "hydra:view": {
    "@id": "string",
    "@type": "string",
    "hydra:first": "string",
    "hydra:last": "string",
    "hydra:previous": "string",
    "hydra:next": "string"
  },
  "hydra:search": {
    "@type": "string",
    "hydra:template": "string",
    "hydra:variableRepresentation": "string",
    "hydra:mapping": [
      {
        "@type": "string",
        "variable": "string",
        "property": "string",
        "required": true
      }
    ]
  }
}
When you create an email, you have to know first which domain to use.

You'll need to retrieve the domain, and then, do like so:

"user@"+domains[0]['domain']
There are up to 30 domains per page, to check the total number, retrieve it from "hydra:totalItems"

GET /domains/{id}
Retrieve a domain by its id (Useful for deleted/private domains)

Body

None

Params

Name	Type	Description
id	string	The domain you want to get with id
Response

{
  "@id": "string",
  "@type": "string",
  "@context": "string",
  "id": "string",
  "domain": "string",
  "isActive": true,
  "isPrivate": true,
  "createdAt": "2022-04-01T00:00:00.000Z",
  "updatedAt": "2022-04-01T00:00:00.000Z"
}

Account
POST /accounts
Creates an Account resource (Registration)

Body

Name	Type	Description
address	string	Account's address. Example: user@example.com
password	string	Account's password.
Params

None

Response

{
  "@context": "string",
  "@id": "string",
  "@type": "string",
  "id": "string",
  "address": "user@example.com",
  "quota": 0,
  "used": 0,
  "isDisabled": true,
  "isDeleted": true,
  "createdAt": "2022-04-01T00:00:00.000Z",
  "updatedAt": "2022-04-01T00:00:00.000Z"
}
At this point, you could now get the token and do all the cool stuff you want to do.

GET /accounts/{id}
Get an Account resource by its id (Obviously, the Bearer token needs to be the one of the account you are trying to retrieve)

Body

None

Params

Name	Type	Description
id	string	The message you want to gets id
Response

{
  "@context": "string",
  "@id": "string",
  "@type": "string",
  "id": "string",
  "address": "user@example.com",
  "quota": 0,
  "used": 0,
  "isDisabled": true,
  "isDeleted": true,
  "createdAt": "2022-04-01T00:00:00.000Z",
  "updatedAt": "2022-04-01T00:00:00.000Z"
}
Can we improve this? Yes No

DELETE /accounts/{id}
Deletes the Account resource.
Be careful! We can't restore your account, if you use this method, bye bye dear account :c

Body

None

Params

Name	Type	Description
id	string	The account you want to delete by id
Response

None (Returns status code 204 if successful.)

Can we improve this? Yes No

GET /me
Returns the Account resource that matches the Bearer token that sent the request.

Body

None

Params

None

Response

{
  "@context": "string",
  "@id": "string",
  "@type": "string",
  "id": "string",
  "address": "user@example.com",
  "quota": 0,
  "used": 0,
  "isDisabled": true,
  "isDeleted": true,
  "createdAt": "2022-04-01T00:00:00.000Z",
  "updatedAt": "2022-04-01T00:00:00.000Z"
}
Messages
GET /messages
Gets all the Message resources of a given page.

Body

None

Params

Name	Type	Description
page	int	The collection page number
Response

{
  "hydra:member": [
    {
      "@id": "string",
      "@type": "string",
      "@context": "string",
      "id": "string",
      "accountId": "string",
      "msgid": "string",
      "from": {
          "name": "string",
          "address": "string"
      },
      "to": [
        {
            "name": "string",
            "address": "string"
        }
      ],
      "subject": "string",
      "intro": "string",
      "seen": true,
      "isDeleted": true,
      "hasAttachments": true,
      "size": 0,
      "downloadUrl": "string",
      "createdAt": "2022-04-01T00:00:00.000Z",
      "updatedAt": "2022-04-01T00:00:00.000Z"
    }
  ],
  "hydra:totalItems": 0,
  "hydra:view": {
    "@id": "string",
    "@type": "string",
    "hydra:first": "string",
    "hydra:last": "string",
    "hydra:previous": "string",
    "hydra:next": "string"
  },
  "hydra:search": {
    "@type": "string",
    "hydra:template": "string",
    "hydra:variableRepresentation": "string",
    "hydra:mapping": [
      {
        "@type": "string",
        "variable": "string",
        "property": "string",
        "required": true
      }
    ]
  }
}
There are up to 30 messages per page, to check the total number, retrieve it from "hydra:totalItems"

GET /messages/{id}
Retrieves a Message resource with a specific id (It has way more information than a message retrieved with GET /messages but it hasn't the "intro" member)

Body

None

Params

Name	Type	Description
id	string	The message you want to get by id
Response

{
  "@context": "string",
  "@id": "string",
  "@type": "string",
  "id": "string",
  "accountId": "string",
  "msgid": "string",
    "from": {
        "name": "string",
      "address": "string"
  },
  "to": [
        {
            "name": "string",
            "address": "string"
        }
    ],
  "cc": [
    "string"
  ],
  "bcc": [
    "string"
  ],
  "subject": "string",
  "seen": true,
  "flagged": true,
  "isDeleted": true,
  "verifications": [
    "string"
  ],
  "retention": true,
  "retentionDate": "2022-04-01T00:00:00.000Z",
  "text": "string",
  "html": [
    "string"
  ],
  "hasAttachments": true,
  "attachments": [
    {
      "id": "string",
      "filename": "string",
      "contentType": "string",
      "disposition": "string",
      "transferEncoding": "string",
      "related": true,
      "size": 0,
      "downloadUrl": "string"
    }
  ],
  "size": 0,
  "downloadUrl": "string",
  "createdAt": "2022-04-01T00:00:00.000Z",
  "updatedAt": "2022-04-01T00:00:00.000Z"
}
DELETE /messages/{id}
Deletes the Message resource.

Body

None

Params

Name	Type	Description
id	string	The message you want to delete's id
Response

None (Returns status code 204 if successful.)

PATCH /messages/{id}
Marks a Message resource as read!

Body

None

Params

Name	Type	Description
id	string	The message you want to read's id
Response

{
  "seen": true
}
To check if the message has been read, you could also check if the status code is 200!

GET /sources/{id}
Gets a Message's Source resource (If you don't know what this is, you either don't really want to use it or you should read this!)

Body

None

Params

Name	Type	Description
id	string	The source you want to get by id
Response

{
  "@context": "string",
  "@id": "string",
  "@type": "string",
  "id": "string",
  "downloadUrl": "string",
  "data": "string"
}
You don't really need the downloadUrl if you already have the "data" String. It will simply download that data.

Attachments
Message's attachments need to be handled in a certain way. When you download them, be sure to download them in the right encoding (For example, a .exe file will need to be downloaded as an array of integers, but a json will need to be downloaded as String! Also, remember: API are friends. contentType member can help you know how to decode the file)

Webhooks
You might be interested in Webhooks to receive notifications when a new message is received. However, we don't utilize them in this project.

Instead, we're using the Mercure to send SSE events.

Listen to messages
To listen to messages you'll need a different base url.

Base url: https://mercure.mail.tm/.well-known/mercure
Topic: /accounts/{id}
Remember! You must use the `Bearer TOKEN` authorization in the headers!
For each listened message, there will be an Account event. That Account is the Account resource that received the message, with updated "used" property.

Questions and suggestions
If you have any questions or suggestions, please contact us via email <PRESIDIO_ANONYMIZED_EMAIL_ADDRESS>.

Tech stack
Our stack includes API-Platform, Mercure, Nuxt.js, Haraka, Caddy, MongoDB, Node.js, CentOS

Edit this page on GitHub
Updated at Tue, Sep 17, 2024
On this page
Access to the API
How it works
General information
Integrations
API Documentation
Error handling
Successful
Unsuccessful
Authentication
Domain
GET /domains
GET /domains/{id}
Account
POST /accounts
GET /accounts/{id}
DELETE /accounts/{id}
GET /me
Messages
GET /messages
GET /messages/{id}
DELETE /messages/{id}
PATCH /messages/{id}
GET /sources/{id}
Attachments
Webhooks
Listen to messages
Questions and suggestions
Tech stack

Написать
Cоставить
Ответить
Войти
Регистрация
Музыка
Видео
Сообщества
Мини-приложения
Игры
Приложение на телефон
Применяются рекомендательные технологии

Купи дешево. Компьютерные и прочие железки
вернуться к странице
Записи сообщества
Все записи
Поиск записей
Запись на стене

Максим Татарский
19 мар 2023
·
в Купи дешево. Компьютерные и прочие железки
Стал счастливым обладателем rx 6650 xt msi gaming x. Карта покупалась новой. При использовании столкнулся с тем что карта греется до 71° и вертушки работают на 50% (около 2000 об/мин.), Что несколько отличается от тестов на Ютубе. Корпус у меня закрытый versa h17, но все равно температуры несколько огорчают, хотелось видеть в районе 65 при оборотах до 1500. Решил сделать андервольт, и столкнулся с проблемой, что при стоковых частотах напряжение можно понизить только до 1150 мV, если ниже начинаются краши. При этом частота в стоке 2765. Вопрос: насколько можно понизить частоту, чтоб несильно потерять в производительности? Опасно ли для видеокарты понижение напряжения и частоты?

6
Нравится

Показать список поделившихся

Игорь Никулин
Амд изменила способ изменения температуры, по сравнению с картами на поколение ниже прибавляй 10 градусов
Показать список оценивших
19 мар 2023Поделиться

Максим Татарский·Автор
Игорь, пруфы есть? Как можно изменить способ измерения температуры?
1
Показать список оценивших
19 мар 2023Поделиться

Игорь Никулин ответил Максиму
Максим, раньше считала по датчику в хотпоинте, сейчас датчики в нескольких разных местах которые в основном греются и выводится максимум из этого
Показать список оценивших
19 мар 2023Поделиться

Данила Андреевич  ответил Игорю
Игорь, хотпоинт Аристон? Казалось бы, причем тут стиральная машина
1
Показать список оценивших
19 мар 2023Поделиться

Семён Якимов  ответил Даниле
Данила, хот-спот
1
Показать список оценивших
19 мар 2023Поделиться

Данила Андреевич  ответил Семёну
Семён, ну это я понял, а ты сарказма не понял
Показать список оценивших
19 мар 2023Поделиться

Семён Якимов  ответил Даниле
Данила, мне не за 30+ чтоб так шутить или выкупать такие шутки
Показать список оценивших
19 мар 2023Поделиться

Алексей Галямин
Лучше отнеси в ДНС и купи сапфир на 8 гигов мсай по охладу не очень.......и сапфир на 8 единственная на 8 6500 которая не упрется в память при случае чего а это значит что будет меньше обмен по шине и больше фпс в играх........8 гиговка по уровню производительности дотягивает до 1660 в играх......карту незаслуженно захейтили в инете но она раскрывается только на 8 гигах...разница в фпс там просто гиганская у 4 и 8 гиговой версии даже на PCI 3.0 тогда как 3 и 4 версии не особо влияют
Формат:
Эссе
Paragraph
Электронная почта
Idea
Blog Post
Контур
Marketing Ads
Comment
Message
Twitter
Tone:
🙂 Formal
😉 Повседневный
🧐 Professional
🤩 Enthusiastic
🤓 Informational
😄 Funny
Длина:
Short
Medium
Длинный
Язык:
Русский
Отправить (enter)
Оставьте отзыв и получите кредит ❤
Чат
Спросить
Поиск
Написать
Изображение
ChatPDF
Видение
Полная страница
Приглашай и Зарабатывай
Assistant: Конечно! Ниже представлен пример Python-кода, который использует API Mail.tm для создания временного email-адреса, ожидает получения писем и выводит их содержимое вместе со ссылками в консоль.

### Установка необходимых библиотек

Для работы этого скрипта потребуются библиотеки `requests` и `beautifulsoup4`. Установите их с помощью `pip`, если они у вас ещё не установлены:

```bash
pip install requests beautifulsoup4
```

### Полный код

```python
import requests
import time
import re
from bs4 import BeautifulSoup

API_BASE_URL = "https://api.mail.tm"

def get_domains():
    response = requests.get(f"{API_BASE_URL}/domains")
    response.raise_for_status()
    data = response.json()
    domains = [domain['domain'] for domain in data['hydra:member']]
    return domains

def create_account(address, password):
    payload = {
        "address": address,
        "password": password
    }
    response = requests.post(f"{API_BASE_URL}/accounts", json=payload)
    response.raise_for_status()
    return response.json()

def get_token(address, password):
    payload = {
        "address": address,
        "password": password
    }
    response = requests.post(f"{API_BASE_URL}/token", json=payload)
    response.raise_for_status()
    return response.json()['token']

def get_messages(token, page=1):
    headers = {
        "Authorization": f"Bearer {token}"
    }
    params = {
        "page": page
    }
    response = requests.get(f"{API_BASE_URL}/messages", headers=headers, params=params)
    response.raise_for_status()
    return response.json()

def get_message_content(token, message_id):
    headers = {
        "Authorization": f"Bearer {token}"
    }
    response = requests.get(f"{API_BASE_URL}/messages/{message_id}", headers=headers)
    response.raise_for_status()
    return response.json()

def extract_links(text):
    # Используем BeautifulSoup для извлечения ссылок из HTML
    soup = BeautifulSoup(text, "html.parser")
    links = [a.get('href') for a in soup.find_all('a', href=True)]
    # Также можно извлечь ссылки из простого текста с помощью регулярных выражений
    regex = r'(https?://\S+)'
    links += re.findall(regex, text)
    return links

def main():
    try:
        domains = get_domains()
        if not domains:
            print("Не удалось получить домены.")
            return

        # Создаём уникальный адрес (можно улучшить генерацию)
        address = f"user{int(time.time())}@{domains[0]}"
        password = "StrongPassword123!"

        print(f"Создаём аккаунт: {address}")

        create_account(address, password)
        print("Аккаунт создан.")

        token = get_token(address, password)
        print("Токен получен. Ожидание писем...")

        seen_message_ids = set()

        while True:
            messages_data = get_messages(token)
            messages = messages_data.get('hydra:member', [])

            for message in messages:
                msg_id = message['id']
                if msg_id not in seen_message_ids:
                    seen_message_ids.add(msg_id)
                    content = get_message_content(token, msg_id)
                    subject = content.get('subject', '(Без темы)')
                    from_addr = content.get('from', {}).get('address', '(Без отправителя)')
                    text = content.get('text', '')
                    html = ''.join(content.get('html', []))

                    print(f"\nПолучено новое письмо:")
                    print(f"От: {from_addr}")
                    print(f"Тема: {subject}")
                    print("Содержимое (текст):")
                    print(text)
                    print("Содержимое (HTML):")
                    print(html)

                    combined_content = text + html
                    links = extract_links(combined_content)
                    if links:
                        print("Найденные ссылки:")
                        for link in links:
                            print(link)
                    else:
                        print("Ссылок не найдено.")

            time.sleep(10)  # Ждём 10 секунд перед следующей проверкой

    except requests.HTTPError as http_err:
        print(f"HTTP ошибка произошла: {http_err}")
    except Exception as err:
        print(f"Произошла ошибка: {err}")

if __name__ == "__main__":
    main()
```

### Пояснение кода

1. **Получение доменов**: Сначала скрипт запрашивает доступные домены с помощью `GET /domains`.

2. **Создание аккаунта**: Используя выбранный домен, создаётся уникальный email-адрес. В примере используется текущее время для генерации уникального имени пользователя.

3. **Получение токена**: После создания аккаунта необходимо получить токен для аутентификации последующих запросов с помощью `POST /token`.

4. **Прослушивание входящих сообщений**: Скрипт периодически (каждые 10 секунд) проверяет наличие новых писем с помощью `GET /messages`. Если новое письмо обнаружено, оно выводится в консоль вместе с извлечёнными ссылками.

5. **Извлечение ссылок**: Используется библиотека `BeautifulSoup` для парсинга HTML-содержимого письма и извлечения ссылок. Также применён регулярное выражение для поиска ссылок в простом тексте.

### Запуск скрипта

1. Убедитесь, что у вас установлены все необходимые библиотеки:
   ```bash
   pip install requests beautifulsoup4
   ```

2. Сохраните код в файл, например, `mailtm_listener.py`.

3. Запустите скрипт:
   ```bash
   python mailtm_listener.py
   ```

### Примечания

- **Безопасность пароля**: Для демонстрационных целей пароль задаётся как `StrongPassword123!`. В реальных приложениях рекомендуется использовать более надёжные методы генерации и хранения паролей.

- **Обработка ошибок**: В коде предусмотрена базовая обработка HTTP-ошибок и других исключений. При необходимости можно расширить её для более детальной диагностики.

- **Улучшения**:
  - Добавить более изящную генерацию уникального адреса.
  - Реализовать возможность прекращения ожидания по команде пользователя.
  - Обрабатывать вложения в письмах, если это необходимо.

Этот скрипт должен предоставить базовую функциональность для взаимодействия с API Mail.tm, ожидания писем и извлечения ссылок из них. Вы можете адаптировать и расширять его в соответствии с вашими требованиями.
User: не выдает почтуPS C:\Users\Вадим> & C:/Users/Вадим/AppData/Local/Programs/Python/Python312/python.exe c:/Users/Вадим/Desktop/mine.py
Assistant: Извините за трудности, с которыми вы столкнулись. Давайте попробуем разобраться, почему скрипт не выводит ожидаемую почту. Ниже приведены шаги для отладки и возможные решения.

### 1. Проверка наличия ошибок

Первым шагом необходимо убедиться, что скрипт не выдает никаких ошибок. Для этого вы можете добавить отладочные выводы и гарантировать, что все исключения обрабатываются корректно.

**Обновленный код с дополнительными отладочными сообщениями:**

```python
import requests
import time
import re
from bs4 import BeautifulSoup

API_BASE_URL = "https://api.mail.tm"

def get_domains():
    print("Запрашиваем домены...")
    response = requests.get(f"{API_BASE_URL}/domains")
    try:
        response.raise_for_status()
        data = response.json()
        domains = [domain['domain'] for domain in data['hydra:member']]
        print(f"Доступные домены: {domains}")
        return domains
    except requests.HTTPError as http_err:
        print(f"Ошибка HTTP при получении доменов: {http_err}")
        return []
    except Exception as err:
        print(f"Произошла ошибка при получении доменов: {err}")
        return []

def create_account(address, password):
    print(f"Создаём аккаунт: {address}")
    payload = {
        "address": address,
        "password": password
    }
    response = requests.post(f"{API_BASE_URL}/accounts", json=payload)
    try:
        response.raise_for_status()
        account = response.json()
        print("Аккаунт успешно создан.")
        print(account)
        return account
    except requests.HTTPError as http_err:
        print(f"Ошибка HTTP при создании аккаунта: {http_err}")
        print(f"Ответ сервера: {response.text}")
        return None
    except Exception as err:
        print(f"Произошла ошибка при создании аккаунта: {err}")
        return None

def get_token(address, password):
    print("Получаем токен...")
    payload = {
        "address": address,
        "password": password
    }
    response = requests.post(f"{API_BASE_URL}/token", json=payload)
    try:
        response.raise_for_status()
        token = response.json()['token']
        print("Токен успешно получен.")
        return token
    except requests.HTTPError as http_err:
        print(f"Ошибка HTTP при получении токена: {http_err}")
        print(f"Ответ сервера: {response.text}")
        return None
    except Exception as err:
        print(f"Произошла ошибка при получении токена: {err}")
        return None

def get_messages(token, page=1):
    headers = {
        "Authorization": f"Bearer {token}"
    }
    params = {
        "page": page
    }
    response = requests.get(f"{API_BASE_URL}/messages", headers=headers, params=params)
    try:
        response.raise_for_status()
        return response.json()
    except requests.HTTPError as http_err:
        print(f"Ошибка HTTP при получении сообщений: {http_err}")
        print(f"Ответ сервера: {response.text}")
        return {}
    except Exception as err:
        print(f"Произошла ошибка при получении сообщений: {err}")
        return {}

def get_message_content(token, message_id):
    headers = {
        "Authorization": f"Bearer {token}"
    }
    response = requests.get(f"{API_BASE_URL}/messages/{message_id}", headers=headers)
    try:
        response.raise_for_status()
        return response.json()
    except requests.HTTPError as http_err:
        print(f"Ошибка HTTP при получении содержимого сообщения: {http_err}")
        print(f"Ответ сервера: {response.text}")
        return {}
    except Exception as err:
        print(f"Произошла ошибка при получении содержимого сообщения: {err}")
        return {}

def extract_links(text):
    # Используем BeautifulSoup для извлечения ссылок из HTML
    soup = BeautifulSoup(text, "html.parser")
    links = [a.get('href') for a in soup.find_all('a', href=True)]
    # Также можно извлечь ссылки из простого текста с помощью регулярных выражений
    regex = r'(https?://\S+)'
    links += re.findall(regex, text)
    return links

def main():
    try:
        domains = get_domains()
        if not domains:
            print("Не удалось получить домены. Завершаем работу.")
            return

        # Создаём уникальный адрес (можно улучшить генерацию)
        address = f"user{int(time.time())}@{domains[0]}"
        password = "StrongPassword123!"

        account = create_account(address, password)
        if not account:
            print("Не удалось создать аккаунт. Завершаем работу.")
            return

        token = get_token(address, password)
        if not token:
            print("Не удалось получить токен. Завершаем работу.")
            return

        print(f"Создан временный email: {address}")
        print("Ожидание писем...")

        seen_message_ids = set()

        while True:
            messages_data = get_messages(token)
            messages = messages_data.get('hydra:member', [])

            for message in messages:
                msg_id = message['id']
                if msg_id not in seen_message_ids:
                    seen_message_ids.add(msg_id)
                    content = get_message_content(token, msg_id)
                    if not content:
                        continue
                    subject = content.get('subject', '(Без темы)')
                    from_addr = content.get('from', {}).get('address', '(Без отправителя)')
                    text = content.get('text', '')
                    html = ''.join(content.get('html', []))

                    print(f"\nПолучено новое письмо:")
                    print(f"От: {from_addr}")
                    print(f"Тема: {subject}")
                    print("Содержимое (текст):")
                    print(text)
                    print("Содержимое (HTML):")
                    print(html)

                    combined_content = text + html
                    links = extract_links(combined_content)
                    if links:
                        print("Найденные ссылки:")
                        for link in links:
                            print(link)
                    else:
                        print("Ссылок не найдено.")

            time.sleep(10)  # Ждём 10 секунд перед следующей проверкой

    except Exception as err:
        print(f"Произошла непредвиденная ошибка: {err}")

if __name__ == "__main__":
    main()
```

### 2. Шаги для отладки

1. **Запустите скрипт и внимательно просмотрите вывод в консоли.** Дополнительные сообщения помогут понять, на каком этапе происходит сбой.

2. **Проверьте доступные домены.** Возможно, API не возвращает домены, и скрипт не может создать аккаунт. Убедитесь, что запрос к `/domains` успешен и возвращает список доменов.

3. **Проверьте создание аккаунта.** Убедитесь, что аккаунт успешно создается. Если возникла ошибка при создании, проверьте, нет ли конфликтов, например, адрес уже существует.

4. **Проверьте получение токена.** Если токен не получается, убедитесь, что адрес и пароль указаны правильно.

5. **Проверьте доступ к сообщениям.** Возможно, сообщения просто не приходят. Попробуйте отправить письмо на временный адрес вручную и посмотрите, появляется ли оно в консоли.

### 3. Возможные причины и решения

- **Нет доступных доменов:** Если API не возвращает домены, возможно, сервис временно недоступен или изменил схему. Проверьте актуальность API и обновите `API_BASE_URL` при необходимости.

- **Аккаунт не создается:** Убедитесь, что генерируемый адрес уникален. Если вы запустили скрипт несколько раз за секунду, возможно, адрес не уникален. Можно улучшить генерацию имени пользователя, добавив, например, более случайные числа или символы.

- **Токен не получается:** Убедитесь, что используете правильные адрес и пароль. Также проверьте, нет ли ограничений на количество запросов.

- **Сообщений нет:** Временный email может не получать писем, если никто его не отправляет. Попробуйте отправить тестовое письмо на созданный адрес и дождаться его получения.

### 4. Дополнительные рекомендации

- **Увеличьте интервал ожидания:** Иногда новые письма могут приходить с задержкой. Попробуйте увеличить `time.sleep(10)` до, например, 20 секунд.

- **Логирование:** Для лучшей отладки рекомендуется использовать модуль `logging` вместо `print`, что позволит более гибко управлять выводом сообщений.

- **Обработка ошибок:** Улучшите обработку различных типов ошибок, чтобы скрипт мог корректно реагировать на разные сбои.

### 5. Пример отправки тестового письма

Чтобы убедиться, что ваш временный email работает, вы можете отправить тестовое письмо самостоятельно. Используйте любой другой email-клиент или сервис для отправки письма на ваш временный адрес. После отправки подождите немного и проверьте вывод скрипта.

### 6. Проверка состояния API

Иногда сервисы могут временно быть недоступны или изменять свои API. Рекомендуется проверить [официальную документацию API Mail.tm](https://api.mail.tm) и убедиться, что все эндпоинты и их параметры актуальны.

Если после выполнения всех рекомендаций проблема сохраняется, пожалуйста, предоставьте дополнительную информацию:

- Какие сообщения выводятся в консоли при запуске скрипта.
- Были ли замечены какие-либо ошибки.
- Был ли успешно создан аккаунт (см. вывод `create_account`).
- Получен ли токен (см. вывод `get_token`).

Это поможет более точно определить причину проблемы и предложить соответствующее решение.
User: PS C:\Users\Вадим> & C:/Users/Вадим/AppData/Local/Programs/Python/Python312/python.exe c:/Users/Вадим/Desktop/mine.py
Произошла ошибка: HTTPSConnectionPool(host='api.mail.tm', port=443): Max retries exceeded with url: /domains (Caused by ConnectTimeoutError(<urllib3.connection.HTTPSConnection object at 0x00000235BEEDA9F0>, 'Connection to api.mail.tm timed out. (connect timeout=None)'))
PS C:\Users\Вадим>