← 返回
未分类 Key 中文

Email Excel Transfer

Automatyzuje workflow pobierania danych z email i wstawiania ich do arkuszy kalkulacyjnych. Użyj gdy użytkownik chce przenieść informacje z poczty do Excela....
自动化从邮件中提取数据并插入电子表格的流程;当用户想把邮件信息转移到Excel时使用。
tomasz-pedzierski-infinity tomasz-pedzierski-infinity 来源
未分类 clawhub v1.0.6 1 版本 100000 Key: 需要
★ 0
Stars
📥 402
下载
💾 0
安装
1
版本
#automation#email#excel#imap#latest#powershell

概述

Email → Excel Transfer

Automatyczny workflow: pobierz dane z załącznika → przetwórz → wypełnij arkusz.

⚠️ Bezpieczeństwo: Domyślnie wszystkie operacje wykonywane są na KOPIACH plików. Oryginalne pliki pozostają nienaruszone.

Wymagania

  • OpenClaw z dostępem do email
  • Microsoft Excel
  • Opcjonalnie: MCP bridge do komunikacji z Windows

Setup / Credentials

1. Hasło aplikacji do email

NIE używaj hasła do konta — stwórz hasło aplikacji (app password).

Jak wygenerować hasło aplikacji:

  • Gmail: https://myaccount.google.com → Bezpieczeństwo → Hasła aplikacji
  • Outlook/Hotmail: https://account.microsoft.com → Zabezpieczenia → Hasła aplikacji
  • WP Poczta: https://poczta.wp.pl → Ustawienia → Hasła aplikacji

2. Ograniczenie dostępu

Hasło aplikacji daje dostęp TYLKO do odczytu poczty — nie może zmienić hasła ani wyłączyć 2FA.

Whitelista nadawców (opcjonalnie):

Dodaj listę dozwolonych adresów email — skill zignoruje wiadomości od innych nadawców:

DOZWOLENI_NADAWCY = ['kontakt@firma.pl', 'biuro@firma.pl']

1. Pobierz wiadomość email

import imaplib, ssl, email, re

# === KONFIGURACJA ===
SERWER = 'imap.example.com'
PORT = 993
EMAIL = 'twoj@email.pl'
HASLO = 'xxxx xxxx xxxx xxxx'  # Hasło aplikacji, NIE zwykłe hasło

# Whitelista nadawców - zostaw puste [] żeby akceptować wszystkich
DOZWOLENI_NADAWCY = []

# Sanityzacja nazwy pliku - usuń wszystko poza bezpiecznymi znakami
def sanityzuj_nazwe(nazwa):
    if not nazwa:
        return None
    # Usuń ścieżki i niebezpieczne znaki
    nazwa = re.sub(r'[/\\]', '', nazwa)  # usuń slashe
    nazwa = re.sub(r'[^\w\s\-.]', '', nazwa)  # tylko bezpieczne znaki
    nazwa = nazwa[:200]  # max 200 znaków
    return nazwa.strip()

# === POBIERANIE WIADOMOŚCI ===
mail = imaplib.IMAP4_SSL(SERWER, PORT, ssl_context=ssl.create_default_context())
mail.login(EMAIL, HASLO)
mail.select('INBOX')

# Szukaj wiadomości (dowolny temat)
_, wiadomosci = mail.search(None, 'ALL')
id_wiadomosci = wiadomosci[0].split()
id_ostatniej = id_wiadomosci[-1]

_, dane = mail.fetch(id_ostatniej, '(RFC822)')
wiadomosc = email.message_from_bytes(dane[0][1])

# Sprawdź nadawcę
nadawca = wiadomosc.get('From', '')
if DOZWOLENI_NADAWCY and not any(n in nadawca for n in DOZWOLENI_NADAWCY):
    print(f"[BLOKADA] Nadawca {nadawca} nie jest na whitelisty")
    mail.logout()
    exit()

# Wyciągnij temat
temat = wiadomosc.get('Subject', '(bez tematu)')
print(f"Pobrano: {temat} od {nadawca}")

2. Wyciągnij załącznik

# Zapisz TYLKO pierwszy pasujący plik
for czesc in wiadomosc.walk():
    if czesc.get_content_disposition() == 'attachment':
        nazwa = czesc.get_filename()
        nazwa = sanityzuj_nazwe(nazwa)  # sanityzacja!
        
        if nazwa and '.xlsx' in nazwa.lower():
            tresc = czesc.get_payload(decode=True)
            if tresc:
                # Zapisz do /tmp z prefixem "copy_"
                sciezka_kopia = f'/tmp/copy_{nazwa}'
                with open(sciezka_kopia, 'wb') as f:
                    f.write(tresc)
                print(f"Zapisano kopię: {sciezka_kopia}")
                break

