156 lines
5.4 KiB
Python
156 lines
5.4 KiB
Python
"""
|
|
=======================================================================
|
|
Název: forward_last_to_klucho_v1.0.py
|
|
Verze: 1.0
|
|
Datum: 2026-06-03
|
|
Popis: Pokusný skript: v Outlook OWA najde poslední odeslaný e-mail
|
|
na adresu klucho@gastroenterolog.com, otevře Forward, vyplní
|
|
příjemce vladimir.buzalka@buzalka.cz, předmět "Ahoj", na
|
|
první řádek těla "Ahoj" a odešle.
|
|
|
|
Používá persistent profil z outlook_login_v1.0.py.
|
|
headless=False kvůli sledování průběhu.
|
|
=======================================================================
|
|
"""
|
|
|
|
from pathlib import Path
|
|
from playwright.sync_api import sync_playwright
|
|
|
|
BASE_DIR = Path(__file__).resolve().parent
|
|
PROFILE_DIR = BASE_DIR / "outlook_profile"
|
|
START_URL = "https://outlook.cloud.microsoft/mail/"
|
|
|
|
TARGET_RECIPIENT = "klucho@gastroenterolog.com"
|
|
FORWARD_TO = "vladimir.buzalka@buzalka.cz"
|
|
GREETING = "Ahoj"
|
|
|
|
|
|
def main() -> None:
|
|
if not PROFILE_DIR.exists():
|
|
print(f" Profil nenalezen: {PROFILE_DIR}")
|
|
print(" Nejprve spusť outlook_login_v1.0.py.")
|
|
return
|
|
|
|
with sync_playwright() as p:
|
|
context = p.chromium.launch_persistent_context(
|
|
user_data_dir=str(PROFILE_DIR),
|
|
headless=False,
|
|
no_viewport=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/9 Otevírám Outlook...")
|
|
page.goto(START_URL)
|
|
page.wait_for_load_state("domcontentloaded")
|
|
# Search box má proměnlivý placeholder; zkusíme víc variant
|
|
search_selector = (
|
|
'[placeholder*="Search"], [aria-label*="Search"], '
|
|
'[placeholder*="Hledat"], [aria-label*="Hledat"]'
|
|
)
|
|
page.wait_for_selector(search_selector, timeout=30_000)
|
|
|
|
# 2) Přejít do Sent Items / Odeslaná pošta
|
|
print(" 2/9 Otevírám Odeslanou poštu...")
|
|
sent_candidates = [
|
|
'div[role="treeitem"]:has-text("Sent Items")',
|
|
'div[role="treeitem"]:has-text("Odeslaná pošta")',
|
|
'text=Sent Items',
|
|
'text=Odeslaná pošta',
|
|
]
|
|
for sel in sent_candidates:
|
|
loc = page.locator(sel).first
|
|
if loc.count() and loc.is_visible():
|
|
loc.click()
|
|
break
|
|
page.wait_for_timeout(1500)
|
|
|
|
# 3) Vyhledat e-maily na příjemce
|
|
print(f" 3/9 Hledám e-maily na {TARGET_RECIPIENT}...")
|
|
search = page.locator(search_selector).first
|
|
search.click()
|
|
search.fill(f"to:{TARGET_RECIPIENT}")
|
|
search.press("Enter")
|
|
page.wait_for_timeout(2500)
|
|
|
|
# 4) Kliknout na první (nejnovější) výsledek
|
|
print(" 4/9 Otevírám nejnovější výsledek...")
|
|
first_msg = page.locator('div[role="option"]').first
|
|
first_msg.wait_for(state="visible", timeout=15_000)
|
|
first_msg.click()
|
|
page.wait_for_timeout(2000)
|
|
|
|
# 5) Forward
|
|
print(" 5/9 Klikám Forward...")
|
|
forward_candidates = [
|
|
'button[aria-label="Forward"]',
|
|
'button[aria-label="Přeposlat"]',
|
|
'button:has-text("Forward")',
|
|
'button:has-text("Přeposlat")',
|
|
]
|
|
clicked = False
|
|
for sel in forward_candidates:
|
|
btn = page.locator(sel).first
|
|
if btn.count() and btn.is_visible():
|
|
btn.click()
|
|
clicked = True
|
|
break
|
|
if not clicked:
|
|
print(" ! Tlačítko Forward nenalezeno — končím.")
|
|
input(" Stiskni Enter pro zavření... ")
|
|
context.close()
|
|
return
|
|
|
|
# 6) Příjemce
|
|
print(f" 6/9 Vyplňuji příjemce {FORWARD_TO}...")
|
|
to_field = page.locator(
|
|
'[aria-label="To"], [aria-label="Komu"], '
|
|
'[placeholder*="To"], [placeholder*="Komu"]'
|
|
).first
|
|
to_field.wait_for(state="visible", timeout=10_000)
|
|
to_field.click()
|
|
to_field.fill(FORWARD_TO)
|
|
page.keyboard.press("Tab")
|
|
page.wait_for_timeout(500)
|
|
|
|
# 7) Předmět
|
|
print(f" 7/9 Měním předmět na '{GREETING}'...")
|
|
subject = page.locator(
|
|
'[aria-label="Subject"], [aria-label="Předmět"]'
|
|
).first
|
|
subject.click()
|
|
# vybrat vše a přepsat
|
|
page.keyboard.press("Control+A")
|
|
page.keyboard.type(GREETING)
|
|
|
|
# 8) Tělo — "Ahoj" na první řádek
|
|
print(f" 8/9 Vkládám '{GREETING}' na první řádek těla...")
|
|
body = page.locator(
|
|
'[aria-label="Message body"], [aria-label="Tělo zprávy"], '
|
|
'div[role="textbox"][contenteditable="true"]'
|
|
).first
|
|
body.click()
|
|
page.keyboard.press("Control+Home")
|
|
page.keyboard.type(GREETING)
|
|
page.keyboard.press("Enter")
|
|
|
|
# 9) Send — POZOR: skutečně odešle e-mail
|
|
print(" 9/9 Odesílám...")
|
|
send_btn = page.locator(
|
|
'button[aria-label="Send"], button[aria-label="Odeslat"]'
|
|
).first
|
|
send_btn.click()
|
|
page.wait_for_timeout(3000)
|
|
|
|
print(" Hotovo — e-mail odeslán.")
|
|
input(" Stiskni Enter pro zavření okna... ")
|
|
context.close()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|