Подскажите пожалуйста, как можно получать вложения из писем с яндекса к себе на сервер? и письма из папки спам и удаленные?
вот в таком виде код находит только во входящих и рассылках письма
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"
}
]