113 lines
3.0 KiB
Python
113 lines
3.0 KiB
Python
import time
|
|
import win32com.client
|
|
import pandas as pd
|
|
from pathlib import Path
|
|
|
|
OUT_XLSX = Path(r"C:\Temp\GAL_export.xlsx")
|
|
|
|
def safe_get(obj, attr):
|
|
try:
|
|
return getattr(obj, attr)
|
|
except Exception:
|
|
return None
|
|
|
|
outlook = win32com.client.Dispatch("Outlook.Application")
|
|
ns = outlook.GetNamespace("MAPI")
|
|
|
|
gal = ns.GetGlobalAddressList()
|
|
entries = gal.AddressEntries
|
|
|
|
rows = []
|
|
|
|
total = entries.Count
|
|
print(f"Počet položek v GAL: {total}")
|
|
|
|
start = time.perf_counter()
|
|
last = start
|
|
PROGRESS_EVERY = 100 # každých N položek vypsat rychlost
|
|
|
|
for i in range(1, total + 1): # Outlook COM je 1-based
|
|
try:
|
|
entry = entries.Item(i)
|
|
|
|
name = safe_get(entry, "Name")
|
|
address = safe_get(entry, "Address")
|
|
entry_type = safe_get(entry, "AddressEntryUserType")
|
|
|
|
smtp = None
|
|
job_title = None
|
|
department = None
|
|
company = None
|
|
office = None
|
|
phone = None
|
|
mobile = None
|
|
|
|
# Exchange user
|
|
try:
|
|
exch_user = entry.GetExchangeUser()
|
|
except Exception:
|
|
exch_user = None
|
|
|
|
if exch_user:
|
|
smtp = safe_get(exch_user, "PrimarySmtpAddress")
|
|
job_title = safe_get(exch_user, "JobTitle")
|
|
department = safe_get(exch_user, "Department")
|
|
company = safe_get(exch_user, "CompanyName")
|
|
office = safe_get(exch_user, "OfficeLocation")
|
|
phone = safe_get(exch_user, "BusinessTelephoneNumber")
|
|
mobile = safe_get(exch_user, "MobileTelephoneNumber")
|
|
|
|
# Distribution list
|
|
try:
|
|
exch_dl = entry.GetExchangeDistributionList()
|
|
except Exception:
|
|
exch_dl = None
|
|
|
|
if exch_dl and not smtp:
|
|
smtp = safe_get(exch_dl, "PrimarySmtpAddress")
|
|
|
|
rows.append({
|
|
"name": name,
|
|
"smtp": smtp,
|
|
"address": address,
|
|
"entry_type": entry_type,
|
|
"job_title": job_title,
|
|
"department": department,
|
|
"company": company,
|
|
"office": office,
|
|
"phone": phone,
|
|
"mobile": mobile,
|
|
})
|
|
|
|
except Exception as e:
|
|
rows.append({
|
|
"name": None,
|
|
"smtp": None,
|
|
"error": str(e),
|
|
})
|
|
|
|
# průběžný výpis rychlosti
|
|
if i % PROGRESS_EVERY == 0 or i == total:
|
|
now = time.perf_counter()
|
|
elapsed = now - start
|
|
rate = i / elapsed if elapsed else 0
|
|
recent_rate = PROGRESS_EVERY / (now - last) if now > last else 0
|
|
remaining = (total - i) / rate if rate else 0
|
|
print(
|
|
f" {i}/{total} ({i / total:.0%}) | "
|
|
f"{rate:.1f} pol./s (akt. {recent_rate:.1f}) | "
|
|
f"uplynulo {elapsed:.1f}s | zbývá ~{remaining:.0f}s",
|
|
flush=True,
|
|
)
|
|
last = now
|
|
|
|
total_elapsed = time.perf_counter() - start
|
|
print(
|
|
f"Zpracováno {total} položek za {total_elapsed:.1f}s "
|
|
f"({total / total_elapsed:.1f} pol./s)"
|
|
)
|
|
|
|
df = pd.DataFrame(rows)
|
|
df.to_excel(OUT_XLSX, index=False)
|
|
|
|
print(f"Hotovo: {OUT_XLSX}") |