Задать вопрос

Получение на сервер вложений яндекс почты по IMAP?

Подскажите пожалуйста, как можно получать вложения из писем с яндекса к себе на сервер? и письма из папки спам и удаленные?

вот в таком виде код находит только во входящих и рассылках письма

def get_folder_names(mail):
    folders = []
    
    status, data = mail.list()
    if status != 'OK': return []
    
    folder_map = {
        'INBOX': 'Входящие',
        'Sent': 'Отправленные',
        'Sent Items': 'Отправленные', 
        'Отправленные': 'Отправленные',
        'Спам': 'Спам',
        'Junk': 'Спам',
        'Trash': 'Удаленные',
        'Удалённые': 'Удаленные',
        'Корзина': 'Удаленные',
        '[Gmail]/Trash': 'Удаленные',
        'DELETED': 'Удалённые',
        'SPAM': 'Спам'
    }
    
    logger.info(" Ищем папки...")
    for line in data:
        line = line.decode('utf-8')
        logger.info(f"Папка найдена: {line}")
        for imap_name, label in folder_map.items():
            if imap_name.lower() in line.lower():
                folders.append((f'"{imap_name}"', label))
                logger.info(f"✅ [{label}] IMAP: {imap_name}")
                break
    
    if not folders:
        folders = [('"INBOX"', 'Входящие')]
    
    return folders


а так я получаю только название вложения

def extract_attachments(msg) -> List[Dict]:
    attachments = []
    try:
        for part in msg.walk():
            if part.get_content_maintype() == 'multipart': continue
            filename = part.get_filename()
            if not filename: continue
            decoded_filename = decode_mime_words(filename)
            if decoded_filename:
                attachments.append({
                    'name': decoded_filename[:100],
                    'url': f"https://mail.yandex.ru/message_part/{decoded_filename}",
                    'size': len(part.get_payload(decode=True) or b''),
                    'content_type': part.get_content_type() or 'application/octet-stream'
                })
    except:
        pass
    return attachments

def extract_message_data(msg) -> Dict[str, Any]:
    data = {}
    try:
        from_header = msg.get('From', '')
        decoded_from = decode_mime_words(from_header)
        
        name_match = re.match(r'(.+?)\s*[<(]([^<>@()]+@[^<>@()]+)[>)]', decoded_from)
        if name_match:
            data['from_name'] = name_match.group(1).strip()[:50]
            data['from_email'] = name_match.group(2).strip()
        else:
            data['from_email'] = decoded_from.strip()
            data['from_name'] = data['from_email'].split('@')[0][:50] if '@' in data['from_email'] else 'Неизвестный'
        
        data['from_full'] = f"{data['from_name']} <{data['from_email']}>"
        data['avatar'] = get_gravatar(data['from_email'])
        
        text_plain = text_html = None
        for part in msg.walk():
            if part.get_content_maintype() == 'multipart': continue
            payload = part.get_payload(decode=True)
            if payload is None: continue
            charset = part.get_content_charset() or 'utf-8'
            try:
                content = payload.decode(charset, errors='ignore')
            except:
                content = payload.decode('utf-8', errors='ignore')
            ctype = part.get_content_type()
            if ctype == 'text/plain' and not text_plain:
                text_plain = content
            elif ctype == 'text/html' and not text_html:
                text_html = content
        
        data['message'] = clean_text(text_plain or text_html or '(Пустое сообщение)')
        data['subject'] = clean_text(decode_mime_words(msg.get('Subject', '')))
        data['date'] = msg.get('Date', '')
        data['attachments'] = extract_attachments(msg)
    except Exception as e:
        logger.error(f"Парсинг ошибка: {e}")
    
    return data


вот лог к вложениям:

[
    {
        "message": "",
        "flag": true,
        "from": "TEST <test@site.com>",
        "shown": false,
        "avatar": "/5d27610776efc9ef0b1f7a79598e187f.jpg",
        "subject": "sd",
        "from_email": "gartung1996@gmail.com",
        "from_name": "TEST",
        "folder": " Входящие",
        "attachments": [
            {
                "name": "file.wav",
                "url": "https://mail.yandex.ru/message_part/file.wav",
                "size": 24362748,
                "content_type": "audio/wav"
            }
        ],
        "timestamp": "2026-01-04T13:45:08.839121"
    }
]
  • Вопрос задан
  • 188 просмотров
Подписаться 1 Простой 3 комментария
Помогут разобраться в теме Все курсы
  • Нетология
    Python-разработчик: расширенный курс + нейросети
    12 месяцев
    Далее
  • Академия Eduson
    Python-разработчик
    9 месяцев
    Далее
  • Skillbox
    Профессия Python-разработчик + ИИ
    10 месяцев
    Далее
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы