Files
janssen/Outlook/download_first_inbox_eml_v1.0.py
T

143 lines
5.2 KiB
Python

"""
=======================================================================
Název: download_first_inbox_eml_v1.0.py
Verze: 1.0
Datum: 2026-06-03
Popis: Pokusný skript: otevře Outlook OWA, přejde do Inboxu, klikne
na první zprávu a stáhne ji jako .eml přes menu
"More email actions" → Download → Download as EML.
Používá persistent profil z outlook_login_v1.0.py.
=======================================================================
"""
from pathlib import Path
from playwright.sync_api import sync_playwright
BASE_DIR = Path(__file__).resolve().parent
PROFILE_DIR = BASE_DIR / "outlook_profile"
OUT_DIR = BASE_DIR / "downloads"
START_URL = "https://outlook.cloud.microsoft/mail/"
def main() -> None:
if not PROFILE_DIR.exists():
print(f" Profil nenalezen: {PROFILE_DIR}")
print(" Nejprve spusť outlook_login_v1.0.py.")
return
OUT_DIR.mkdir(exist_ok=True)
with sync_playwright() as p:
context = p.chromium.launch_persistent_context(
user_data_dir=str(PROFILE_DIR),
headless=False,
no_viewport=True,
accept_downloads=True,
args=[
"--disable-blink-features=AutomationControlled",
"--start-maximized",
],
)
page = context.pages[0] if context.pages else context.new_page()
# 1) Otevřít Outlook
print(" 1/6 Otevírám Outlook...")
page.goto(START_URL)
page.wait_for_load_state("domcontentloaded")
search_selector = (
'[placeholder*="Search"], [aria-label*="Search"], '
'[placeholder*="Hledat"], [aria-label*="Hledat"]'
)
page.wait_for_selector(search_selector, timeout=30_000)
# 2) Inbox / Doručená pošta
print(" 2/6 Otevírám Inbox...")
inbox_candidates = [
'div[role="treeitem"]:has-text("Inbox")',
'div[role="treeitem"]:has-text("Doručená pošta")',
'text=Inbox',
'text=Doručená pošta',
]
for sel in inbox_candidates:
loc = page.locator(sel).first
if loc.count() and loc.is_visible():
loc.click()
break
page.wait_for_selector('div[role="option"]', timeout=15_000)
page.wait_for_timeout(1000)
# 3) První zpráva v inboxu
print(" 3/4 Vybírám první zprávu...")
first_msg = page.locator('div[role="option"]').first
first_msg.click()
page.wait_for_timeout(1000)
# 4) PRAVÝ KLIK na řádek zprávy → kontextové menu patří CELÉ zprávě
# (ne příloze). Na "Download" najet hoverem (otevře submenu), pak
# kliknout na "Download as EML".
print(" 4/4 Pravý klik → Download → Download as EML...")
first_msg.click(button="right")
page.wait_for_timeout(700)
download_parent = None
for name in ("Download", "Stáhnout"):
loc = page.get_by_role("menuitem", name=name).first
if loc.count() and loc.is_visible():
download_parent = loc
break
if download_parent is None:
items = page.get_by_role("menuitem").all()
print(" ! Download položka v menu nenalezena. Obsah menu:")
for it in items:
try:
txt = it.inner_text(timeout=500).strip().replace("\n", " | ")
print(f" - {txt[:100]}")
except Exception:
pass
page.screenshot(path=str(OUT_DIR / "debug_menu.png"))
print(f" screenshot: {OUT_DIR / 'debug_menu.png'}")
input(" Enter pro zavření... ")
context.close()
return
download_parent.hover()
page.wait_for_timeout(600)
eml_item = None
for name in ("Download as EML", "Stáhnout jako EML", "Stáhnout jako .eml"):
loc = page.get_by_role("menuitem", name=name).first
if loc.count() and loc.is_visible():
eml_item = loc
break
try:
if eml_item is not None:
with page.expect_download(timeout=15_000) as download_info:
eml_item.click()
else:
# některé buildy OWA stahují EML přímo bez submenu
with page.expect_download(timeout=15_000) as download_info:
download_parent.click()
download = download_info.value
except Exception as e:
page.screenshot(path=str(OUT_DIR / "debug_menu.png"))
print(f" ! Stažení selhalo: {e}")
print(f" screenshot: {OUT_DIR / 'debug_menu.png'}")
input(" Enter pro zavření... ")
context.close()
return
target = OUT_DIR / (download.suggested_filename or "first_inbox.eml")
download.save_as(str(target))
print(f" Hotovo → {target}")
if not target.name.lower().endswith(".eml"):
print(f" ! POZOR: {target.name} nevypadá jako EML — možná stažena příloha!")
input(" Stiskni Enter pro zavření okna... ")
context.close()
if __name__ == "__main__":
main()