3. Odczytaj komórki z xlsx

import zipfile, re

def czytaj_xlsx(sciezka):
    with zipfile.ZipFile(sciezka) as z:
        arkusz = z.read('xl/worksheets/sheet1.xml').decode()
        teksty = z.read('xl/sharedStrings.xml').decode()
    
    wartosci = re.findall(r'<t[^>]*>([^<]+)</t>', teksty)
    komorki = re.findall(r'<c r="([A-Z]+\d+)"([^>]*)>(.*?)</c>', arkusz, re.DOTALL)
    
    dane = {}
    for ref, attr, cont in komorki:
        v = re.search(r'<v>([^<]+)</v>', cont)
        if v:
            val = v.group(1)
            if 't="s"' in attr:
                val = wartosci[int(val)]
            dane[ref] = val
    return dane

4. DRY-RUN / PREVIEW — pokaż zmiany przed zapisem

def preview_zmian(sciezka, zmiany):
    """
    Wyświetla planowane zmiany do akceptacji.
    Zmiany to słownik: {(wiersz, kolumna): nowa_wartosc}
    """
    print("\n📋 PLANOWANE ZMIANY:")
    print("-" * 40)
    for komorka, wartosc in zmiany.items():
        print(f"  {komorka} → {wartosc}")
    print("-" * 40)
    print(f"Plik: {sciezka}")
    print("\nPotwierdź przed zapisem: tak/nie")

def dry_run(sciezka, zmiany):
    """Pokazuje zmiany ale NIE zapisuje."""
    preview_zmian(sciezka, zmiany)
    return False  # nie zapisuj

# Przykład użycia:
zmiany = {(6, 5): 2450000, (6, 6): 2380000}
akceptacja = dry_run('/tmp/copy_raport.xlsx', zmiany)
if not akceptacja:
    print("Anulowano — brak zapisu")
    exit()

5. Zapisz dane do Excela (NA KOPII)

Na Windows użyj PowerShell:

# Otwórz PLIK KOPIĘ (nie oryginał!)
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
$wb = $excel.Workbooks.Open("C:\temp\copy_raport.xlsx")  # copy_ prefix!
$ws = $wb.ActiveSheet

# Wstaw dane do komórki
$ws.Cells.Item(6, 5).Value2 = 2450000

# Zapisz i zamknij
$wb.Save()
$wb.Close($false)
$excel.Quit()

Write-Host "Zapisano pomyslnie: C:\temp\copy_raport.xlsx"

Konfiguracja

  1. Hasło aplikacji — wygeneruj w panelu swojego dostawcy email
  2. Whitelista nadawców — dodaj zaufane adresy w kodzie
  3. Tryb dry-run — włączony domyślnie, pokazuje zmiany przed zapisem
  4. MCP bridge — opcjonalny do komunikacji Linux→Windows

Użycie

1. Powiedz "pobierz dane z maila i wstaw do Excela"
2. Agent pobiera wiadomość → wyświetla PLAN ZMIAN (dry-run)
3. Potwierdzasz → agent zapisuje do pliku z prefixem "copy_"
4. Oryginalny plik pozostaje nietknięty

⚠️ Ważne: Wszystkie zmiany zapisywane są do plików z prefixem copy_. Oryginały nigdy nie są modyfikowane.

版本历史

共 1 个版本

  • v1.0.6 当前
    2026-05-07 05:07 安全 安全

安全检测

腾讯云安全 (Keen)

安全,无风险
查看报告

腾讯云安全 (Sanbu)

安全,无风险
查看报告

🔗 相关推荐

Fakturownik

tomasz-pedzierski-infinity
符合波兰法规的专业增值税发票生成器,提供模板、自动计算、编号和PDF导出。
★ 0 📥 325

Urlopnik

tomasz-pedzierski-infinity
智能波兰假期管理助手,计算假期天数,生成PDF申请并规划最佳休假时间
★ 0 📥 359

LeadGenerator

tomasz-pedzierski-infinity
搜索并生成波兰B2B企业列表,按行业、地点和筛选条件,导出联系人数据为CSV、JSON、TXT格式。
★ 0 📥 346