Как правильно подойти к вопросу: получение на сервер вложений яндекс почты по 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" } ]
Нужно решить такую задачу?
Заказать помощь
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Другие ответы (0)
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопросВам также может быть интересно
печатные-платы
Как заставить запускаться программу M3.exe от компании Hanxing AOI в инспекционной машине на Windows 7 Pro?
0 ответов
VPN
Как правильно настроить vless для Android TV?
0 ответов
Pyrogram
Как правильно зарегистрировать юзер бота в Telegram?
0 ответов
linkedin
Из-за чего выкидывает из аккаунта LinkedIn?
0 ответов
